A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© happymouse 中级黑马   /  2014-8-11 23:41  /  2132 人查看  /  9 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

概述:
        简单的来说,equals是比较内容,==是比较地址值
详细:
       内存可以分为堆内存和栈内存,简单的理解一般栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄(对象地址值),而堆内存一般存放具体的对象句柄内容。
栈内存还有一个很重要的特性,数据可以共享。
int a=4;
int b=4;
这是两个比较简单赋值语句,编译器先处理int a=4语句,现在栈内存创建一个变量为a的引用,然后查找栈内存中是否有4这个值,结果不存在,则创建4这个值,并指向a变量的引用。然后编译器处理int b=4语句,先创建一个变量为b的引用,然后查找查找栈内存中是否有4这个值,结果发现有,就直接将变量b的引用指向4这个值而不重新创建。
需要注意的是,这种栈内存的数据共享和两个对象的对象引用指向一个同一个对象是不一样的。栈内存的数据共享改变一个变量值得时候不会影响其他,例如,改变a的值不会影响b的值,这个是jvm自动完成的。但是当改变一个对象引用指向的对象的内部状态时,另一个对象引用变量也会发生改变。
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指 向”abc”,如果已经有”abc” 则直接令str指向“abc”。
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。

String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。
因此用第二种方式(String str1 ="abc")创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。

由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。



9 个回复

倒序浏览
哇!!谢谢楼主
回复 使用道具 举报
分析的好全面啊
回复 使用道具 举报
总结的挺全的
回复 使用道具 举报
这总结的……这个不算提问吧…………
回复 使用道具 举报
很精辟,学习了
回复 使用道具 举报
学习了,,,,,
回复 使用道具 举报
wfaly 中级黑马 2014-8-13 12:19:37
8#
谢谢楼主分享
回复 使用道具 举报
写的不错 谢谢楼主分享了
回复 使用道具 举报
嗯嗯,刚看完String  里面教的和楼主的一印证,感觉更好理解了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马