Java 字符串
在Java中,字符串是一个非常重要的数据类型,它是由字符组成的序列。我们可以使用Java内置的String类来定义和操作字符串。
- String 类
- String 类是 final 的,意味着它不能被子类继承。
- String 类实现了 Serializable 接口,意味着它可以序列化。
- String 类实现了 Comparable 接口,意味着最好不要用‘==’来比较两个字符串是否相等,而应该用 compareTo() 方法去比较。
- StringBuffer、StringBuilder 和 String 一样,都实现了 CharSequence 接口,所以它们仨属于近亲。由于 String 是不可变的,所以遇到字符串拼接的时候就可以考虑一下 String 的另外两个好兄弟,StringBuffer 和 StringBuilder,它俩是可变的。
- 每一个字符串都会有一个 hash 值,这个哈希值在很大概率是不会重复的,因此 String 很适合来作为 HashMap 的键值。
以下是Java字符串的相关知识点、作用、操作方法、注意点以及学习建议。
1、常用知识点:
- 创建字符串:
String s1 = "Hello, world!";
- 比较字符串:
s1.equals("Hello, world!");
- 拼接字符串:
String s2 = "Hello" + " world!"
; - 字符串长度:
int length = s1.length();
- 字符串截取:
String sub = s1.substring(7, 12);
- 字符串替换:
String replaced = s1.replace("world", "Java");
- 字符串查找:
int index = s1.indexOf("world");
- 转换成大写:
String upper = s1.toUpperCase();
- 转换成小写:
String lower = s1.toLowerCase();
- 去除首尾空白字符:
String trimmed = s1.trim();
- 分割字符串:
String[] parts = s1.split(" ");
2、
作用:字符串在程序开发中非常常见,它广泛地应用于各种场景,如:用户输入、文件读取、网络通讯、数据库操作等。
3、常量池:
- 作用:可以通过双引号的方式直接创建字符串对象,不用再通过 new 的方式在堆中创建对象
- String s = new String("值")
- 创建二个对象
- 一个是字符串对象 “值”,被添加到字符串常量池中
- 另一个通过 new String() 构造函数创建的字符串对象“值”,被分别到堆内存中,同时引用变量 s 存储在栈上,它指向堆内存中字符串对象“值”
- String s = “值”
- Java 虚拟机会先在字符串常量池中查找有没有“值”这个字符串对象,如果有,则不创建任何对象,直接将字符串常量池中这个“值”的对象地址返回,赋给变量 s;如果没有,在字符串常量池中创建“值”这个对象,然后将其地址返回,赋给变量 s。
- 创建二个对象
4、String、StringBuild、StringBuffer区别
- String:不可变
- StringBuilder:可变,线程不安全,效率高(不能同步访问,但有速度优势)
- StringBuffer:可变,并且线程安全,效率差。
5、equals 与 == 对比
- "==" 用于数据类型的比较,判断引用是否指向堆内存的同一块地址
- equals 用于判断两个变量是否是同一个对象的引用,即堆中的内容是否相同返回值为布尔类型。
- 比较 java 基本类型:比较基本数据类型只能用 == ,不能用 “equals”,这里的 == 比较两个基本类型的值
- 比较 String: "==" 比较的是内存地址,“equals” 比较的是值
- 比较对象:都比较地址
6、注意点:
- 字符串是不可变的,任何对字符串的操作,如:拼接、截取、替换等操作,都会创建一个新的字符串对象。因此在进行大量字符串操作时,建议使用StringBuilder或StringBuffer进行优化。
- 在进行字符串比较时,需要使用
equals()
方法而不是==
操作符,因为==
操作符比较的是两个字符串对象的引用地址而非内容相等。 - 字符串常量池:为了减少内存中的字符串对象数量,Java在编译阶段会对同一字符串对象进行优化,将其放入字符串常量池中,以便多次使用。
- 当处理大量数据时,尽量避免频繁的字符串拼接,否则会导致内存中创建大量临时对象,影响性能。在这种情况下,可以使用StringBuilder或StringBuffer进行优化。