Java中的字符串问题

本文章分为三个部分:html

一、建立字符串对象的两种方式以及它们的存储方式java

二、String a = new String("a")建立了几个对象的问题面试

三、字符串小例子spa

----------------------------------------------我是友好的分隔线----------------------------------------------.net

  在《Java核心技术I》中对String类的描述就是“因为不能修改Java字符串中的字符,因此在Java文档中将String类对象称为不可变字符串......编译器可让字符串共享”。但是在哪里能够实现“共享”这个操做呢?字符串池3d

  咱们知道建立一个字符串对象有两种方式:1) 采用字面值的方式赋值 2) 采用new关键词新建一个字符串对象。code

  方式一:采用字面值的方式赋值htm

  首先咱们先举个小例子:对象

public class StringTest {
    public static void main(String[] args) {
        String a = "aaa";
        String b = "aaa";
    }
}

  通常的作法是直接用System.out.println(a==b);来判断,此处用javap -v反编译的方式来判断a和b的值是否是来自同一个地方。blog

 

  这里的ldc的含义是:将常量值从常量池中取出来而且压入栈中。

  咱们能够看到,a和b是指向同一个字符串对象的,由于"aaa"这个字符串对象在字符串池中,而字符串池是常量池的一种,并且咱们能够从"LocalVariableTable"得知,在编译期间,a和b的值就已经肯定好了。若是想要建立一个字符串对象,编译器会先在字符串池中查找是否有相同字符串的对象,若是有,就能够直接指向这个对象多个变量可共享同一个对象,若是没有,那就建立一个新的字符串对象。

 

  方式二:采用new关键词新建一个字符串对象

  仍是先举一个小例子:

public class StringTest {
    public static void main(String[] args) {
        String a = new String("bbb");
        String b = new String("bbb");
    }
}

  用javap -v反编译以后获得:

   咱们能够看到,这里既有用在字符串池建立的对象的方式(红色),也有调用String类并启用来建立对象(绿色)。其实在使用new关键词建立字符串对象的流程是这个样子的:JVM会先在字符串池中寻找"bbb"这个对象,若是有,就不会在字符串池中建立这个对象,并且直接在堆建立“bbb”这个字符串对象,并将这个对象的地址返回给a;若是没有,则会先在字符串池中建立"bbb"对象,而后再在堆中建立"bbb”这个对象并把这个对象的地址返回给a。由于a和b都是分别new了一个字符串对象,因此它们的字符串对象的地址是不一样的。可是咱们能够从"LocalVariableTable"中能够看到,a和b变量在字符串池中的对象是在编译期间就已经建立好了,可是由于a和b的字符串对象是用new的方式建立的,因此,a和b的建立须要在运行的时候才能所有完成。

  总而言之,不管是用哪一种方式建立字符串对象,都须要在字符串池中进行字符串对象的建立,若是是用new关键词建立对象的话,还须要在堆中建立对象并将对象的地址返回给变量。

----------------------------------------------我是友好的分隔线----------------------------------------------

  有一道面试题是这样子的,“String a = new String("a")”是建立了几个对象?

  其实,这道题能够用咱们上面对字符串建立的分析来做答:建立了一个或者两个对象。

  这里给两个提示:1) String a = new String("a"); 2) String a = "a"; String b = new String("a");

  具体要怎么分析能够参考这篇文章https://blog.csdn.net/limingchuan123456789/article/details/14150327,不过只要理解了上面的分析,这道题解答起来并不难。

----------------------------------------------我是友好的分隔线----------------------------------------------

  下面是关于字符串的一些小例子,看看都能作对吗?

public class StringTest {
    public static void main(String[] args) {
        String a = new String("aaa");
        String b = "aaa";
        String c = "a"+new String("aa");
        String d = "a"+"aa";
        System.out.println(a==b);
        System.out.println(a==c);
        System.out.println(b==c);
        System.out.println(b==d);
        System.out.println(c==d);
    }
}

  答案是:

false
false
false
true
false

  

 

参考:

https://www.cnblogs.com/fangfuhai/p/5500065.html

https://blog.csdn.net/limingchuan123456789/article/details/14150327

相关文章
相关标签/搜索