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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

        String str1 = "hello";
        String str2 = "hello";
        String str3 = new String("hello");
        String str4 = new String("hello");
               
        System.out.println("str1==str2?"+(str1==str2));                   //true      
        System.out.println("str2==str3?"+(str2==str3));                   //false  
        System.out.println("str3==str4?"+(str3==str4));                   // false  
        System.out.println("str2.equals(str3)?"+(str2.equals(str3)));  // true
        System.out.println("str3.equals(str4)?"+(str3.equals(str4)));  //true
用“hello”这种方式创建字符串对象的时候,java虚拟机会先检查字符串常量池是否具备“hello”这个字符串对象,如果常量池中不具备,那么就创建这个字符串对象并返回内存地址。如果字符串常量池中已经存在那么直接返回字符串常量池中的“hello”字符串对象的内存地址。

用New String(“hello”) 创建字符串对象的时候,java虚拟机会先检查字符串常量池中是否具备该字符串对象,如果有就不再创建了。如果不存在那么就会在字符串常量池中创建该字符串对象,然后在堆内存创建对象并把字符串常量池中的字符串复制给堆内存中的对象,最后返回堆内存的内存地址。

String要注意的地方:
        String 类已经重写了Object类的equals方法,String类equals方法默认比较的是内容。String类的==比较的是内存地址。

15 个回复

倒序浏览
String 类已经重写了Object类的equals方法,String类equals方法默认比较的是内容。String类的==比较的是内存地址。
:o
是这样么,这里我总迷糊
回复 使用道具 举报
支持一下楼主,继续加油
回复 使用道具 举报
楼主加油啊,赞一个
回复 使用道具 举报
微凉的暮色 发表于 2015-5-29 20:05
String 类已经重写了Object类的equals方法,String类equals方法默认比较的是内容。String类的==比较的是内 ...

是的,String类型的变量比较的内存地址要比较内容必须用equals
回复 使用道具 举报
守株人 发表于 2015-5-29 21:55
楼主加油啊,赞一个

多谢支持:)
回复 使用道具 举报
夏尔 中级黑马 2015-5-30 09:20:06
7#
总结的很好。 毕老师的视频有说过
回复 使用道具 举报
流水0215 发表于 2015-5-29 21:08
支持一下楼主,继续加油

多谢支持
回复 使用道具 举报
不用客气的哈
回复 使用道具 举报
继续加油 !
回复 使用道具 举报
string是一个引用型的类,其变量是引用型变量,那么直接打印其引用为何会是其内容,而不是其引用的内存地址值呢
回复 使用道具 举报
是的,写的不错

回复 使用道具 举报
非常正确
回复 使用道具 举报
路过看看
回复 使用道具 举报
学习了,原来都是在常量池中寻找字符串,然后赋地址值,
回复 使用道具 举报
风华正茂 来自手机 中级黑马 2015-8-7 00:05:29
16#
总结得不错,楼主好人一生平安
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马