1—String简述
特点:
(1)String是类类型变量。
(2)String类是final类,一旦赋值就不能被改变。
(3)字符串是由字符组成的,可以看成是字符数组。
(4)字符串在内存中存储在常量池中。
(5)凡是被双引号圈起来的内容全是字符串常量。String在内存中的特点:
看下面两条语句:String s1="abc"; String s2=new String("abc");
如果内存中没有字符串常量”abc”,s1会新建一个常量并指向它。
如果内存中已经有常量”abc”,s1就不再新建,而是直接指向该常量。而第二条语句 s2,不论内存中有没有该常量,都新建一个。
String的比较方法 equals :
boolean b1= s1==s2; boolean b2= s1.equals(s2);
第一句,因为s1和s2存储的是字符串的地址,所以比较的也是两个字符串的地址。
第二句中,因为String 复写了equals方法,所以这里比较的是两个字符串内容是否相同。注意:
字符串s1指向”abc”,字符串s2指向一个new对象,对象指向一个字符串常量。
2—字符串常见方法
常用构造方法:
String() //无参构造函数 String(s) //新建一个字符串。 String(char []) //用全部字符数组元素顺序组成一个字符串。 String(char [],offset,len) //用部分字符数组元素顺序组成一个字符串。 String(byte []) //用全部字节数组元素顺序组成一个字符串。需要解码为字符。 String(byte [],offset,len) //用部分字节数组元素顺序组成一个字符串。需要解码为字符。
常用方法:
boolean s.equals(Object oo) //将字符串与指定对象比较。 boolean s.equalsIgnoreCase(str)//将字符串与指定对象比较并忽略大小写。 boolean s.contains(str) //判断字符串是否包含指定字符串。 boolean s.isEmpty() //判断字符串是否为空字符串。 boolean s.startsWith(str) //判断字符串是否以指定字符串开头。 boolean s.endsWith(str) //判断字符串是否以指定字符串结尾。 char charAt(index) //获取字符串在指定角标位的字符。 int s.length() //获取字符串的长度。 int s.indexOf(str) //获取s中str的开头角标位,不存在返回-1 。 int s.indexOf(str,from) //获取s中从指定角标开始的str的角标位。 int s.lastIndexOf(str) //逆向获取角标位。 int s.compareTo(str) //比较两字符串的每个字符,如果全相等,返回0。 String s.substring(index) //截取字符串,从指定位置到结尾。 String s.substring(from,to) //截取指定始末角标的字符串。 String s.toLowerCase() //字符串转成全小写。 String s.toUpperCase() //字符串转成全大写。 String s.trim() //字符串去掉首尾的多个空格。 String s.concat(str) //将指定字符串连接到当前字符串。 String s.replace(char1,char2) //将字符串中的char1替换为char2。 String s.replace(str1,str2) //将字符串中的str1替换为str2。 String String.valueOf(Object oo)//获取对象的字符串表示形式。 String s.replaceAll(reg,str) //将符合正则规则的字符串替换成str。 char [] s.toCharArray() //将字符串转成字符数组。 byte [] s.getBytes() //将字符串转成字节数组。 String [] s.split(reg) //将符合正则规则的字符串作为切割符,切割成字符串数组。 boolean s.matches(reg) //判断字符串是否与正则表达式匹配。
字符串的常用获取功能。
class Demo { public static void main(String [] args) { String s="abcdabcd"; System.out.println(s.length()); //打印字符串长度。8 System.out.println(s.charAt(4)); //打印字符串4角标位上的字符。a System.out.println(s.indexOf('a')); //打印a字符第一次出现的角标位。0 System.out.println(s.indexOf('a',2)); //打印a字符从2角标位以后第一次出现的位置。4 System.out.println(s.lastIndexOf('a')); //打印a字符从右往左第一次出现的位置。4 System.out.println(s.substring(2)); //截取子字符串,从2角标到末尾。cdabcd System.out.println(s.substring(2,5)); //截取子字符串,从2角标到5角标。cda System.out.println(s.compareTo("abc")); //比较两个字符串,返回一个正整数。5 System.out.println(s.concat("abc")); //打印两字符串连接起来的字符串形式。abcdabcdabc System.out.println(s.trim()); //打印字符串去掉首尾空格的表示形式。abcdabcd System.out.println(s.replace('a','A')); //打印替换所有a字符的新字符串。AbcdAbcd System.out.println(s.replace("cd","CD"));//打印替换所有cd字符串的新字符串。abCDabCD System.out.println(String.valueOf(s)); //打印s的字符串表示形式。abcdabcd } }
注意:
-
s.length() 一定要加括号,这和数组的length不同。
lastIndexOf(str) 虽然是反向索引字符串,但返回的还是找到的子字符串的开头角标位。
(3)substring(from) 只有一个参数时,截取的是从from到末尾的新字符串。注意此方法名全小写。
(4)s.compreTo(str) 该方法返回整数,只有在两字符串相等时,才返回0,
否则返回第一个对应字符不相等的ASCII码整数差。
如:abcd 与 abad 第三个字符不相等,并且c比a的ASCII码整数大2,所以返回2.
(5)字符串是final类,所有返回字符串的方法放回的都是一个新字符串。
知识点:
–模拟 trim方法,去掉字符串两端空格class Demo { public static void main(String [] args) { String s=" ni hao "; System.out.println(myTrim(s)); } public static String myTrim(String s) { int start=0,end=s.length()-1; while (start<=end && s.charAt(start)==' ') start++; while (start<=end && s.charAt(end)==' ') end--; return s.substring(start,end+1); } }
注意:
- 截取字符串时,两个参数包含头不包含尾。
-
s.length() 一定要加括号,这和数组的length不同。
字符串的常用判断功能,如下示例:
class Demo { public static void main(String [] args) { String s="Demo.java"; System.out.println(s.isEmpty()); //s是否为空,false System.out.println(s.contains("java")); //s是否包含java,true System.out.println(s.startsWith("Demo")); //s是否以Demo开头,true System.out.println(s.endsWith(".java")); //s是否以 .java 结尾,true System.out.println(s.equals("demo.java")); //s是否内容和demo.java 相等,false System.out.println(s.equalsIgnoreCase("demo.java"));//不区分大小写时s是否和demo.java 相等,true } }
字符串中的常用转换功能,如下示例:
class Demo { public static void main(String [] args) { char [] chArr={'a','b','c','d','e','f'}; String s1=new String(chArr); String s2=new String(chArr,2,3); //从0+2角标开始,取三个数组元素组成字符串。 System.out.println(s1.toUpperCase());//打印s1的大写表示形式。 System.out.println(s2); char [] ch=s2.toCharArray(); //将字符串转成字符数组。 byte [] byteArr={11,26,48,56,67,78,89}; String s3=new String(byteArr); String s4=new String(byteArr,2,4); System.out.println(s3); System.out.println(s4); } }
字符串切割功能。
-
(1)字符串切割是以指定的字符串作为切割符,把字符串切成短字符串,并添加到一个字符串数组中。
(2)切割符是一种正则规则,这里只简单看做一个短字符串,不考虑复杂的正则规则。
字符串切割方法示例:
class Demo { public static void main(String [] args) { String s="zhangsan,lisi,wangwu,zhaoliu"; String [] arr=s.split(","); //对包含多个姓名的字符串切割分段成每个姓名字符串。 for (String str : arr) //高级for 循环 { System.out.println(str); } } }
注意:
-
(1)切割符如果是小数点,需要转义字符转义。
(2)高级for循环是for循环的一种简写形式。
(3)split方法实际传递的参数是正则表达式。
-
(1)字符串切割是以指定的字符串作为切割符,把字符串切成短字符串,并添加到一个字符串数组中。
3—扩展知识
StringBuilder :字符串缓冲区。
特点:长度可变,可以添加字符串以及一系列操作。常用方法:
int sb.length() //缓冲区的长度 int sb.indexOf(str) //str在缓冲区中第一次出现的位置索引 int sb.indexOf(str,from) //str在缓冲区中指定角标以后第一次出现位置的索引 char sb.charAt(index) //缓冲区指定角标上的字符 StringBuilder sb.reverse() //将缓冲区内容反转 StringBuilder sb.append(Object oo) //缓冲区添加元素 StringBuilder sb.delete(start,end) //缓冲区指定角标的内容删除 StringBuilder sb.deleteCharAt(index) //删除缓冲区指定角标上的字符 StringBuilder sb.insert(offset,Object oo) //从起始位偏移指定长度插入一个元素 StringBuilder sb.replace(start,end,str) //将缓冲区中指定始末的内容替换成字符串str String sb.substring(start) //从指定位置截取字符串内容并返回新的缓冲区 String sb.substring(start,end) //从指定始末位置截取字符串返回到新的缓冲区 String sb.toString() //缓冲区的字符串表示形式
StringBuilder 方法示例:
class Demo { public static void main(String [] args) { StringBuffer sb=new StringBuffer(); sb.append("123"); //添加一个字符串 sb.append(987); //添加一个整数值 sb.append(true); //添加一个布尔值 System.out.println(sb.length()); //打印缓冲区长度 System.out.println(sb.toString()); //打印缓冲区字符串表示形式 System.out.println(sb.delete(0,3)); //删除0,1,2角标的字符 System.out.println(sb.replace(3,7,"false"));//替换3,4,5,6角标 "true" 为"false"。 System.out.println(sb.insert(0,"AAA")); //从0角标插入字符串 System.out.println(sb.substring(6)); //截取字符串打印 } }
注意:
-
(1)StringBuilder 也是可以直接打印的,但是需要用String类型时,需要转成 String 。
(2)添加的元素都以字符串表示。
-
(1)StringBuilder 也是可以直接打印的,但是需要用String类型时,需要转成 String 。
StringBuffer: 字符串缓冲区。
StringBuffer 和 StringBuilder 用法基本一致。区别: StringBuffer是线程安全的,但是效率低;
StringBuilder 是线程不安全的,但是效率比较高。
一般使用 StringBuilder 。
4—String 练习
练习一:
将字符串指定部分反转。
先将要反转的部分取出,然后反转,然后replace替换。class Demo { public static void main(String [] args) { String str="abcd1234abcd"; String s=reverse(str,4,7); System.out.println(s); } public static String reverse(String str,int start,int end) { String s=str.substring(start,end+1); //截取字符串包含头不包含尾,所以要多截取一位。 StringBuilder sb=new StringBuilder(); //新建一个字符缓冲区。 for (int x=0;x<s.length();x++) { sb.append(s.charAt(x)); //往字符缓冲区添加元素。 } return str.replace(s,sb.reverse().toString()); //返回原字符串替换后的字符串。 } }
练习二:
获取一个字符串在另一个字符串中出现的次数。class Demo { public static void main(String [] args) { String str="nidnshiwodnsdeshednsme"; System.out.println(time(str,"dns")); } public static int time(String str,String s) { int index=0,count=0; while (index!=-1) { count++; index=str.indexOf(s,index+s.length()); } return count; } }
练习三:
获取两个字符串中最大相同子串class Demo { public static void main(String [] args) { String str="chfoyhellodutjg"; String s="dofhelloxga"; System.out.println(time(str,s)); } public static String time(String str,String s) { int L = s.length(); String s0=s; while (str.indexOf(s0)==-1) //当不是整串包含时,才会进入循环。 { L--; for (int n=0;n+L<=s.length();n++) { s0=s.substring(n,n+L); if (str.indexOf(s0)!=-1) return s0; //这里返回的只有一个字符子串,也有可能包含相同长度的多个字串。 } } return s; //如果原字符串包含在另一个字符串,就会在这里直接返回。 } }