1. String类的概述
java.lang.Object ==> java.lang.String
只要是java.lang包下面的类,都不用导包,直接就可以使用。
类代码定义
public final class String extends Object implements Serializable, Comparable<String>, CharSequence
String 类代表字符串。
Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
package com.heima.string; public class Demo1_String { /** * 字符串字面值“ABC”也可以看成是一个字符串对象。 * 字符串是常量,一旦被赋值,就不能被改变。 * */ public static void main(String[] args) { String str = "abc"; // "abc"可以看成一个字符串对象 str = "def"; // 当把"def"赋值给str,原来的"abc"就变成了垃圾 System.out.println(str); System.out.println(str.toString()); // String类重写了toString方法,返回的是该对象本身。 } }
字符串是常量;
它们的值在创建之后不能更改。
字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
2. String类的构造方法
- 常见构造方法:
- public String() 空构造
- public String(byte[] bytes) 把字节数组转换成字符串
- public String(byte[] bytes, int index, int length) 把字节数组的一部分转成字符串
- public String(char[] value) 把字符数组转成字符串
- public String(char[] value, int index, int count) 把字符数组的一部分转成字符串
- public String(String original) 把字符串常量值转换成字符串
- 案例演示:
-
package com.heima.string; public class Demo2_String { /** public String() 空构造 初始化一个新创建的 String 对象,使其表示一个空字符序列。 public String(byte[] bytes) 把字节数组转换成字符串 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。 public String(byte[] bytes, int index, int length) 把字节数组的一部分转成字符串 public String(char[] value) 把字符数组转成字符串 public String(char[] value, int index, int count) 把字符数组的一部分转成字符串 public String(String original) 把字符串常量值转换成字符串 */ public static void main(String[] args) { String s1 = new String(); System.out.println(s1); byte[] arr1 = {97,98,99}; String s2 = new String(arr1); System.out.println(s2); // 输出abc // 使用项目默认码表中(包含ascii码表)97对应的是a byte[] arr2 = {97,98,99,100,101,102}; String s3 = new String(arr2,2,3); System.out.println(s3); //输出cde char[] arr3 = {'a','b','c','d','e'}; String s4 = new String(arr3); System.out.println(s4); // 输出 abcde String s5 = new String(arr3,2,3); System.out.println(s5); // 输出cde String s6 = new String("heima"); System.out.println(s6); // 输出heima } }
-
3. String类的常见面试题
1.判断定义为String类型的s1和s2是否相等
String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); System.out.println(s1.equals(s2));
输出结果:true,true。
结果分析:
- ==号和equals方法的区别
- ==是一个比较运算符号
- 既可以比较基本数据类型 ==> 基本数据类型比较的是值
- 也可以比较引用数据类型 ==> 引用数据类型比较的是地址值
- equals方法是一个方法,只能比较引用数据类型,所有的对象都会继承Object类中的方法,如果没有重写Object类中的equals方法,equals方法和==号比较引用数据类型无区别,重写后的equals方法比较的是对象中的属性
- ==是一个比较运算符号
- String类重写equals方法:
- public boolean equals(Object anObject)
- 将此字符串与指定的对象比较。
- 当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。
- 覆盖:
- 类 Object 中的 equals
- 参数:
- anObject - 与此 String 进行比较的对象。
- 返回:
- 如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false。
- 另请参见:
- compareTo(String), equalsIgnoreCase(String)
- public boolean equals(Object anObject)
- 注意:str类型是引用数据类型,所有继承Object类的对象都是引用数据类型。
- 所以,s1.equals(s2),只要s1和s2的字符序列相同,即相等。
- 而s1 == s2,则需要参考下图中
- 如果常量池中,没有该常量,则创建一个新的常量,并指向s1;
- 如果常量池中,已经有了该常量,则将常量地址指向s2
- 由于s1和s2指向同一个常量,同一个地址,故相等。
2.下面这句话在内存中创建了几个对象?
String s1 = new String("abc");
答案:两个对象,一个对象在堆内存中,一个在方法区的常量池中。
答案解析:
- 在常量池中,如果没有该常量对象,则会创建一个常量对象。
- new String() 表示在堆内存中创建一个对象,将常量池中常量移动到对象中。
- 常量对象和new String() 对象的地址是不同的,故两个是在不同的内存位置的两个对象。
3.判断定义为String类型的s1和s2是否相等
String s1 = new String("abc"); String s2 = "abc"; System.out.println(s1 == s2); System.out.println(s1.equals(s2));
解答:false 和 true
答案解析:
-
String s1 = new String("abc"); 记录的是堆内存对象的地址值 -
String s2 = "abc"; 记录的是常量池中的地址值
4.判断定义为String类型的s1和s2是否相等
String s1 = "a" + "b" + "c"; String s2 = "abc"; System.out.println(s1 == s2); System.out.println(s1.equals(s2));
解答:true 和 true
答案解析:
- java中有常量优化机制,会将"a" + "b" + "c"编译时直接作为"abc"的常量放在常量池中
- 比如:byte b = 3 + 4; 在编译时就会变成了7,将7赋值给b。
5.判断定义为String类型的s1和s2是否相等
String s1 = "ab"; String s2 = "abc"; String s3 = s1 + "c"; System.out.println(s3 == s2); System.out.println(s3.equals(s2));
解答:false 和 true
答案解析:
-
Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过
StringBuilder(或StringBuffer)类及其append方法实现的。
4. String类的判断功能
- boolean equals(Object obj): 比较字符串的内容是否相同,区分大小写
-
View Code
package com.heima.string; public class Demo4_StringMethod { /** boolean equals(Object obj): 比较字符串的内容是否相同,区分大小写 */ public static void main(String[] args) { String s1 = "heima"; String s2 = "heima"; String s3 = "heiMa"; System.out.println(s1.equals(s2)); // 输出true System.out.println(s2.equals(s3)); // 输出false } }
-