java语言基础之字符串ABC

在Java里面,String用的很广泛,但他实际上是一种类<不是基本数据类型!>,

String对象最最最重要的是他是一种不可变对象,而且他存在于字符串常量池。没错,是用final修饰。

然后再说String他有两种创建对象的方式:

  1. String  a = “abc”;
  2. String  a = new String("abc");

问题一:什么是不可变性

示例代码:    String  a = "abc";      

                     a  =  "QAQ";   

a引用只是改变了其指向,从指向“abc”变成指向“QAQ”对象地址并没有修改“abc”对象本身。这也就是他的所谓不可变性。

问题二:字符串对象会被垃圾回收器回收吗?

不会,因为运行时实例创建的全局字符串常量池中有一个表,总是为池中每个唯一的字符串对象维护一个引用。既然存在引用指向该字符串对象,所以垃圾回收器不会回收。

问题三:两种创建对象方式的区别

  1. String  a = “abc”;

显然,首先直接查找字符串常量池中有没有"abc"对象。若有引用a就直接指向它。若没有,那就在字符串常量池中先创建"abc"对象,然后再引用。  

     2. String  a = new String("abc");

这个是先在在常量池中查找是否有“abc”对象有则返回对应的引用,没有则创建。然然然后在堆中创建String("abc")对象,然后将堆中的地址赋给引用a。

所以说,用第一种方法效率会更高。

问题四:各种比较

           String m = "hello,world";
           String n = "hello,world";
           String u = new String(m);
           String v = new String("hello,world");
  1. 会分配一个11长度的char数组,并在常量池分配一个由这个char数组组成的字符串,然后由m去引用这个字符串

  2. 用n去引用常量池里边的字符串,所以和n引用的是同一个对象

  3. 生成一个新的字符串,但内部的字符数组引用着m内部的字符数组

  4. 同样会生成一个新的字符串,但内部的字符数组引用常量池里边的字符串内部的字符数组,意思是和u是同样的字符数组

            System.out.println(m == n); // true 
            System.out.println(m == u); // false
            System.out.println(m == v); // false
            System.out.println(u == v); // false

一点补充:String源码头

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

这个地方可以看出为什么字符串不可变。因为字符串对象实质上是由char[]数组和一些方法封装而成的。而char[]数组又是被final修饰的。方法源码里可以看出<没贴出来>:对String对象进行的操作实际上就是对char[]数组进行的操作,不过其返回值都是一个新的String实例


字符串链接问题:

字面量链接和变量链接的过程分析:


很累,非常累,字符s串API接口还没写。下次写集合框架的时候,再补上吧。




猜你喜欢

转载自blog.csdn.net/weixin_42126680/article/details/80184355
今日推荐