概述

String 被声明为 final,因此它不可被继承。

内部使用 char 数组存储数据,该数组被声明为 final,这意味着 value 数组初始化之后就不能再引用其它数组。并且 String 内部没有改变 value 数组的方法,因此可以保证 String 不可变。

著作权归https://pdai.tech所有。
链接:https://www.pdai.tech/md/java/basic/java-basic-lan-basic.html

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

不可变的好处

1.可以缓存Cache值:

因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。

2. String Pool (字符串常量池)的需要

如果一个 String 对象已经被创建过了,那么就会从 String Pool(字符串常量池) 中取得引用。只有 String 是不可变的,才可能使用 String Pool。

3. 安全性

String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。

4. 线程安全

String 不可变性天生具备线程安全,可以在多个线程中安全地使用

next():遇到了空格,就不再录入数据了。结束标记:空格,TAB键。

nextLine():可以将数据完整的接收过来。结束标记:回车换行符。

nextInt()和nextLine()不能在一起使用。

eg:

int num=sc.nextInt() //例如输入10, 然后回车

nextLine()的结束标记是回车换行,所以,直接接收到回车,无法录入数据。

String

在Java程序中,所有的双引号字符串,都是String这个类的对象。

字符串是常量,它们的值在创建后就不能更改。

字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )。

  • String常见构造方法
//Public String(): 创建一个空白字符串对象,不含有任何内容。

String s1= new String();
sout(s1);
(第一种写法比较多余不用。)
//public Sting(cahr chs[]): 根据字符数组的内容,来创建字符串对象

char chs={'a','b','c'};
String s2=new String(chs);
sout(s2);


//public String(String original): 根据传入的字符串内容,来创建字符串对象

String s3=new String("123");
sout(s3); 

String s = "abc";   //直接赋值的方式创建字符串对象,内容就是ab
(这种方式最常用)

Tips:String这个类比较特殊,打印其对象名的时候,不会出现内存地址,而是该对象所记录的真实内容。

创建字符串对象的区别对比:

q:构造方法和双引号创建的字符串对象,有什么区别?

注意:==号做比较

基本数据类型:比较的是具体的值。

int a=10,b=20;
sout(a==b);  //false

引用数据类型:比较地址值。

Student s1 =new Student(23);
Student s2=s1;
sout(s1==s2);   //true

字符串常量池:当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在

不存在:创建。

存在:不会重新创建,而是直接复用。

注意:字符串常量池从JDK7版本开始从方法区挪到了堆内存。

双引号创建的字符串对象,在字符串常量池中存储,通过构造方法创建的字符串对象,在堆内存中存储。

String字符串的特点

1、在Java程序中,所有的双引号字符串,都是String这个类的对象。

2、字符串是常量,它们的值在创建后就不能更改。

3、虽然String的值不可变,但是它们可以被共享。

Tips:当字符串之间使用“+”号拼接的时候,系统底层会自动创建一个StringBuilder对象然后再调用其append方法完成拼接,拼接后,再调用toString方法转换为String类型。

eg:

public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "a" + "b" + "c";
        System.out.println(s1==s2);   //true
}
Java存在常量优化机制,在编译的时候,就会将"a" + "b" + "c"拼接为 "abc"。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注