(转自我的renren)
JAVA字符串比较问题,从开始学就没弄怎么懂,偏偏今天心血来潮,总想搞明白,于是查阅大量书籍,google大量资料,结果总结出来:仍然是X疼。。
堆栈,字符串常量,内存分析,鼓捣了几个小时,总不能完全明白,所以奉劝大家,在学习的过程中千万不要钻牛角尖,留着那个牛角去钻哥德巴赫猜想去吧~~
言归正传:
先看点简单的比较:
- String str1 =
"abc"
;
- String str2 = "abc"
;
- String str3 = new String ("abc");
- String str4 = new String ("abc");
- System.out.println(str1==str2); //true
- System.out.println(str3==str4); //false
- System.out.println(str1==str3); //false
str1
和str2:编译器首先处理str1时,在栈中创建一个值为str1的引用,然后查找字符串常量中是否有“abc”这个常量,没有则在字符串常量中创建;
当执行str2时,由于常 量池中已有“abc”字符串,所以将str2直接指向字符串常量“abc”,这样,str1和str2就是指向同一个对象。
str3和str4:new出来的东西是放在堆里的,每new一个对象,就要在堆里重新创建一个对象。所以str3和str4分别指向堆里的不同对象,是在运行时才确定的。
str1和str3:str1是在程序编译器确定的,“abc”确定在字符串常量中。而str3是在程序运行时候才能确定,是在堆中动态创建的。str1和str3一个指向字符串常量区,一个指向堆,显然是不相等的。
----------------------------------------------休息一会,可能不回来了------------------------------------------------------------
如果上面的么有问题,那么继续往下面看吧~
- String str1 = "abc";
- String str2 = "def";
- String str3 = str1+str2;
- String str4 = "abc"+"def"
- String str5 = "abcdef"
- System.out.println(str4==str5); //true
- System.out.println(str3==str4); //false
- System.out.println(str3==str5); //false
如果这些你都一眼看出来的话,那就笑吧,尽情鄙视我的智商吧。看半天没看出来的咱们接着往下看
str4和str5: 仍然是字符串常量,str4在编译器就被确定了,它在编译期将abc和def两个字符串连接成abcdef后放在字符串常量区。
str3和str4:这两个让我很郁闷。。。解释起来有点费劲,str4不用说了。看str3,这个家伙是字符串常量中的两个对象相+,这不能在编译期确定,所以只能在运行时确定。在运行时在堆中重新创建一个对象,str3指向的是堆中的对象。因此,所以,so……
还是不明白是吧?如果你一遍就真正明白了,那你可以笑了,尽情鄙视我的IQ吧!
--------------------------------------------没有广告,可能也没有片子了--------------------------------------------
如果将“==”换成“equals”,那么结果就不用我说了吧。。equals方法只关心内容是否想到。
另外在API中还有个intern
()方法,这个还有点门道
--------------------------------------------暂停,停止,中止,或者是终止--------------------------------------------
(其实还没有完。。。。。后面还有个final)
分享到:
相关推荐
Java相关课程系列笔记之二Oracle学习笔记(建议用WPS打开) Java相关课程系列笔记之九Servlet学习笔记(建议用WPS打开) Java相关课程系列笔记之六HTML学习笔记(建议用WPS打开) Java相关课程系列笔记之七CSS学习...
本人学习Java时苦找的内存分析我把它整理成WORD文档供大家学习Java堆栈内存分析笔记。
狂神说java系列笔记(java基础+javaweb+ssm+微服务)全套
Java相关课程系列笔记之一Java学习笔记 Java相关课程系列笔记之四JDBC学习笔记 Java相关课程系列笔记之六HTML学习笔记 Java相关课程系列笔记之七CSS学习笔记 Java相关课程系列笔记之八JavaScript学习笔记 Java相关...
黑马程序员java培训就业班笔记:day05总结
当然,String类型并非是唯一存在的类型,java提供了数量众多的现成类型。重要的是,你不能盲目的创建类型。 二.存储到什么地方 程序运行时,对象是怎么进行放置安排的呢?特别是内存是怎样分配的呢?对这些方面...
java笔记java笔记java笔记java笔记java笔记java笔记java笔记
黑马程序员java培训就业班笔记:day06总结
010301_【第3章:Java基础程序设计】_Java数据类型笔记.pdf 010302_【第3章:Java基础程序设计】_运算符、表达式与语句笔记.pdf 010303_【第3章:Java基础程序设计】_判断与循环语句笔记.pdf 010401_【第4章:数组与...
黑马程序员java培训就业班笔记:day10总结
黑马程序员java培训就业班笔记:StringBuffer、基本数据类型的封装)总结
java学习笔记java学习笔记java学习笔记java学习笔记
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记
java笔记java笔记,java笔记java笔记java笔记java笔记
黑马程序员java培训就业班笔记:day09总结
Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习笔记Java学习...
2020年7月份PDF笔记,从Java基础内容到微服务、分布式相关笔记;
Class对象.getConstructor(参数类型的Class对象 如 String.class); 获得指定参数的公共构造方法 Class对象.getConstructors(); 获得全部公共的构造方法 Class对象.getMethod(“方法名的字符串”,方法的参数类型的...
JAVA系列笔记JAVA系列笔记JAVA系列笔记JAVA系列笔记JAVA系列笔记JAVA系列笔记