字符串的概述与分类
1.字符串的分类
不可变字符串:String :当前对象创建完毕之后,该对象的内容是不能改变的 ,一旦内容改变就是一个新的对象。
可变的字符串:StringBuilder/StringBuffer:当对象创建之后,该对象的内容可以发生改变,对象保持不变。
2.接口CharSquence
实现子类有:CharBuffer,Segment,String,StringBuilder,StringBuffer
3.字符串的本质是对char数组封装
crtl+shift+t看某个类
crtl+o看某个方法
深入String类分析
public class Demo06 {
public static void main(String[] args) {
String str1 = "2019";
System.out.println(str1);
str1 = "2020";
//str1引用的内存地址发生了改变
System.out.println(str1);
}
}
String 对象的创建
String str1 = "ABCD";
//直接赋一个字面量
String str2 = new String("ABCD");
//通过构造器创建
String对象的空值:
//1.表示引用为空
String str1 = null;
//2.内容为空的字符串
String str2 = "";
判断字符串非空:
1.字符串引用非空
2.字符串不能为空字符串
字符串的比较操作:
1.使用"=="号
只能比较引用的内存地址是否相同
2.使用equals方法。
在object类中和"=="相同,建议子类覆盖equals方法比较内容
String面试题分析
面试题一:
问题一:
String str1 = "ABCD"; 和String str2 = new("ABCD");有什么区别
问题二:
下面代码分别创建了几个String对象?
String str1 = "ABCD"; 和String str2 = new("ABCD");
常量池:专门存储常量的地方。
编译常量池:把字节码加载进Jvm的时候,存储的是字节码的相关信息
运行常量池:存储常量数据
String str1 = "ABCD";最多只创建一个String对象,最少不创建String对象。如果常量池中,存在"ABCD",那么str1直接引用,此时不创建String对象。否则先在常量池中创建"ABCD"内存空间,再引用。
String str2 = new("ABCD");最多创建两个对象,至少创建一个String对象。new关键字:绝对会在堆空间,创建内存区域,所以至少创建一个String对象。
public class Demo07 {
public static void main(String[] args) {
String str1 = "ABCD";
String str2 = new String("ABCD");
System.out.println(str1==str2); //false
System.out.println(str1.equalsIgnoreCase(str2)); //true
}
}
面试题二:
下列String对象之间是否相等
public class Demo07{
private static String getx() {
return "AB";
}
public static void main(String[] args) {
String str1 = "ABCD";
String str2 = "A"+"B"+"C"+"D";
String str3 = "AB"+"CD";
String str4 = new String("ABCD");
String temp = "AB";
String str5 = temp+"CD";
String str6 = getx()+"CD";
String str7 = (new StringBuilder(String.valueOf(temp))).append("cd").toString();
/*
* 实质为
String str1 = "ABCD";
String str2 = "ABCD";
String str3 = "ABCD";
String str4 = new String("ABCD");
String temp = "AB";
String str5 = (new StringBuilder(String.valueOf(temp))).append("cd").toString();;
String str6 = (new StringBuilder(String.valueOf(getx()))).append("cd").toString();;
*/
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str1==str4);
System.out.println(str1==str5);
System.out.println(str1==str6);
System.out.println();
}
}
1、单独使用""创建的字符串都是直接量,编译期就已经确定存储到常量池中。
2、使用new String("")创建的对象会存储在堆内存中,是运行期才创建。
3、使用只包含直接量的字符串连接符如"aa"+"bb"创建的也是直接量,编译期就能确定,已经确定存储到常量池中。
4、使用包含String直接量(无final修饰符)的字符串表达式,创建的对象是运行期才创建的,存储在堆中。
通过变量,调用方法去连接字符串,都只能在运行期才能确定变量的值和方法的返回值,不存在编译器优化操作。
String类的常用方法
import java.util.Arrays;
public class Demo08 {
public static void main(String[] args) {
builderString();
getStringInFo();
stringEquals();
toupper_lower();
}
private static void toupper_lower() {
/*
* String toUpperCase();
* String toLowerCase();
*/
String str1 = "AhHiGHNhO";
System.out.println(str1.toUpperCase());
System.out.println(str1.toLowerCase());
}
private static void stringEquals() {
/*
* boolean equals(Object anObject); 将字符串与指定的对象比较
* boolean equalsIngoreCase(String anotherString);将字符串与指定的字符串比较,不考虑大小写
* boolean contentEquals(CharSquence cs); 将字符串与指定的CharSquence比较
*/
String str1 = new String("ABCD");
String str2 = "ABCD";
String str3 = "abCD";
System.out.println(str1==str2);
System.out.println(str1.contentEquals(str2));
System.out.println(str1.equalsIgnoreCase(str3));
System.out.println(str1.contentEquals("ABCD"));
}
private static void builderString() {
/*
* byte[] getBytes() 将字符串转换为byte数组
* char[] toCharArray() 将字符串转换为字符数组
* String(byte[] bytes) 将byte数组转化为字符串
* String(char[] values) 将char数组转换为字符串
*/
char[] arr = new char[] {'A','B','C'};
//将char数组转换成字符串
String str1 = new String(arr);
System.out.println(str1);
//将字符串转换为char数组
char[] arr1 = str1.toCharArray();
System.out.println(arr1);
//byte和字符串相互转换
System.out.println(Arrays.toString("ABCDE".getBytes()));
}
public static void getStringInFo() {
// int length() 返回字符串长度
// char cahrAt(int index) 返回指定索引的处的char值
// int indexOf(String str) 返回指定字符串在此字符串中第一次出现的位置
// int LastIndexOf(String str) 返回指定字符串在此字符串最后一次出现的位置
String str = new String("DABCDBA");
System.out.println(str.length());
System.out.println(str.charAt(3));
System.out.println(str.indexOf("HI"));
System.out.println(str.indexOf("CD"));
System.out.println(str.lastIndexOf("DA"));
}
}