String 字符串
程序员文章站
2022-03-21 08:01:38
字符串就是用“ ”括起来的都叫字符串,属于引用类型创建字符串的三种常见方式// 方式一String str = "Hello ";// 方式二String str2 = new String("Hello ");// 方式三char[] array = {'a', 'b', 'c'};String str3 = new String (array);方式一要先看常量池有没有hello,有的话直接引用,没有的话,直接创建一个hello常量并放入常量池并引用。方式二先在堆上创建一个S...
字符串就是用“ ”括起来的都叫字符串,属于引用类型,也可以说所有的文本都是字符串
创建字符串的三种常见方式
// 方式一;直接引用字符串常量
String str = "Hello ";
// 方式二;利用构造方法实例化
String str2 = new String("Hello ");
// 方式三;利用字符数组实例化
char[] array = {'a', 'b', 'c'};
String str3 = new String (array);
方式一要先看常量池有没有hello,有的话直接引用,没有的
话,直接创建一个hello常量并放入常量池并引用。
方式二先在堆上创建一个String对象,然后引用
方式三先创建一个数组,然后将数组作为参数
还可以截取数组的一部分如下图
字符串的比较
1、==
String 使用 == 比较并不是在比较字符串内容, 而是比较
两个引用是否是指向同一个对象
2、equals方法
Java 中要想比较字符串的内容, 必须采用String类提供的equals方法.
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1.equals(str2));
// System.out.println(str2.equals(str1)); // 或者这样写也行
// 执行结果
true
理解字符串不可变
字符串是一种不可变对象. 它的内容不可改变.
String 类的内部实现也是基于 char[] 来实现的, 但是
String 类并没有提供 set 方法之类的来修改内部的
字符数组.
那么如果实在需要修改字符串的方法
1、常见办法: 借助原字符串, 创建新的字符串
String str = "Hello";
str = "h" + str.substring(1);
System.out.println(str);
2、特殊办法: 使用 "反射" 这样的操作可以破坏封
装, 访问一个类内部的 private 成员.
String str = "Hello";
// 获取 String 类中的 value 字段. 这个 value 和 String 源码中的 value 是匹配的.
Field valueField = String.class.getDeclaredField("value");
// 将这个字段的访问属性设为 true
valueField.setAccessible(true);
// 把 str 中的 value 属性获取到.
char[] value = (char[]) valueField.get(str);
// 修改 value 的值
value[0] = 'h';
System.out.println(str);
// 执行结果
hello
关于反射
反射是面向对象编程的一种重要特性, 有些编程语言也称
为 "自省".指的是程序运行过程中, 获取/修改某个对象的
详细信息(类型信息, 属性信息等), 相当于让一个对象更
好的 "认清自己" .
为什么 String 要不可变?
1. 方便实现字符串对象池. 如果 String 可变, 那么对象
池就需要考虑何时深拷贝字符串的问题了.
2. 不可变对象是线程安全的.
3. 不可变对象更方便缓存 hash code, 作为 key 时可以更
高效的保存到 HashMap 中.
String常见的方法
本文地址:https://blog.csdn.net/qq_45731021/article/details/112848705