Java String探索
2017-05-11 09:12
411 查看
Java团长 2017-05-09 19:44
今天看到了一个Java string的相关问题,解决问题的过程中就想把string 好好理顺了,总结在这里。
== 和 equals()
== 是判断两个变量是否指向同一个对象,equals()只判断两个字符串内容是否相同
Java学习交流群:495273252
String、StringBuilder和StringBuffer
String和StringBuilder:StringBuilder是可变的,也就是说用StringBuilder创建的字符串你可以随时改变它。StringBuilder和StringBuffer:StringBuffer是同步的,它是线程安全(thread-safe)的,但效率要比StringBuilder差得多。
查看String的构造函数jdk源码:
Java学习交流群:495273252
可见 为了使buffer的线程安全性在构造String时得到延续,加了同步块。
String str = new String("vv"); 创建了几个对象?
答案:1或2
new String("vv")在堆中创建了1个实例对象,而另1个就是放在常量池中的 "vv" 对象,当然这里的str本身只是一个引用,放在栈里,用来指向堆中创建出来的对象。所以如果常量池已经有"vv" 对象,就只在堆中创建一个对象;如果还没有,就会放入常量池,然后再在堆中创建一个对象,怎么验证呢?
Java学习交流群:495273252
然后用命令行工具( 深入理解Java虚拟机 一书中看的工具)
Java学习交流群:495273252
可见常量池中有一个String 类型的对象 vv,而且new出来的对象不是指向常量池的那个对象,亦即新创建了一个
注:jdk1.7 以后,虚拟机把存储Java对象的地方定义为堆,其它地方是不会有Java对象的实体的。故常量池不再存储对象实例,而是存储的引用,实际对象还是在堆中,所以有所不同,下文不再赘述。
String str = "vv"; 创建了几个对象?
答案:0或1如果常量池已经有"vv" 对象,就直接返回引用,如果还没有,就会放入常量池,然后返回引用。
Java学习交流群:495273252
可见s1,s2指向同一个对象。
Java学习交流群:495273252
而且常量池也有 vv
String str = "v" + "v";创建了几个对象?
答案:0或1
常量字符串是在编译的时候就被确定的,"v"是常量,所以编译时确定
这个代码编译后 与 String str = "vv"; 是一样的
Java学习交流群:495273252
可见 s1,s2 指向同一个对象
String str = s1 + s2;创建了几个对象?
答案[b]:视情况而定“+”连接的两个字符串本身就是字面常量字符串时,如果池中存在这样连接后的字符串,则是不会重新创建对象,而是直接引用池中的字符串对象;如果“+”连接的两字符串中只要有一个是变量,是会产生新的字符串对象。[/b]
Java学习交流群:495273252
但是如果变量是常量时,就不同了
Java学习交流群:495273252
但如果先定义final字符串,但未在定义处初始化,那么又不同了,
Java学习交流群:495273252
因为s1是在运行过程确定的,所以s5也只能运行时确定;
总结起来, String str=s1+s2 创建几个变量,关键取决于 s1,s2 能否在编译期确定
String str = "v".concat("v");创建了几个对象?
Java学习交流群:495273252
可见concat 产生的变量没有直接引用常量池的对象。
查看jdk8源码
Java学习交流群:495273252
果然是新创建了一个 String对象。
String 和 Char[]
查看jdk源码,知道 String的内部实现就是一个 Char 数组, 说String 不可变,也是因为 这个数组就是一个final 类型的 变量。
Java学习交流群:495273252
未完待续......
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群495273252,我们一起学Java!
今天看到了一个Java string的相关问题,解决问题的过程中就想把string 好好理顺了,总结在这里。
== 和 equals()
== 是判断两个变量是否指向同一个对象,equals()只判断两个字符串内容是否相同
Java学习交流群:495273252
String、StringBuilder和StringBuffer
String和StringBuilder:StringBuilder是可变的,也就是说用StringBuilder创建的字符串你可以随时改变它。StringBuilder和StringBuffer:StringBuffer是同步的,它是线程安全(thread-safe)的,但效率要比StringBuilder差得多。
查看String的构造函数jdk源码:
Java学习交流群:495273252
可见 为了使buffer的线程安全性在构造String时得到延续,加了同步块。
String str = new String("vv"); 创建了几个对象?
答案:1或2
new String("vv")在堆中创建了1个实例对象,而另1个就是放在常量池中的 "vv" 对象,当然这里的str本身只是一个引用,放在栈里,用来指向堆中创建出来的对象。所以如果常量池已经有"vv" 对象,就只在堆中创建一个对象;如果还没有,就会放入常量池,然后再在堆中创建一个对象,怎么验证呢?
Java学习交流群:495273252
然后用命令行工具( 深入理解Java虚拟机 一书中看的工具)
Java学习交流群:495273252
可见常量池中有一个String 类型的对象 vv,而且new出来的对象不是指向常量池的那个对象,亦即新创建了一个
注:jdk1.7 以后,虚拟机把存储Java对象的地方定义为堆,其它地方是不会有Java对象的实体的。故常量池不再存储对象实例,而是存储的引用,实际对象还是在堆中,所以有所不同,下文不再赘述。
String str = "vv"; 创建了几个对象?
答案:0或1如果常量池已经有"vv" 对象,就直接返回引用,如果还没有,就会放入常量池,然后返回引用。
Java学习交流群:495273252
可见s1,s2指向同一个对象。
Java学习交流群:495273252
而且常量池也有 vv
String str = "v" + "v";创建了几个对象?
答案:0或1
常量字符串是在编译的时候就被确定的,"v"是常量,所以编译时确定
这个代码编译后 与 String str = "vv"; 是一样的
Java学习交流群:495273252
可见 s1,s2 指向同一个对象
String str = s1 + s2;创建了几个对象?
答案[b]:视情况而定“+”连接的两个字符串本身就是字面常量字符串时,如果池中存在这样连接后的字符串,则是不会重新创建对象,而是直接引用池中的字符串对象;如果“+”连接的两字符串中只要有一个是变量,是会产生新的字符串对象。[/b]
Java学习交流群:495273252
但是如果变量是常量时,就不同了
Java学习交流群:495273252
但如果先定义final字符串,但未在定义处初始化,那么又不同了,
Java学习交流群:495273252
因为s1是在运行过程确定的,所以s5也只能运行时确定;
总结起来, String str=s1+s2 创建几个变量,关键取决于 s1,s2 能否在编译期确定
String str = "v".concat("v");创建了几个对象?
Java学习交流群:495273252
可见concat 产生的变量没有直接引用常量池的对象。
查看jdk8源码
Java学习交流群:495273252
果然是新创建了一个 String对象。
String 和 Char[]
查看jdk源码,知道 String的内部实现就是一个 Char 数组, 说String 不可变,也是因为 这个数组就是一个final 类型的 变量。
Java学习交流群:495273252
未完待续......
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群495273252,我们一起学Java!
相关文章推荐
- Java中字符串探索----String ,StringBuffer ,StringBuilder及字符串缓存池
- Java探索之旅(10)——数组线性表ArrayList和字符串生成器StringBuffer/StringBuilder
- java中String深度探索
- Java探索之旅(10)——数组线性表ArrayList和字符串生成器StringBuffer/StringBuilder
- Java探索之string字符串的应用代码示例
- Java:CoreJava篇:java.lang.String.getBytes()探索
- 深入探索 Java-String
- Java中字符串探索—-String ,StringBuffer ,StringBuilder及字符串缓存池
- 探索JAVA之String、StringBuffer、StringBuilder的比较
- 探索JAVA中的String,StringBuffer,StringBuilder
- Java中字符串探索----String ,StringBuffer ,StringBuilder及字符串缓存池
- Java探索之旅(13)——字符串类String
- Java探索之旅(13)——字符串类String
- Java——String对象探索
- 【收藏】Java用户界面本地化实例探索 ,读取资源包
- JAVA中int、String的类型转换
- Java深入探索之道Java类加载机制的奥秘
- java的一个string,如何判断它里面的值是全角的,还是半角的,还是全角半角混合的?
- JAVA中的String和StringBuffer
- Java用户界面本地化实例探索