1.String:字符串,使用一堆""引起来表示
2.String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小
3.String内部定义了final charp[] value 用于储存字符串数据
4.String:代表不可变的字符序列。简称:不可变性。
体现:1.当对字符串重新赋值时候 需要重新指定区域,不能使用原来的value
2.当对现有的字符串进行连接操作时候,也需要重新指定内存区域赋值,不能再原有的value进行赋值
3.当调用String的replace()方法修改指定的字符或字符串时,也需要重新指定内存区域赋值
5通过字面量的方式(区别于new)给一个字符串赋值,词汇的字符串值声明在字符串常量池中
6.字符串常量池中是不会储存相同内容的字符串的
面试题:
String s= new String() 这种方式创建对象 在内存中创建了几个对象?
答:两个:一个在堆空间中new 一个在char[]对应的常量池中的数据“abc”
public class StringTest {
@Test
public void Test1(){
String s1 ="abc";
String s2 ="abc";
System.out.println(s1==s2);//==用于判断你两个对象的地址值
//此时因为在方法区(常量池)中,不能有相同的两个对象,所以指向的是一个对象
s1="LiuRQ";//此时在方法区重新创造一个对象,指向S1
String s3="abc";
s3+="def";
System.out.println(s3);
System.out.println(s2);
}
/*
* String的实例化方式:
* 方式一:通过字面量定义的方式
* 方拾二:通过new+构造器的方式
*/
@Test
public void Test2() {
//通过字面量定义的方式 :此时A1 A2的数据JAVAEE声明在方法区的字符串常量中
String A1="JAVAEE";
String A2="JAVAEE";
//通过new+构造器的方式:此时的A3 A4保存的地址值,是数据在堆空间中开辟的地址值
String A3=new String("JAVAEE");
String A4=new String("JAVAEE");
}
/*
* 结论:1常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2只要其中有一个是变量,结果就在堆中
*/
@Test
public void Test3() {
String C1="CCC";
String C2="DDD";
String C6="CCCDDD";
String C3="CCC"+"DDD";
String C4=C1+"DDD";
String C5=C1+C2;
System.out.println(C3==C6);//ture
System.out.println(C3==C4);//false
System.out.println(C3==C5);//false
}
}
String的常用类
public class TestString {
public static void main (String[]arg) {
//浪费空间!!!!!!
String gh="a";//这里有两个对象
for(int i=0;i<10;i++) {
gh +=i;
}
System.out.println(gh);//总共有12个对象
//计算String类中字符串的个数
String a="abc";
int A=a.length();
System.out.println(A);
//找到字符串中的索引
String b="abcd";
char Aa=b.charAt(3);
System.out.println(Aa);
//找到输出之后的位置
String c="LRQASYT";
int B=c.indexOf("L");
int Bb=c.indexOf("Y",3);
int Bbb=c.lastIndexOf("T");
System.out.println("输出位置1:"+B);
System.out.println("输出位置2:"+Bb);
System.out.println("最后输出总位置:"+Bbb);
//大小写转化
String d="LRQZUINIU";
System.out.println("将字符串变成小写"+d.toLowerCase());
System.out.println("将字符串变成大写"+d.toUpperCase());
//拆分
String e="LRQ:SYT:AAA";
String[] E=e.split(":");
String[] Ee=e.split("AAA");
System.out.println();
//想比较 不同于==
String f=new String("LRQSYT");
String F=new String("SYTLRQ");
System.out.println("两个字符串是否相等"+F.equals(f));
}
}
StringBuffer和StringBuilder
可变字符序列 StringBuilder(线程不安全 效率高)StringBuffer(线程安全 效率不高)
public class TestStringBuilder {
public static void main (String[]arg) {
StringBuilder SB=new StringBuilder();//字符数组长度16
StringBuilder SB1=new StringBuilder(2);//字符数组长度32
StringBuilder SB2=new StringBuilder("abcd");//字符数组长度32,value[]={''}
SB2.append("LRQ");
SB2.append(true).append("123").append("SYT");
System.out.println(SB2);
SB2.delete(2, 2);
SB2.reverse();
System.out.println(SB2);
}
}