字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改

String类有一个对应的String池,也就是 String pool.每一个内容相同的字符串对象都对应于一个pool里的对象.

1 看下面一段代码.

String s = new String("abc");   String s1 = "abc";   String s2 = new String("abc");      System.out.println(s == s1);   System.out.println(s == s2);   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 第二个问题

String s = new String("abc");   String s1 = "abc";   String s2 = new String("abc");      System.out.println(s == s1.intern());   System.out.println(s == s2.intern());   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第三个问题

String hello = "hello";   String hel = "hel";   String lo = "lo";      System.out.println(hello == "hel" + "lo");   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对象的不可变性

    首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=n ...

  2. Java中String对象创建机制详解()

    一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...

  3. Java中String对象的存储位置(学习笔记)

    首先,String是final修饰的.immutable对象,它以一个个字符的方式存储在字符数组中.其次,String类型创建对象有两种方式:①通过字面量赋值:会先去常量池中查找是否存在相同的字符串, ...

  4. Java中String对象两种赋值方式的区别

    本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过“字面量”赋值 ...

  5. java中String对象的存储位置

    public class Test { public static void main(String args[]) { String s1 = "Java"; String s2 ...

  6. Java中String类new创建和直接赋值字符串的区别

    转自:https://blog.csdn.net/a986410589/article/details/52454492 方式一:String a = “aaa” ; 方式二:String b = n ...

  7. java中String对象的split方法

    在java.lang包中有String.split()方法,返回是一个String[]数组,今天碰到一个自己没注意的问题: 1.特殊分隔符 String str1 = "123|456|78 ...

  8. java中String类为什么不可变?

    在面试中经常遇到这样的问题:1.什么是不可变对象.不可变对象有什么好处.在什么情景下使用它,或者更具体一点,java的String类为什么要设置成不可变类型? 1.不可变对象,顾名思义就是创建后的对象 ...

  9. java中String是对象还是类?详解java中的String

    有很多人搞不懂对象和类的定义.比如说java中String到底是对象还是类呢? 有人说String 既可以说是类,也可以说是对象. 其实他这么说也没问题, 类和对象其实都是一个抽象的概念. 我们可以把 ...

随机推荐

  1. 使用es6一行搞定文字溢出省略号

    使用的是es6中扩展字符串方法参考地址 padStart(),padEnd() 使用padStart() 两个参数padStart(字符串最小长度,用来补全的字符串): 例如 let str = '1 ...

  2. 阿里巴巴前端面试parseInt()函数的面试题

    JavaScript 是弱类型语言,为了保证数值的有效性,在处理数值的时候,我们可以对数值字符串进行强行转换.如 parseInt 取整和 parseFloat 取浮点数.Java 也有 Intege ...

  3. E. Intercity Travelling

    E. Intercity Travelling time limit per test 1.5 seconds memory limit per test 256 megabytes input st ...

  4. Boke光纤交换机的snmp配置

    今天我配置了一下Boke光纤交换机e-300的snmp trap的配置 敲击help命令你会发现配置snmp的命令共有四个 snmpconfig                      Config ...

  5. eclipse 主题文件配置

    eclipse市场搜索 Eclipse Color Theme ----用于控制文本域主题 Eclipse 4 Chrome Theme  chrome风格的主题 最新的:Jeeeyul's Them ...

  6. es6+最佳入门实践(10)

    10.Generator 10.1.Generator是什么? Generator函数是ES6提供的一种异步编程解决方案.在它的内部封装了多个状态,因此,又可以理解为一种状态机,执行Generator ...

  7. vivo面试经验4(linux基本操作,最基本,必须得会!!)

    操作linux通过xshell进行连接: 基本操作介绍 1.shutdown -h 关机 shutdown -r 重启 2.mkdir aaa 新建目录aaa rmdir aaa 删除目录aaa 3. ...

  8. [转]使用 LDAP OU 限制访问

    使用 LDAP OU 限制访问 http://www-01.ibm.com/support/knowledgecenter/api/content/SSEP7J_10.2.2/com.ibm.swg. ...

  9. Ansible在节点间传输文件

    1. 在控制节点(the control machine )与远程节点( the current remote host)之间传输文件 1.1 如果需要传输文件,可以使用copy模块,注意copy模块 ...

  10. Type of flip id

    http://www.haskell.org/pipermail/beginners/2011-March/006477.html The point is that the type of id h ...