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:字符串,使用一对””引起来表示。
- String声明为final的,不可被继承
String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小
String内部定义了final char[] value用于存储字符串数据
- 通过字面量的方式(区别于new给一个字符串赋值,此时的字符串值声明在字符串常量池中)。
- 字符串常量池中是不会存储相同内容(使用String类的equals()比较,返回true)的字符串的。
String的不可变性
说明
- 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
- 当对现的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
- 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
String实例化的不同方式
例一
//通过字面量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
String s1 = “javaEE”;
String s2 = “javaEE”;
//通过new + 构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
String s3 = new String(“javaEE”);
String s4 = new String(“javaEE”);
例二
例三
总结
- 使用 new 方法一定会在堆空间中创建新的对象,堆空间的对象储存的是方法区中字符串常量值的地址
- 而直接使用String s1 = “javaEE” 则是直接将字符串常量池的地址赋值给栈里的对象
- 基础数据类型传递的是数据,而引用数据类型传递的是地址值
面试题
- String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:”abc”
考察String不可变性
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的构造器
编码:字符串 —>字节 (看得懂 —->看不懂的二进制数据)
解码:编码的逆过程,字节 —> 字符串 (看不懂的二进制数据 —-> 看得懂
说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。