【面试题】Java String常量相等(==)问题
来源:互联网 发布:软件安全测试方法 编辑:程序博客网 时间:2024/06/05 23:00
问题
以下三个结果分别输出(true or false)?别小看它,很多程序员因为上面问题出过生产bug
String s3 = "s";String s4 = "s";System.out.println(s3==s4);---String s5 = "hello";String s6 = "he"+"llo";System.out.println(s5==s6);---Integer i = 2017;Integer j = 2017;System.out.println(i==j);---String s1 = new String("s");String s2 = new String("s");System.out.println(s1==s2);System.out.println(s1.intern()==s2.intern());
真正执行结果如下:
String s3 = "s";String s4 = "s";System.out.println(s3==s4); //true---String s5 = "hello";String s6 = "he"+"llo";System.out.println(s5==s6); //true---Integer i = 2017;Integer j = 2017;System.out.println(i==j); //false---String s1 = new String("s");String s2 = new String("s");System.out.println(s1==s2); //falseSystem.out.println(s1.intern()==s2.intern()); //true
解释
看看Integer的源代码就知道Integer 把-128-127之间的每个值建立了缓存池,所以Integer i =127,Integer j =127,他们是true,超出就是false。可以参考我的这篇文章: 【Java】Integer变量相等(==)比较问题
String s = “s” 是常量池中创建一个对象”s”,所以是true。而String s = new String(”s”)在堆上面分配内存创建一个String对象,栈放了对象引用。如下图:
但在调用s.intern()方法的时候,会将共享池中的字符串与外部的字符串(s)进行比较,如果共享池存在,返回它,如果不同则将外部字符串放入共享池中,并返回其字符串的引用,这样做的好处就是能够节约空间。
String 的intern()
方法的官方解释如下:
/** * Returns an interned string equal to this string. The VM maintains an internal set of * unique strings. All string literals found in loaded classes' * constant pools are automatically interned. Manually-interned strings are only weakly * referenced, so calling {@code intern} won't lead to unwanted retention. * * <p>Interning is typically used because it guarantees that for interned strings * {@code a} and {@code b}, {@code a.equals(b)} can be simplified to * {@code a == b}. (This is not true of non-interned strings.) * * <p>Many applications find it simpler and more convenient to use an explicit * {@link java.util.HashMap} to implement their own pools. */ public native String intern();
s.intern()作用还是很多,比如for循环创建String对象,因为代码事先不并不知道是否存在”hello”或者其他字符串的实例。这样可以节约很多内存空间。
参考资料:
1、你遇到过哪些质量很高的 Java 面试?
阅读全文
0 0
- 【面试题】Java String常量相等(==)问题
- Java面试题 两个String如何比较是否相等的
- 面试题1:字符串相等问题
- 2. 如果两个Integer的值相等,使用==进行判断的结果是否相等(常量池问题)?
- Java String面试题
- Java String面试题
- java 面试题---String的“==”比较
- java例程练习(String类对象相等问题)
- Java常量池的面试题
- java String 面试题详解
- JAVA基础面试题-String
- Java String类面试题
- Java String 类面试题
- 【Java】Integer变量相等(==)比较问题
- 关于String s1 = new String("abc") 创建一个对象问题和Java常量池总结
- String s1==s2面试题
- java--String常量池问题的几个例子(转)
- 面试题(String 对象)
- 浅析RPC机制
- 挑战实现P、R、F(精准率、召回率和调和数)的python程序
- 安装VMWare tools,以及解决安装后/mnt中有hgfs但没共享文件的方法
- win8.1 ubuntu14.04双系统 uefi引导问题
- .gitignore文件不起作用的解决办法 以及.DS_Store的处理
- 【面试题】Java String常量相等(==)问题
- JS的平凡之路--单例模式的各种实现方式
- vuex 使用文档
- 阅读XRecyclerView源码一
- QT环境配置
- Spring Boot学习入门篇(二)--使用Spring Boot
- QT获取系统当前时间
- MySQL
- coderforce Watermelon