String类

java.lang.String类

  • String 类 代表 字符串。Java 程序中的所有字符串字面值(如 “abc” )都作

为此类的实例实现。

  • String 是一个 final 类,代表不可变的字符序列 。
  • 字符串 是 常量 ,用双引号引起来表示。 它们 的值在创建之后不能更改 。
  • String 对象的字符内容是存储在一个字符 数组 value[] 中 的 ```java public final class String implements java.io.Serializable, Comparable, CharSequence { /* The value is used for character storage. / private final char value[];

/* Cache the hash code for the string / private int hash ; // Default to 0

```

概述

String:字符串,使用一对””引起来表示。

  1. String声明为final的,不可被继承
  2. String实现了Serializable接口:表示字符串是支持序列化的。

    1. 实现了Comparable接口:表示String可以比较大小
  3. String内部定义了final char[] value用于存储字符串数据

  4. 通过字面量的方式(区别于new给一个字符串赋值,此时的字符串值声明在字符串常量池中)。
  5. 字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true)的字符串的。

String的不可变性

说明

  1. 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
  2. 当对现的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
  3. 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

image.png

String实例化的不同方式

例一

examp.png
//通过字面量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
String s1 = “javaEE”;
String s2 = “javaEE”;

//通过new + 构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
String s3 = new String(“javaEE”);
String s4 = new String(“javaEE”);

例二

example2.png

例三

example3.png

总结

  1. 使用 new 方法一定会在堆空间中创建新的对象,堆空间的对象储存的是方法区中字符串常量值的地址
  2. 而直接使用String s1 = “javaEE” 则是直接将字符串常量池的地址赋值给栈里的对象
  3. 基础数据类型传递的是数据,而引用数据类型传递的是地址值

面试题

  1. String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?

两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:”abc”

  1. 考察String不可变性

    example4.png

String类常用方法

语雀内容

String与其它结构的转换

与基本数据类型、包装类之间的转换

String —> 基本数据类型、包装类:调用包装类的静态方法:parseXxx(str)
基本数据类型、包装类 —> String:调用String重载的valueOf(xxx)

@Test
public void test1(){
String str1 = “123”;
// int num = (int)str1;//错误的
int num = Integer.parseInt(str1);
String str2 = String.valueOf(num);//“123”
String str3 = num + “”;
System.out.println(str1 == str3); //false
}

与字符数组之间的转换

String —> char[]:调用String的toCharArray()
char[] —> String:调用String的构造器

@Test
public void test2(){
String str1 = “abc123”;
char[] charArray = str1.toCharArray();
for (int i = 0; i < charArray.length; i++) {
System.out.println(charArray[i]);
}
char[] arr = new char[]{‘h’,’e’,’l’,’l’,’o’};
String str2 = new String(arr);
System.out.println(str2);
}

与字节数组之间的转换

编码:String —> byte[]:调用String的getBytes()
解码:byte[] —> String:调用String的构造器

编码:字符串 —>字节 (看得懂 —->看不懂的二进制数据)
解码:编码的逆过程,字节 —> 字符串 (看不懂的二进制数据 —-> 看得懂

说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。