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

© 梁健 黑马帝   /  2011-11-24 12:17  /  2404 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 l梁键 于 2011-11-24 16:13 编辑

String st="AB";
String sr="AB";
判断st==sr返回值为什么是true。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

7 个回复

倒序浏览
String 字符串即使对象,又是常量
字符串最大特点 :一旦被初始化就不可以改变.
字符串有一个常量池,可以从里面找已有的字符,
结果true ,在内存中以存在,不会在开辟空间。所以相等
回复 使用道具 举报
==如果要返回True的话,要么是基本类型的值相等,要么就是引用变量引用同一个对象。
你说的那种情况,就属于第二种,也就是说,St跟Sr引用的是同一个对象。想让他们返回Flase的话,这样
String St = new String("AB");
String Sr = new String("AB");
St == Sr
返回的就是Flase
回复 使用道具 举报
清秋 黑马帝 2011-11-24 12:30:56
板凳
定义sr时,字符串已经存在于内存中,不再开辟信空间。
因为字符串一旦被初始化就不可以改变,定义两个一样的字符串就浪费空间了
回复 使用道具 举报
因为都用双引号定义的
所有用双引号定义的字符串 如果字符串一样 就都存在同一个地址里面 不重新new 所以它们的地址相同
但是 如果是new 定义的 那么不管内存中有没有和它一样的 都重新起一个地址来存放
回复 使用道具 举报
String st="AB";
String sr="AB";
st 和 sr 都是字符串常量。
字符串常量一旦被初始化就不可以改变,字符串开始初始化的时候先在内存中开辟一个空间。
当在定义一个新的字符串时,它会在内存中以存找是否有相同的,当有相同的,它就不会在开辟新的空间。所以它们会相等。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
李盈科 黑马帝 2011-11-26 22:54:17
7#
本帖最后由 李盈科 于 2011-11-26 22:56 编辑

先了解一下Java 内存管理栈和堆 java的String类有个字符串池 这个是在栈中 ,String a =“hellow”  如果字符串池中没有这个对象 就创建一个新的返回给引用,如果有就把创建过的地址返回给引用。 String b = new String(“world”) 这个先看串池中有无这个对象 如果有就什么也不干,如果没有就创建一个对象,然后在在内存的堆里创建新的对象 返回给引用。new String每创建一次都会生成新的对象!
String 比较。。
class Test {
        public static void main(String[] args) {
                String hello = "Hello", lo = "lo";
                System.out.print((hello == "Hello") + " ");
                System.out.print((Other.hello == hello) + " ");
                System.out.print((other.Other.hello == hello) + " ");
                System.out.print((hello == ("Hel"+"lo")) + " ");
                System.out.print((hello == ("Hel"+lo)) + " ");
                System.out.println(hello == ("Hel"+lo).intern());
        }
}
class Other { static String hello = "Hello"; }

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马