java String 缓存池问题
来源:互联网 发布:淘宝客程序2.0 编辑:程序博客网 时间:2024/05/16 20:05
面试中常会遇到String对象构造的问题。例如String s= new String("a");创建了几个对象。
下面根据代码详细解释一下各种String构造情况。(有点根据结果往回推的意思。)
代码如下:
输出的结果为:
- s3==s4? true
- s3==s4? true
- s3==s6? false
- s3==s7? false
- s3==s10? true
在解释之前先对String做个简单的介绍。
百度百科:java中的字符串。 String类是不可变的,对String类的任何改变,都是返回一个新的String类对象。 String 对象是 System.Char 对象的有序集合,用于表示字符串。String 对象的值是该有序集合的内容,并且该值是不可变的。
特别注意:String类是不可变(final)的,对String类的任何改变,都是返回一个新的String类对象.这样的话把String类的引用传递给一个方法,该方法对String的任何改变,对原引用指向的对象没有任何影响,这一点和基本数据类型相似.
String池:String是不可改变的,为了提高效率Java引用了字符串池的概念,例如new String("abc");首先会在String池中创建一个对象“abc”因为有NEW的 存在所以会分配地址空间copyString池的内容。当出现的String对象在String池中不存在时即在String池中创建该对象。
s3与s4根据String的概念他们都指向了同一个缓冲池内的地址,所以结果为true
s3与s5因为相加的两个为常量所以编译器会把s5="a"+"b"优化为s5="ab"。所以结果也为true。
s3与s6因为是两个变量的相加所以编译器无法优化,s1+s2即等同于(new StringBuilder(String.valueOf(s1))).append(s2).toString(); 在运行时,会有新的String地址空间的分配,而不是指向缓冲池中的“ab”。所以结果false。
s3与s7,根据缓冲池的定义在new的时候实际会新分配地址空间,s7指向的是新分配的地址空间所以与缓冲池地址不同,所以为false
s3与s10,类似于s3与s5,因为是final类型编译器进行了优化所以相同。
- java String 缓存池问题
- java缓存问题
- Java Integer 缓存问题
- Java Integer 缓存问题
- java缓存的问题
- java常量池中string的问题
- Java String.length() 问题
- Java中String问题
- java中String问题
- Java String.length() 问题
- Java 的String问题
- java String 的问题
- java String 连接问题
- Java String对象问题
- java springMVC 图片缓存问题
- Java Integer的缓存问题
- JAVA字符串池问题/String对象创建问题
- Java中字符串探索----String ,StringBuffer ,StringBuilder及字符串缓存池
- SRM 605 D1 L2:AlienAndSetDiv1,DP,bitmask
- 字符串分割使用方法
- broken necklace
- linux的fnctl设置FD_CLOEXEC
- hdu Safecracker(回溯)
- java String 缓存池问题
- POJ 2455 二分+网络流
- java 字节流与字符流的区别
- oracle 数据库单子段多条记录合并一条记录函数
- tcpdump的使用
- Java回调函数的理解
- 与const算算账
- eclipse 第三方jar包 关联源码,提示 The Jar of this class file belongs to container 'Android Dependencies'
- vc++MCF/C++/C中怎样让应用程序获得或以管理员权限运行 ,ShellExecuteEX编程 --- 获取管理员权限