java.lang.Object
java.lang.String java.lang包下,不需要导包就可以使用
"abc" 可以看做 字串符对象
String s = "abc" abc 是一个对象 字符串是一个常量,一旦被赋值就不能被改变
s = "cde" //原来的"abc"对象变成垃圾了
常见构造方法:
* A:常见构造方法
* public String():空构造
String s1 = new String();
* public String(byte[] bytes):把字节数组转成字符串
byte[] arr1 = {97,98,99};
String s2 = new String(arr1); // 输出 abc
* public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
* public String(char[] value):把字符数组转成字符串
char[] arr3 = {'a','b','c','d','e'};
String s4 = new String(arr3);
System.out.println(s4); //输出abcde
* public String(char[] value,int index,int count):把字符数组的一部分转成字符串
* public String(String original):把字符串常量值转成字符串
*/
关注点:
public static void demo1() {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // true
// 常量池 没有这个字符串 就创建一个 如果有就直接用 所以s1 和 s2 地址值是同一个 指向常量池的地址
System.out.println(s1.equals(s2)); // true
}
public static void demon2() {
String s1 = new String("abc"); // 创建了2个对象
} // 先在常量池里 创建一个"abc" 对象,再在堆里创建一个 指向常量池里的 "abc"
public static void demo3() {
String s1 = new String("abc"); // 记得是 堆内存的地址值 常量池的副本
String s2 = "abc"; // 记录的是 常量池的地址值
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
}
public static void demo3() {
String s1 = new String("abc"); // 记得是 堆内存的地址值 常量池的副本
String s2 = "abc"; // 记录的是 常量池的地址值
System.out.println(s1 == s2); //false
System.out.println(s1.equals(s2)); //true
}
public static void demo4() {
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2); // true
// java有常量优化机制
System.out.println(s1.equals(s2)); // true
}
public static void demon5() {
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2); // false
// s3是变量 不是常量
System.out.println(s3.equals(s2));
}
// 加号 + 拼接字符串 :底层是通过StringBuilder 或StringBuffer实现的
// s3= s1 + "c" : 先是一个StringBuilder 对象 "ab" ,通过append() 方法 拼接上"c", 变成"abc" ,再用toString() 转成字符串对象"abc"将地址值 赋给s3
String类的判断功能
public static void main(String[] args) {
//demo1(); String 类重写了equals()方法
String s1 = "woaini";
String s2 = "ni";
String s3 = null;
// null 是空常量 可以給任意引用类型赋值,""不行
String s4 = "";
System.out.println(s1.contains(s2)); // 是否包含
System.out.println(s1.startsWith("h"));
System.out.println(s1.endsWith("a"));
System.out.println(s3.isEmpty());// null 是空常量 不能调用任何方法 否则报空指针异常
System.out.println(s4.isEmpty());// ""是空字符串 ,也是字符串的一种,只能给字符串赋值
}