黑马程序员技术交流社区
标题: 关于String的问题 [打印本页]
作者: 花谢花开 时间: 2015-4-1 21:42
标题: 关于String的问题
1、String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
2、String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3==s4);
System.out.println(s3.equals(s4));
3、String s5 = "hello";
String s6 = "hello";
System.out.println(s5==s6);
System.out.println(s5.equals(s6));
这三个题到底应该怎么区分?
作者: 九个太阳学程序 时间: 2015-4-1 21:48
每天来一次 努力加油
作者: 黑色救护车 时间: 2015-4-1 22:12
楼主看一下我这个总结应该就能明白了~
String类的equals()方法在运用的时候和“==”操作符有些许不同。
示例代码:
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1.equals(s2)); //返回true,地址相同(都在对象池),值相同
System.out.println(s1 == s2); //返回true,地址相同,值相同
System.out.println(s1.equals(s3)); //返回true,地址不同,但是值相同
System.out.println(s1 == s2); //返回false,值相同,但是地址不同
总结,String类的equals()方法,比较的是两个String的值,只要值相同,返回true;而”==“运算符比较的是地址和值,只有两者都相同,才返回true。
作者: 花谢花开 时间: 2015-4-1 22:55
多谢了,以后请多多指教,相互交流学习!
作者: 466273082 时间: 2015-4-1 23:03
String s1 = new String("hello");这是两对象,"hello"在字符串资源池中,而newString在堆中
作者: 黑色救护车 时间: 2015-4-2 07:59
没有问题~:lol一起进步! 关于上面的问题,还可以百度一下对象池的概念,String是用对象池的,所以才会有上述特点。加油!
作者: 花谢花开 时间: 2015-4-2 20:34
多谢,好的!
作者: 花谢花开 时间: 2015-4-2 20:35
多谢!感谢了
作者: lwj123 时间: 2015-4-2 20:46
我来说说吧:首先你要明白什么是
(1)常量池,在编译期间能够确定的常量字符串都会被放到常量池中存储;
(2)==:比较的是地址
(3)equals():String比较的是内容,也就是字符序列是否相等
1、String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
第一题:
s1,s2指向的都是“hello”的一个副本
指向的对象存放在不同的堆空间中
所以地址值是不能相等的
equals:因为两者指向对象的字符序列都是一样的,所以返回true
2、String s3 = new String("hello");
String s4 = "hello";
System.out.println(s3==s4);
System.out.println(s3.equals(s4));
第2题:
s3“hello”的一个副本
s4指向的是常量池中存储的"hello",在此之前,常量池是没有"hello"的,所以创建该对象,并放于常量池中
两者存放的位置都不一样,所以==也是返回false
equals:因为两者指向对象的字符序列都是一样的,所以返回true
3、String s5 = "hello";
String s6 = "hello";
System.out.println(s5==s6);
System.out.println(s5.equals(s6));
第2题:
s5,s6指向的是常量池中存储的"hello",在此之前,常量池是没有"hello"的,所以创建该对象,并放于常量池中,当s6需要用时,直接引用指向了常量池中的"hello",两者指向的位置一样,所以==也是返回true
equals:因为两者指向对象的字符序列都是一样的,所以返回true
作者: lwj123 时间: 2015-4-2 20:47
收货要给点币 啊,哈哈
作者: 花谢花开 时间: 2015-4-2 21:00
多谢了,现在我对String s = new String("hello");和String s1 = "hello";以及==和equals的理解就是:
s在内存中是两个对象,而s1在内存中是一个对象;
==比较的是两个字符串对象的地址,而equals比较的是两个字符串的值,不用管对象的地址!
不知道这样对不对?再次表示感谢
作者: 364785953 时间: 2015-4-2 23:59
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
作者: 飞翔的侠客604 时间: 2015-4-3 00:03
字符串比较用.equeals 数值比较用双=
作者: 快乐ABC 时间: 2015-4-3 00:13
对于基本类型来说==是比较直接比较值是否相等,而对于引用类型来说就是比较内存地址。对于引用数据类型来说equals默认也是比较地址的,但是基本数据类型的包装类和String实现了equals方法,比较的是内容是否相等。所以我们写一个类是也要实现equals方法为好。
作者: 花谢花开 时间: 2015-4-3 21:09
呃,不是吧!你都那么多了,还来敲诈我们这些刚来的新同志!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |