java 中 String 创建详细解释
字符串对象是一种特殊的对象.String 类是一个不可变的类..也就说,String 对象
一旦创建就不允许修改
String 类有一个对应的 String 池,也就是 String pool.每一个内容相同的字符串对
象都对应于一个 pool 里的对象.
1 看下面一段代码.

[java] view plaincopy
  1. String s = new String("abc");
  2. String s1 = "abc";
  3. String s2 = new String("abc");
  4. System.out.println(s == s1);
  5. System.out.println(s == s2);
  6. System.out.println(s1 == s2);

请问 前面三条语句分别创建了几个对象,分别是什么.后面的输出分别是什么
(1)String s = new String("abc"); 这句,创建了两个对象..其内容都是"abc".注意,
s 不是对象,只是引用.只有 new 生成的才是对象.
创建的流程是,首先括号里的"abc"先到 String pool 里看有没"abc"这个对象,没有
则在 pool 里创建这个对象..所以这里就在 pool 创建了一个"abc"对象.然后 通过
new 语句又创建了一个"abc"对象..而这个对象是放在内存的堆里. .这里的 s 指
向堆里的对象.
(2) String s1 = "abc"; 这条语句,s1 当然还是引用 .后面的"abc".其实就是上面括
号里的"abc".执行的是相同的操作.即 在 pool 里查找有没"abc"这个对象.没有则
创建一个...很显然,第一条语句在 pool 里已经创建了一个"abc".所以这条语句没
有创建对象,s1 指向的是 pool 中的"abc"
(3)String s2 = new String("abc"); 这条语句,其实和第一条是一样的。因为第一
条已经在 pool 中创建了"abc"这个对象,所以这条语句由于在 pool 中先找到了
"abc",所以不用在 pool 中再次创建"abc"了,而只是在堆里创建了一个新的
"abc"对象.s2 指向的是堆里的"abc".注意,虽然内容都是"abc",s 与 s2 表示的是
不同的对象
(4)接下来就很好说了.下面的三个==判断.(注意,==永远是判断内存地址是否相
等) s 与 s1,一个指向堆里的对象,一个指向 pool 里的.很明显是不同的对象.s 与
s2.上面说了,虽然都是指向堆里的对象,内容也是"abc",但是也不是相同的对象.
s1 与 s2.一个指向 pool,一个指向堆.也不是相同的对象.所以三个都返回 false.
2 第二个问题

[java] view plaincopy
  1. String s = new String("abc");
  2. String s1 = "abc";
  3. String s2 = new String("abc");
  4. System.out.println(s == s1.intern());
  5. System.out.println(s == s2.intern());
  6. System.out.println(s1 == s2.intern());

求最后输出是什么
解答.最后的答案是 false false true
intern()方法.按照 jdk 的帮助文档来说,是返回字符串对象的规范化表示形式。通
俗一点说,就是返回对应这个字符串内容的那个 pool 里的对象.这样说也许还看
不太明白,那可以拿具体例子来说
s1.intern().他的执行流程是,在 pool 里去查找 s1 对应的内容(也就是"abc").如果
找到,则返回 pool 里的对象.如果没有(老实说,我没想到有哪种情况是没有的),则
在 Pool 创建这个对象,并返回...
这样就很容易理解了.s1.intern 返回的是 pool 里的"abc"对象.与 s 这个堆里的对
象肯定不同,返回 false.同理,s 与 s2.intern()也肯定不同,返回 false.第三个,s1 与
s2.intern().其中 s2.intern()返回的是 pool 中的"abc"对象,而 s1 也是指向 pool 中
的"abc"对象.所以返回的是 true:
3 第三个问题

[java] view plaincopy
  1. String hello = "hello";
  2. String hel = "hel";
  3. String lo = "lo";
  4. System.out.println(hello == "hel" + "lo");
  5. System.out.println(hello == "hel" + lo);

求输出的结果
解答 true false
首先,上面已经说明了,hello hel lo 这三个都是指向 pool 中的对象..
现在我们考虑"hel" + "lo" 按照内容来说,两个相加也就是"hello".这个时候,这个会
返回 pool 中的"hello"对象.所以,hello == "hel" + "lo" 返回的是 true .
而"hel" + lo 虽然内容也是"hello",但是它将在堆里面生成一个"hello"对象,并返回
这个对象...所以这里的结果是 false
总结一下就是,如果加号两边的是字面值(字面值就是直接在""里写的值,比如上面
的"hel"与"lo"),那么将在 pool 里查找有没对应内容的对象(这里的内容就是
"hello"),并返回 pool 里的对象.这和 hello 是一样的....
如果加号两边不满足上面的条件(比如,两边的值是引用值或者堆里的字符串对
象).那么将不会再 pool 里查找"hello",而是直接在堆里生成一个新的对象...

java 字符串缓冲池 String缓冲池相关推荐

  1. Java字符串格式化—String.format()的使用以及Printf的使用

    Java字符串格式化-String.format()的使用以及Printf的使用 tring类的format()方法用于创建格式化的字符串以及连接多个字符串对象.记得C语言的printf()方法,两者 ...

  2. Java提高篇 —— String缓冲池

    一.String缓冲池 首先我们要明确,String并不是基本数据类型,而是一个对象,并且是不可变的对象.查看源码就会发现String类为final型的(当然也不可被继承),而且通过查看JDK文档会发 ...

  3. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...

  4. 学习-Java字符串之String类常用方法之字符串长度

    任务描述 本关任务:接收输入值(字符串),将该字符串反转输出,例如接收字符串"abc",输出"cba". 相关知识 为了完成本关任务,你需要掌握:字符串常用方法 ...

  5. JAVA字符串格式化-String.format()的使用

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...

  6. Java系列: JAVA字符串格式化-String.format()的使用(zz)

    常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处.format()方法有两种重 ...

  7. 练习-Java字符串之String类常用方法之文件名与邮箱验证

    任务描述 本关任务:分别判断 Java 文件名与邮箱格式是否正确. 其中:合法的文件名应该以 .java 结尾(如 Test.java 正确,Test.txt 不正确):合法的邮箱名中至少要包含 @ ...

  8. 练习-Java字符串之String类常用方法之花名册

    任务描述 本关任务:接收给定的两行字符串,分别代表两份不同的花名册,请你输出两份花名册的长度各是多少,以及它们是否相同. import java.util.Scanner; public class ...

  9. Java 字符串比较,String 中的一些方法 == 和 equals 的详解

    "==" 是比较的是两个对象的内存地址,而equals方法默认情况下是比较两个对象的内存地址. 1.String str = "hello"  生成的字符串,首 ...

最新文章

  1. 【Deep Learning笔记】Optic Disc 数据集
  2. 【C 语言】数组 ( 多维数组做函数形参退化为指针过程 | int array[2][3] -> int array[][3] -> int (*array)[3] )
  3. 一个简单案例,带你看懂GC日志!
  4. 前端学习(1666):前端系列实战课程之仿造qq发送消息思路
  5. PCL学习(4)——octree
  6. 2021-2025年中国超声检查台行业市场供需与战略研究报告
  7. tensorflow学习(一)——有关tensorflow不同层的使用(tf.nn 和tf.layers以及tf.contrib.layers)的简单区别
  8. Angucomplete —— AngularJS 自动完成输入框
  9. MyBatis使用总结+整合Spring
  10. 一次idea上使用logback+slf4j乱码的解决,问题不在logback
  11. pscc2019滤镜抽出_Photoshop(ps)cc2019 已经发现你啦!
  12. sublime text豆沙绿,护眼自制主题
  13. mysql 索引间隙锁_关于mysql innodb间隙锁的一些思考
  14. 怎么刷android10,安卓10的刷机教程,教你刷好Killer的精简包
  15. 计算机进去bios方式,bios怎么轻松进入?电脑进入bios方法大全
  16. openSetting:fail can only be invoked by user TAP gesture.
  17. 练习题 斐波那契数列
  18. 几万条数据的excel导入到mysql_excel十几万行数据快速导入数据库研究(转,下面那个方法看看还是可以的)...
  19. 离岸账户这么难开,还有什么更好地途径?
  20. 责任链模式与lambda重构责任链模式

热门文章

  1. raft中集群成员变更
  2. 电脑计算机的硬盘那些可以删除吗,我的电脑出现多个可移动磁盘该怎么删除?...
  3. 方法的重载与重写_深入解析JAVA重载与重写的区别
  4. oracle java_pool_size_总结 Oracle 内存分配和调优
  5. angular下拉框点击无反应_固定床反应器,你知道多少?
  6. jquery生成一个li_jquery-创建元素和添加子元素
  7. 手机利用python访问电脑文件_黑客教程,一行python命令让手机读取电脑文件!
  8. python pprint_如何美观地打印 Python 对象?这个标准库可以简单实现
  9. vins中imu融合_VINS-Mono代码分析与总结(最终版)
  10. oracle 拆分逗号转行_一个列用逗号隔开,列转行,看看是否有更好的办法。