1.Sting类的含义
Sring类:代表字符串。是一个final类,代表不可变的字符序列。字符串是常量,用双引号引起来表示。值在创建后不能更改。String对象的字符串内容是存储在一个字符数组value[]中的。
2.String类的一些特点
String:字符串,使用一对“”引起来表示
-
String声明为final的,不可被继承
-
String实现了Serializable接口:表示字符串是支持序列化的。
String实现了Comparable接口:表示String可以比较
-
Sring内部定义了final char[] value用于存储字符串数据
-
String:代表不可变的字符序列。简称:不可变性。
体现: 1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。 2.当对现有字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。 3.当调用String的replace()方法修改指定的字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。 -
通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
-
字符串常量池是不会存储相同内容的字符串。
3.String对象的实例化方式
字面量定义的方式
String str=“hello”;
通过构造器
String s1=new String();
String ss2=new String(String original);
String s3=new String(char[] a);
String s4=new String(char[] a,int startIndex,int count);
字面量定义的数据在方法区中的字符串常量池中, 即相同字符串共用一个地址值。
new构造器声明的数据,存储在堆空间中。
使用类实例化传入String的值,如图所示,带参构造器使用的字面量赋值的方式,两个String类型的name地址值一致
String s=new String("abc");方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构域,另一个是char[]对应的常量池中的数据:“abc”
注意点
Sring s1=“hello”; String s2=“he”; String s3=s2+“llo”;
此时,s3在堆中开辟地址。
String s4=s3.intern();//intern方法强制s3在常量池中声明
此时s4与s1地址一致
final声明的字符串类型在常量池中开辟空间,无论其以何种方式赋值
4.常用方法
//小写
String s2=s1.toLowerCase(Locale.ROOT);
System.out.println(s2);
System.out.println(s1);
//大写
s2=s1.toUpperCase(Locale.ROOT);
System.out.println(s2);
System.out.println(s1);
//去掉首尾空格
String s3=" hello world ";
String s4=s3.trim();
System.out.println("-----"+s3+"-----");
System.out.println("-----"+s4+"-----");
//忽略大小写比较字符是否相等
System.out.println(s2.equalsIgnoreCase(s1));
//连接
System.out.println("-------------------------");
s3="abc";
s4=s3.concat("def").concat(" ").concat("aaa");
System.out.println(s4);
//比较字符串大小
//小于0,当前小
String s5="abc";
String s6="abe";
System.out.println(s5.compareTo(s6));//涉及字符串排序
//取字符串子串
String s7="abcdef";
System.out.println(s7.substring(2));
System.out.println(s7.substring(2,5));//左闭右开
//测试字符串是否以指定的后缀结束、以指定的前缀开始
s1="adasdaddsd";
boolean b1=s1.endsWith("dsd");
System.out.println(b1);
System.out.println(s1.startsWith("a"));
System.out.println(s1.startsWith("as",2));//从第二位开始以指定前缀开始
//判定一个字符串是否包含另一个字符串
System.out.println(s1.contains("sdad"));
//返回出现查找字符串的第一个索引值
System.out.println(s1.indexOf("dad"));//没找到时返回-1
System.out.println(s1.indexOf("dad",3));//从3开始往后找
System.out.println(s1.lastIndexOf("sd"));//从后向前找,返回索引以前是从前向后,找的为右边第一个
//替换字符串中的指定字符或指定字符串替换为新的字符或字符串
s1="helloworld,world";
s2=s1.replace("l","r");//替换字符
System.out.println(s1);
System.out.println(s2);
s2=s1.replace("world","java");//替换字符串
System.out.println(s2);
s2=s1.replaceFirst("world","java");
System.out.println(s2);
//把字符串中的数字换成","
s1="1hello2world3";
s2 = s1.replaceAll("\\d+", ",");
System.out.println(s2);
//删除开头和结尾的逗号
s2=s1.replaceAll("\\d+", ",").replaceAll("^,|,$","");
System.out.println(s2);
//正则表达式
//匹配
//匹配给定的正则表达式
s1="12345";
System.out.println(s1.matches("\\d+"));
//判断字符是否符合格式
s2="0571-4534289";
System.out.println(s2.matches("0571-\\d{7,8}"));
//切片
//以指定字符切割字符串到字符串数组中
s1="hello|world|java";
String[] s1s=s1.split("\\|");
System.out.println(s1);
for (String s:s1s){
System.out.print(s+" ");
}
System.out.println();
s2="hello.world.java";
System.out.println(s2);
String[] s2s=s2.split("\\.");
for (String s:s2s){
System.out.print(s+" ");
}
5.String与char型数组和byte型的数组相互转换
与char[]的转换:调用方法toCharArray()
与byte[]的转换:调用方法getBytes()