字符串String知识总结(上) 冲冲冲!!!

String类

Java 中数组, String, 以及自定义的类都是引用类型

引用
可以把引用想象成一个标签, “贴” 到一个对象上。一个对象可以贴一个标签, 也可以贴多个。 如果一个对象上面一个标签都没有, 那么这个对象就会被 JVM 当做垃圾对象回收掉在这里插入图片描述

String类的定义方式:

// 方式一
String str = "Hello";
// 方式二
String str2 = new String("Hello");
// 方式三
char[] array = {'a', 'b', 'c'};
String str3 = new String(array);
  • 在以下代码中,通过修改str1的值并不能修改str2的值,而只是让str1引用指向了一个新的String对象,str2是指向改变前str1引用所指向的对象
String str1 = "Hello";
String str2 = str1;

String str1 = "World";

在这里插入图片描述

  • 判断两个字符串相等
String str1 = "Hello";
String str2 = "Hello"; 
System.out.println(str1 == str2); 
// 执行结果
true

此时的"Hello"这样的字符串常量是在 字符串常量池 中,在上述代码中其实只有一个Hello,str1和str2都指向这一个字符串常量

如果代码中有多个地方引用都需要使用 “Hello” 的话, 就直接引用到常量池的这个位置就行了, 而没必要把 “Hello” 在内存中存储两次

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果
false
  • equals用来判断值是否相等,==用来判断引用是否指向同一个对象

此时的str1和str2都创建了对象,str1指向第一个对象,它的值是"Hello",str2指向第二个对象,它的值也是"Hello"

但因为两者不是指向同一个对象,故不能用 == 来判断相等,应该用 equals 来比较两个字符串的值

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1)); // 或者这样写也行
// 执行结果
true

此处要注意: 一旦 str1是 null, 方式一的代码会抛出空指针异常

  • 我们可以使用 String 的 intern() 方法来手动把 String 对象加入到字符串常量池中
// 该字符串常量并没有保存在常量池之中
String str1 = new String("hello") ; 
String str2 = "hello" ; 
System.out.println(str1 == str2); 
// 执行结果
false
    
String str1 = new String("hello").intern() ; //放入到常量池中
String str2 = "hello" ; 
System.out.println(str1 == str2); 
// 执行结果
true
  • String类中两种对象实例化的区别
  1. 直接赋值:只会开辟一块堆内存空间,并且该字符串对象可以自动保存在字符串常量池中以供下次使用。
  2. 构造方法:会开辟两块堆内存空间,不会自动保存在字符串常量池中,可以使用intern()方法手工入池。

字符串是一种不可变对象

String str = "hello" ; 
str = str + " world" ; 
str += "!!!" ; 
System.out.println(str); 
// 执行结果
hello world!!!

在这代码中,看结果的话确实字符串改变了,但其实是字符串的引用指向了另一个对象
此时在堆里存在着 “hello”、" world"、“hello world”、"!!!"、"hello world!!!"五个对象,这是对内存的一种浪费,会降低效率

  • 不可变的好处

  • 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑何时深拷贝字符串的问题了

  • 不可变对象是线程安全的

  • 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中

  • 字符和字符串

字符串内部包含一个字符数组,String 可以和 char[] 相互转换

构造方法:

//将字符数组的所有内容变为字符串
public String (char value[])

//将部分字符数组中的内容变为字符串
public String (cahr value[], int offset, int count)

普通方法:

//取出指定位置的字符
public char charAt(int index)

//将字符串变成字符数组返回
public char[] toCharArray()
String str = "hello" ; 
System.out.println(str.charAt(0)); // 下标从 0 开始
// 执行结果
h 

System.out.println(str.charAt(10)); 
// 执行结果
//产生 StringIndexOutOfBoundsException 异常
  • 字节和字符串

字节常用于数据传输以及编码转换的处理之中,String 也能方便的和 byte[] 相互转换

构造方法:

//将字节数组变成字符串
public String(byte bytes[])

//将部分字节数组中的内容变成字符串
public String(byte bytes[], int offset, int length)

普通方法:

//将字符串以字节数组的形式返回
public byte[] getBytes()
String str = "helloworld" ; 
// String 转 byte[] 
byte[] data = str.getBytes() ; 
for (int i = 0; i < data.length; i++) { 
 System.out.print(data[i]+" "); 
} 
// byte[] 转 String 
System.out.println(new String(data)); 

byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作
char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页