﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Thinking in zmllegtui.-随笔分类-Java Tech</title><link>http://www.cppblog.com/zmllegtui/category/8635.html</link><description>Stuff in my mind.</description><language>zh-cn</language><lastBuildDate>Sun, 26 Oct 2008 09:05:24 GMT</lastBuildDate><pubDate>Sun, 26 Oct 2008 09:05:24 GMT</pubDate><ttl>60</ttl><item><title>面试或笔试题目要点（Java）</title><link>http://www.cppblog.com/zmllegtui/archive/2008/10/26/65081.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Sun, 26 Oct 2008 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2008/10/26/65081.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/65081.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2008/10/26/65081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/65081.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/65081.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.Java有那些基本数据类型，String是不是基本数据类型，他们有何区别。字符型,数值型,布尔型<br>2.字符串的操作：<br>写一个方法，实现字符串的反转，如：输入abc，输出cba<br>写一个方法，实现字符串的替换，如：输入bbbwlirbbb，输出bbbhhtccc。<br>……<br><br>&nbsp;&nbsp;<a href='http://www.cppblog.com/zmllegtui/archive/2008/10/26/65081.html'>阅读全文</a><img src ="http://www.cppblog.com/zmllegtui/aggbug/65081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2008-10-26 13:36 <a href="http://www.cppblog.com/zmllegtui/archive/2008/10/26/65081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>== 与 equals 的区别（Java）</title><link>http://www.cppblog.com/zmllegtui/archive/2008/10/26/65077.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Sun, 26 Oct 2008 04:59:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2008/10/26/65077.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/65077.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2008/10/26/65077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/65077.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/65077.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在比较字符型数据时，==比较的是内存中的地址,比较的是对象的句柄；而equals()比较的是地址内的内容,比较的是对象。由于JAVA中除基本数据类型外其它一切都是对象，而对象变量存储的都是引用，相当于C中的指针，所以在比较对象时如String，用==是比较两个变量是否指向同一个对象，而用equals才是比较两个String的内容是否相等。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;==绝对比equals快。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;==是java内置的，可以理解为"相同"。对于简单类型来说，a=3，b=3，我们可以说a和b相同，也可以说a和b相等，都没什么问题。.equals()是Object的方法，可以理解为"相等"。显然两个object相等并不意味着相同；但是需要注意的是，也并不意味着他们对应内存区域的所有字节都相等，比如（但不限于这个原因）他们内部可能还有自己的引用。<font style="COLOR: red" color=#006600>所以，两个对象是否相等，只有这个对象自己才知道如何判断</font>，java并不知道。所以就需要类自己提供一个equals方法。下面举例说明：<br><br>题目：<br>&nbsp;<wbr> Integer&nbsp;<wbr>&nbsp;<wbr> i&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Integer(42)&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr> Long&nbsp;<wbr>&nbsp;<wbr> l&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Long(42)&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr> Double&nbsp;<wbr>&nbsp;<wbr> d&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Double(42.0)&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr> 下面哪些返回true&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr> 1:&nbsp;<wbr>&nbsp;<wbr> i==l&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr> 2:&nbsp;<wbr>&nbsp;<wbr> i==d&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr> 3:&nbsp;<wbr>&nbsp;<wbr> l==d&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr> 4:&nbsp;&nbsp; i.equals(l)&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr> 5:&nbsp;&nbsp;&nbsp;i.equals(d)&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr> 6:&nbsp;&nbsp;&nbsp;l.equals(d)&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr> 7:&nbsp;&nbsp;&nbsp;i.equals(42)&nbsp;<wbr>&nbsp;<br>答案：7；<br><br>编码验证：<br><wbr>public&nbsp;<wbr>&nbsp;<wbr> class&nbsp;<wbr>&nbsp;<wbr> Equivalence&nbsp;<wbr>&nbsp;<wbr> {&nbsp;<wbr>&nbsp;&nbsp;&nbsp;<wbr><br><wbr>&nbsp;&nbsp;&nbsp;public&nbsp;<wbr>&nbsp;<wbr> static&nbsp;<wbr>&nbsp;<wbr> void&nbsp;<wbr>&nbsp;<wbr> main(String[]&nbsp;<wbr>&nbsp;<wbr> args)&nbsp;<wbr>&nbsp;<wbr> {&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;<wbr>&nbsp;<wbr> i&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Integer(42)&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; Long&nbsp;<wbr>&nbsp;<wbr> l&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Long(42)&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp; &nbsp;Double&nbsp;<wbr>&nbsp;<wbr> d&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Double(42.0)&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(i==l);&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(i==d);<br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(l==d);&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(i.equals(l) );&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(i.equals(d) );<br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(l.equals(d) );&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(i.equals(42));<br>&nbsp;<wbr> }&nbsp;<wbr>&nbsp;<wbr><br>}&nbsp;<br><br>运行结果：<br>1-3：编译不通过；<br>4-6：false<br>7:true<br><br>原理解释：<br>1.&nbsp;<wbr>&nbsp;<wbr> 检查对象是否相等<br><wbr>关系运算符==和!=也适用于所有对象，但它们的含义通常会使初涉Java领域的人找不到北。下面是一个例子：<br>//:&nbsp;<wbr>&nbsp;<wbr> Equivalence.java&nbsp;<wbr>&nbsp;<wbr><br>public&nbsp;<wbr>&nbsp;<wbr> class&nbsp;<wbr>&nbsp;<wbr> Equivalence&nbsp;<wbr>&nbsp;<wbr> {&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;public&nbsp;<wbr>&nbsp;<wbr> static&nbsp;<wbr>&nbsp;<wbr> void&nbsp;<wbr>&nbsp;<wbr> main(String[]&nbsp;<wbr>&nbsp;<wbr> args)&nbsp;<wbr>&nbsp;<wbr> {&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;<wbr>&nbsp;<wbr> n1&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Integer(47);&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; Integer&nbsp;<wbr>&nbsp;<wbr> n2&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Integer(47);&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(n1&nbsp;<wbr>&nbsp;<wbr> ==&nbsp;<wbr>&nbsp;<wbr> n2);&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(n1&nbsp;<wbr>&nbsp;<wbr> !=&nbsp;<wbr>&nbsp;<wbr> n2);&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;}&nbsp;<wbr>&nbsp;<wbr><br>}&nbsp;<wbr>&nbsp;<wbr> ///:~<wbr><br><wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中，表达式System.out.println(n1&nbsp;<wbr>==&nbsp;<wbr>n2)可打印出内部的布尔比较结果。一般人都会认为输出结果肯定先是true，再是false，因为两个Integer对象都是相同的。但尽管对象的内容相同，句柄却是不同的，而==和!=比较的正好就是对象句柄。所以输出结果实际上先是false，再是true。这自然会使第一次接触的人感到惊奇。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;若想对比两个对象的实际内容是否相同，又该如何操作呢？此时，必须使用所有对象都适用的特殊方法equals()。但这个方法不适用于&#8220;主类型&#8221;，那些类型直接使用==和!=即可。下面举例说明如何使用：<br>//:&nbsp;<wbr>&nbsp;<wbr> EqualsMethod.java&nbsp;<br><wbr>public&nbsp;<wbr>&nbsp;<wbr> class&nbsp;<wbr>&nbsp;<wbr> EqualsMethod&nbsp;<wbr>&nbsp;<wbr> {&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;public&nbsp;<wbr>&nbsp;<wbr> static&nbsp;<wbr>&nbsp;<wbr> void&nbsp;<wbr>&nbsp;<wbr> main(String[]&nbsp;<wbr>&nbsp;<wbr> args)&nbsp;<wbr>&nbsp;<wbr> {&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; Integer&nbsp;<wbr>&nbsp;<wbr> n1&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Integer(47);&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; Integer&nbsp;<wbr>&nbsp;<wbr> n2&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Integer(47);&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(n1.equals(n2));&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp; }&nbsp;<wbr>&nbsp;<wbr><br>}&nbsp;<wbr>&nbsp;<wbr> ///:~&nbsp;<wbr>&nbsp;<wbr><br>正如我们预计的那样，此时得到的结果是true。但事情并未到此结束！假设您创建了自己的类，就象下面这样：<br>//:&nbsp;<wbr>&nbsp;<wbr> EqualsMethod2.java&nbsp;<br><wbr>class&nbsp;<wbr>&nbsp;<wbr> Value&nbsp;<wbr>&nbsp;<wbr> {&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;int&nbsp;<wbr>&nbsp;<wbr> i;&nbsp;<wbr>&nbsp;<wbr><br><wbr>}<br>public&nbsp;<wbr>&nbsp;<wbr> class&nbsp;<wbr>&nbsp;<wbr> EqualsMethod2&nbsp;<wbr>&nbsp;<wbr> {&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;public&nbsp;<wbr>&nbsp;<wbr> static&nbsp;<wbr>&nbsp;<wbr> void&nbsp;<wbr>&nbsp;<wbr> main(String[]&nbsp;<wbr>&nbsp;<wbr> args)&nbsp;<wbr>&nbsp;<wbr> {&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; Value&nbsp;<wbr>&nbsp;<wbr> v1&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Value();&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; Value&nbsp;<wbr>&nbsp;<wbr> v2&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> new&nbsp;<wbr>&nbsp;<wbr> Value();&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; v1.i&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> v2.i&nbsp;<wbr>&nbsp;<wbr> =&nbsp;<wbr>&nbsp;<wbr> 100;&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(v1.equals(v2));&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;}&nbsp;<wbr>&nbsp;<wbr><br>}&nbsp;<wbr>&nbsp;<wbr> ///:~&nbsp;<wbr>&nbsp;<br>此时的结果又变回了false！这是由于equals()的默认行为是比较句柄。所以除非在自己的新类中改变了equals()，否则不可能表现出我们希望的行为。但要注意equals()的这种行为方式同时或许能够避免一些&#8220;灾难&#8221;性的事件。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大多数Java类库都实现了equals()，所以它实际比较的是对象的内容，而非它们的句柄。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在java中内存分为&#8220;栈&#8221;和&#8220;堆&#8221;(Stack&nbsp;<wbr>&nbsp;<wbr> and&nbsp;<wbr>&nbsp;<wbr> Heap)&nbsp;<wbr>，基本数据类型存储在"栈"中，对象引用类型实际存储在"堆"中，在&#8220;栈&#8221;中只是保留引用内存的地址值，就好像知道你家门牌号码就可以找到你家。在Java中利用"=="比较变量时候，系统使用变量在stack(栈)中所存的值来作为对比的依据，基本数据类型（int&nbsp;<wbr>&nbsp;<wbr> float&nbsp;<wbr>&nbsp;<wbr> double&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>boolean）在stack中所存的值就是其內容值，而引用类型在stack中所存放的值是本身所指向Heap中对象的地址值，而不是原先所設定的值。<br><br>PS&nbsp;<wbr>&nbsp;<br><wbr>1：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;==基本类型之间的比较包括int,short,reference等&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equals()是对象之间的比较，缺省（Object中）的是对象引用的比较，但是可以重载。&nbsp;<wbr>&nbsp;<wbr><br>2：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equals()和==在语义上是不同的，==是作为标识符嵌入到java语言的语法中，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;而equals()是作为一个类方法实现。java的指称语义，必须描述==，但是不用描述equals()方法。</span> 
<img src ="http://www.cppblog.com/zmllegtui/aggbug/65077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2008-10-26 12:59 <a href="http://www.cppblog.com/zmllegtui/archive/2008/10/26/65077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>栈内存与堆内存（Java）</title><link>http://www.cppblog.com/zmllegtui/archive/2008/10/26/65075.html</link><dc:creator>zml_cnnk</dc:creator><author>zml_cnnk</author><pubDate>Sun, 26 Oct 2008 04:11:00 GMT</pubDate><guid>http://www.cppblog.com/zmllegtui/archive/2008/10/26/65075.html</guid><wfw:comment>http://www.cppblog.com/zmllegtui/comments/65075.html</wfw:comment><comments>http://www.cppblog.com/zmllegtui/archive/2008/10/26/65075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zmllegtui/comments/commentRss/65075.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zmllegtui/services/trackbacks/65075.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java把内存划分成两种：一种是栈内存，一种是堆内存。&nbsp;<wbr>&nbsp;<br><wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。当在一段代码块定义一个变量时，Java就在栈中为这个变量分配内存空间，当超过变量的作用域后，Java会自动释放掉为该变量所分配的内存空间，该内存空间可以立即被另作他用。&nbsp;<wbr>&nbsp;<wbr>&nbsp;<br><wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;堆内存用来存放由new创建的对象和数组。在堆中分配的内存，由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后，还可以在栈中定义一个特殊的变量，让栈中这个变量的取值等于数组或对象在堆内存中的首地址，栈中的这个变量就成了数组或对象的引用变量。&nbsp;<wbr>&nbsp;<wbr>引用变量就相当于是为数组或对象起的一个名称，以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体的说：栈与堆都是Java用来在Ram中存放数据的地方。与C++不同，Java自动管理栈和堆，程序员不能直接地设置栈或堆。<br>&nbsp;<wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立，它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的，堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器，因为它是在运行时动态分配内存的，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态分配内存，存取速度较慢。&nbsp;<br><wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<wbr>栈的优势是，存取速度比堆要快，仅次于寄存器，栈数据可以共享。但缺点是，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。栈中主要存放一些基本类型的变量（,int, short, long, byte, float, double, boolean, char）和对象句柄。栈有一个很重要的特殊性，就是存在栈中的数据可以共享。假设我们同时定义：<br>int a = 3;<br>int b = 3;<br>编译器先处理int a = 3；首先它会在栈中创建一个变量为a的引用，然后查找栈中是否有3这个值，如果没找到，就将3存放进来，然后将a指向3。接着处理int b = 3；在创建完b的引用变量后，因为在栈中已经有3这个值，便将b直接指向3。这样，就出现了a与b同时均指向3的情况。这时，如果再令a=4；那么编译器会重新搜索栈中是否有4值，如果没有，则将4存放进来，并令a指向4；如果已经有了，则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的，因为这种情况a的修改并不会影响到b，它是由编译器完成的，它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态，会影响到另一个对象引用变量。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String是一个特殊的包装类数据。可以用：<br>String str = new String("abc");<br>String str = "abc";<br>两种的形式来创建，第一种是用new()来新建对象的，它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String类的对象引用变量str，然后查找栈中有没有存放"abc"，如果没有，则将"abc"存放进栈，并令str指向&#8221;abc&#8221;，如果已经有&#8221;abc&#8221; 则直接令str指向&#8220;abc&#8221;。<br><br><wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: red">比较类里面的数值是否相等时，用equals()方法；当测试两个包装类的引用是否指向同一个对象时，用==，下面用例子说明上面的理论。</span><br>String str1 = "abc";<br>String str2 = "abc";<br>System.out.println(str1==str2); //true<br>可以看出str1和str2是指向同一个对象的。<br>String str1 =new String ("abc");<br>String str2 =new String ("abc");<br>System.out.println(str1==str2); // false<br>用new的方式是生成不同的对象。每一次生成一个。&nbsp;<br><wbr><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<wbr>因此用第二种方式创建多个&#8221;abc&#8221;字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度，因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")；的代码，则一概在堆中创建新对象，而不管其字符串值是否相等，是否有必要创建新对象，从而加重了程序的负担。<wbr>另一方面, 要注意: 我们在使用诸如String str = "abc"；的格式定义类时，总是想当然地认为，创建了String类的对象str。担心陷阱！对象可能并没有被创建！而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。由于String类的immutable性质，当String变量需要经常变换其值时，应该考虑使用StringBuffer类，以提高程序效率。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;练习：<br>以下code生成几个String对象<br>&nbsp;<wbr>&nbsp;<wbr> String a="abc";<br>&nbsp;<wbr>&nbsp;<wbr> String b="abc";<br>&nbsp;<wbr>&nbsp;<wbr> String c=new String("abc");<br>&nbsp;<wbr>&nbsp;<wbr> String d=c.intern();<br><br>&nbsp;&nbsp;&nbsp;String a="abc";&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;<wbr> String b="abc";&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<br>&nbsp;<wbr>&nbsp;<wbr> String c=new String("abc");&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><wbr><wbr><wbr><br>&nbsp;<wbr>&nbsp;<wbr> String d=c.intern();&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>这句是关键！！<br><br>如果仅仅是这样<br>&nbsp;&nbsp;&nbsp;String c=new String("abc");&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><wbr>String d=c.intern();&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br><wbr>c == d？<wbr><wbr>结果是 false；因为引用变量c指向堆内存的地址；但是intern(); 却在栈中开辟了一块内存。<br><br>对于本题来讲：c.intern(); 执行时，在栈内存中发现存在对象&#8220;abc&#8221;，所以直接将指针指向&#8220;abc&#8221;，这样 a == d, b==d 结果为true;</span> 
<img src ="http://www.cppblog.com/zmllegtui/aggbug/65075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zmllegtui/" target="_blank">zml_cnnk</a> 2008-10-26 12:11 <a href="http://www.cppblog.com/zmllegtui/archive/2008/10/26/65075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>