Java:判断字符串相等
问题描述
问题解答
回答1:String a = new String('abc');a = a.intern();String b = 'abc';if (a == b) { System.out.println('相等');} else { System.out.println('不等');}
你是调用了a.intern()方法,但是你又没有将返回结果重新赋值,a还是原来那个a。
回答2:字符串相等用 equals() 判断,Java 中这个题都考烂了哒!
回答3:a.intern();不会改变a字符的引用,他有个返回值。下面这样才会相等
String b = a.intern();回答4:
String a = new String('abc');
这里的a和'abc'是两个对象,当调用 intern 方法时,字符常量池中已经包含一个等于此对象的字符串了,所以intern这个方法调用等于没用,即使后面b='abc',b和a也不是同一个对象。
想要输出相等的话,要么第一句变成:
String a = 'abc';
要么第二句变成:
a = a.intern();回答5:
首先要知道一点是==操作判断的是:是否a,b两个对象或基本类型指向同一内存区域
String的底层实现是private final value[]String实例化时,实际上是通过System.arraycopy划分一段连续内存保存char数组。
new String('abc')实际上不推荐这种方法初始化String,实际实现起来比 a = 'abc'多了一个步骤,底层步骤是
划分内存空间,创建临时数组temp
temp[0] = ’a’;temp[1] = ’b’;temp[2] = ’c’;
创建数组value ,将value所指内存空间指向temp指向的内存空间,即 &value = &temp(若使用a = 'abc'则不需要这步)
intern方法是jdk1.5提供的方法,用于内存优化的,相同String引用共同内存空间,实际上就是上述的第三步。这里若要a,b相等,可以写为
String a = 'abc';String b = 'abc'.intern(); 或者String b = a.intern();
实际上 进行的操作就是上述的第三步,即 b = a;
String b = 'abc'实际的底层实现是:
划分内存空间,创建数组value
value[0] = a.value[0];value[1] = a.value[0]’;value[2] = a.value[0];
第二步中,String b中value[0]中的String a中的value[0]实际中指向的是同一个内存地址,因此实际上b.value[0] = a.value[0] = ’a’,但b.value 不等于a.value,根本原因在于指向内存区域不同
推荐看一下String的源码分析【JAVA源码分析——Java.lang】String源码分析
相关文章:
1. java - 做一个视频播放器,想实现一个功能,如果3秒不点击屏幕任何,则下方一个界面布局(显示按钮那些的)自动消失。2. 编辑管理员信息时,为什么没有修改过的内容会为空?3. thinkphp中Controller里面使用Request::File(’image’);4. mysql - 看这条sql有可能被注入吗5. java 如何列出jar包中jar包里的所有文件和目录?6. 清除nginx的文件缓存7. node.js - npm安装模块时,在cmd上显示的是一条白线,白线前面是一天反斜线转圈圈,然后就出现npm ERR错误了,求帮助,谢谢8. javascript - 如何将一个长为365的数组对象按月份切割成12组?9. javascript - js中数组的undefined为什么不会被遍历10. PC 手机兼容的 编辑器

网公网安备