Java中关于字符串对象一些易错的点
来源:互联网 发布:五子棋最强软件 编辑:程序博客网 时间:2024/06/05 16:57
Java字符串对象一些易错的点
1.字符串直接量:
String s1="abc";String s2="a"+"bc";System.out.println(s1==s2);
上面的结果输出为true,我相信大家都是没有疑问的,s2在编译时期就能确定下来,字符串对象为"abc",所以s2就会直接指向与字符串常量池中s1定义的字符串对象存储的位置,所以结果为true。
2.new 出一个字符串:
String s1="abc";String s2=new String("abc");System.out.println(s1==s2);
上面的结果为 false。你能理解吗?
首先 s1为一个字符串直接量,当定义了s1后,首先会在字符串池中查找是否存在该字符串,即"abc",如果不存在,就会创建一个字符串对象"abc",并将该对象存入字符串池中,当下次再使用"abc"时,就会直接指向字符串池中的该字符串。
而s2定义时是首先在堆里new了一个字符串对象,该对象又指向了字符串直接量"abc"。我们对于引用使用(==)来比较,你还记得是怎么定义的吗?是比较引用中所存的对象的地址。s1存的地址是字符串池中的字符串的位置,而s2存放的是堆中的new出来的那一块内存地址。所以s1==s2输出当然为false。
另外s2在创建时一共创建了1个或者2个对象(我是这么理解的),第一个是new出来的存放在堆当中的,第二个是"abc"这个直接量。
3.字符串的运算
String s1="abc"; String s5="a"; String s6=s5+"bc";System.out.println(s1==s6);
上面的结果会输出为false。
String s1="abc"; final String s5="a"; String s6=s5+"bc";System.out.println(s1==s6);
上面的结果会输出为true。
为什么一个输出为false,一个输出为true呢?
第一段代码中之所以会这样,是因为s6的字符串连接中存在变量,无法再编译时期确定下来s6的准确值,所以无法直接指向s1定义过的已经存放在字符串常量池内的字符串。‘
第二段代码与第一段代码的区别在于 s5定义成为了final类型的,所以在编译时期就能将s6中的s5直接替换成“a”,最终s6也就指向了与s1相同的内存区域。这里使用到了宏变量和宏替换的概念,不清楚这概念可以百度查查。
上面的结果输出为true,我相信大家都是没有疑问的。
0 0
- Java中关于字符串对象一些易错的点
- Java中关于对象串行化的一些讨论
- C#中关于字符串和类型转换的一些注意点
- Java中关于关键字new创建字符串对象的总结
- 关于java编程的一些注意点
- 关于java基础点的一些随笔
- 关于内存及字符数组,字符串的一些注意点
- 关于java的一些小问题,list中添加对象,java基本数据类型对象
- c#中关于字符串的一些函数
- perl中关于字符串的一些函数
- c#中关于字符串的一些函数
- 面试中关于字符串的一些问题
- 关于java对象内存的一些总结
- Java中字符串比较的注意点
- Java中字符串比较的注意点
- Java 中字符串相等的注意点
- Java中字符串比较的注意点
- Java中字符串比较的注意点
- spring多数据源3
- RedisDesktopManager连接不上redis
- Spring Boot Junit单元测试
- 完全理解Python迭代对象、迭代器、生成器
- CF 70E Information Reform
- Java中关于字符串对象一些易错的点
- RunTime交换方法的实现
- xcode 8 widget 真机调试
- array_key_exists() 与 isset() 的区别
- JSP九大内置对象的作用和用法总结
- jar包、模板模式
- Android开发方法数超过64k(65k)解决办法
- 已启动程序,再启动通知原程序显示
- iOS高级编程之多线程的使用场景深入探索