字符串
Java中没有字符串类型,Java中提供了一个预定类,很自然的叫做String,用双引号括起来的都叫做String。
1.子串
(1)substring方法
substring(a,b)的方法从字符串中取一个字串,从a取到b-1,类似于python的切片。子串的长度位b-a。
String greeting="hello";
String s=greeting.substring(0,3);
System.out.println(s);
输出为:hel
2.拼接
(1)Java中允许用+号来连接两个字符串。
(2)如果是字符串与非字符串连接,后者会转化为字符串。
3.不可变的字符串
String中没有提供可以修改字符串中某一个字符的方法,如果想要修改字符串的内容,可以用substring的方法,先提取字符串,在用+修改字符串。
在Java中字符串变量只是指向公共储存池中的字符串,如果想要复制字符串,仅仅可以让其他变量指向该字符串,Java的设计者认为共享带来的效率远远高于提取字符串和拼接字符串。
String greeting="hello";
String s=greeting.substring(0,3)+"p!";
4.检测字符串是否相等
(1)equals方法
区分大小写
(2)equals.IgnoreCase方法
不区分大小写
String greeting="hello";
String greeting1="hello";
String greeting2="Hello";
System.out.println(greeting.equals(greeting1));
System.out.println(greeting.equals(greeting2));
System.out.println(greeting.equalsIgnoreCase(greeting2));
//OUT:true false true
不能用==检测字符串是否相等
因为字符串是储存在公共储存池里,当两个字符串变量都储存相同的字符串地址时用等号结果为true,但是当创建一个相同字符串对象时,在用==就是false
String greeting1="hello";
String greeting3=new String("hello");
System.out.println(greeting3==greeting1);
//OUT:false
5.空串与Null串
(1)空串
“”是一个长度为 0 且占内存的空字符串,在内存中分配一个空间,可以使用 Object 对象中的方法。
判断是否为空串
String greeting1="";
System.out.println(greeting1.equals(""));
System.out.println(greeting1.length()==0);
(2)Null串
Null串直接将字符串赋值给null,null 是空引用,表示一个对象的值,没有分配内存,调用 null 的字符串的方法会抛出空指针异常。
String greeting=null;
System.out.println(greeting!=null&&greeting.length()!=0);
所以检测字符串既不是Null串又不是空串,先要检测是不是Null串,因为如果是Null串,字符串对象没有建立,使用方法时会报错。
6.码点与代码单元
Java char类型
java支持unicode, 并使用UTF-16保存码点,char类型对应双字节的代码单元,若保存特殊字符(其码点大于等于0x10000),Java会使用两个char 类型变量保存。
String.length() 返回字符串所使用的代码单元个数,或者说返回字符串占用的char类型数据个数。
String.codePointCount() 则返回字符串的码点个数,一个字符对应一个码点,所以该方法可以真正返回字符串当中的字符个数。
String.length()返回的是char类型的个数,String.codePointCount()返回的是字符的个数。
String greeting="\uD835\uDD6B";//在UTF-16中占用两个char,也就是两个代码单元
System.out.println(greeting.length());
int cpCount=greeting.codePointCount(0,greeting.length());
System.out.println(cpCount);
//OUT:𝕫 length代码单元为:2 codePointCount码点个数:1
String.charAt(i)返回第i个代码单元,
String.codepointAt(i)返回i 处字符的代码点值
7.构建字符串
有时候如果需要较短的字符串构建字符串,如果用字符串拼接的方式来达到这个目的,效率会比较低,所以我们可以使用StringBuilder类来避免这个问题。
StringBuilder前身是StringBuffer,但是StringBuffer的效率稍有些低,但是允许多线程的添加或删除字符,如果所有的字符串都在单个线程中执行,则应该使用StringBuilder。这两个API是相同的。
StringBulider.append(String A)
追加一个字符串
StringBuilder.append(char c)
追加一个字符
StringBuilder.setChartAt(int index,char c)
在index处添加一个字符
StringBuilder.insert(int index,String A)
在index处添加一个字符串
StringBuilder.delete(int a,int b)
删除【a~b)处的字符串
StringBuilder.deleteAt(int index)
删除index处的字符
String greeting="hello";
StringBuilder builder=new StringBuilder();//创建一个StringBuilder类
builder.append(greeting);
builder.append("world");
builder.append('?');
builder.setCharAt(builder.length()-1,'!');
builder.insert(0,"cwstd ");
builder.delete(0,6);
builder.deleteCharAt(builder.length()-1);
System.out.println(builder.toString());