1.字符串的概念
多个字符(char)连接起来组合成的字符序列。例如:“中国”。
2.常量池
字符串的定义方式:
1).
String s = "Hello World";//创建对象并引用到常量池中
String s1 = "Hello World";//从常量池中引用,不创建新的对象。
定义s时,JVM通过字符串常量池查找不到内容为"Hello World"的字符串对象存在,那么会创建这个字符串对象,然后将刚创建的对象的引用放入到字符串常量池中,并且将引用返回给变量s。
定义s1时,JVM通过查找字符串常量池,发现内容为”Hello World”字符串对象存在,于是将已经存在的字符串对象的引用返回给变量s1。这里不会重新创建新的字符串对象。 s与s1指向同一对象,即s=s1。
2).使用new创建
String s = "Hello World";//创建对象并引用到常量池中
String s1 = new String("Hello World");//建立新的对象
使用new来构造字符串对象的时候,不管字符串常量池中有没有相同内容的对象的引用,新的字符串对象都会创建在堆内存中。s与s1不指向同一对象,此时s1 != s 。
3.字符串-常用Api
1)length():显示字符串长度。
String s ="hello";
System.out.println(s.length());//显示字符串长度:5
2)toCharArray():将字符串转为数组。
String s = "hello";
char[] c = s.toCharArray();//建立新的数组,将s复制进新的数组中。
System.out.println(Arrays.toString(c));//打印结果:[h,e,l,l,o]
3)charAt():根据位置找到字符串中某个字符。
String s = "hello";
System.out.println(s.charAt(1));//显示1位置的字符:e
for(int i = 0 ; i<s.length();i++) {
System.out.print(s.charAt(i)+"\t");//依次按位置显示字符: h e l l o
}
4)toUpperCase()/toLowerCase():将字符串转为大写/小写。
String s = "hello";
String s1 =s.toUpperCase();//将字符串转为大写
System.out.println(s1);//HELLO
System.out.println(s1.toLowerCase());//将字符串转为小写:hello
5)compareTo()/equals():比较字符串大小(字符串进行比较大小时依照同一个字符位置进行比较:结果为0则相等,结果为正则前者大于后者,结果为负则前者小于后者) /判断字符串是否相等。
String s = "hello";
String s1 ="HELLO";
System.out.println(s.equals(s1));//判断字符串是否相等:flase
System.out.println(s.equalsIgnoreCase(s1));//不区分大小写判断字符串是否相等:true
System.out.println(s.compareTo(s1));//比较字符串大小:结果为正,即s>s1。
6)trim()/isEmpty():去掉字符串首位/尾位的空格。/判断字符串是否为空。
String s = "hello ";
System.out.println(s.length());//显示字符串长度:6
System.out.println(s.trim().length());//去掉字符串首尾空格,显示新字符串的长度:5
System.out.println(s.isEmpty());//判断字符串是否为空:flase
7)subString()/subString( , ):从当前位置截取之后的字符串形成新的子字符串(包含当前位置字符)。/从前者位置截取到后者位置的字符串形成新的子字符串(不包含后者位置的字符)。
String s = "hello-world";
System.out.println(s.substring(6));//截取s[6]之后的字符串:world
System.out.println(s.substring(0, 5));//[0,5).截取s[0]到s[4]的字符串:hello
8)indexOf()/lastIndexOf()/indexOf(char, ):找到某个字符的位置。/找到某个字符的最后一个位置。/从后者位置开始找第一个需要字符的位置。
String s = "hello-world-java";
System.out.println(s.indexOf("-"));//找到‘-’的位置:5
System.out.println(s.lastIndexOf('-'));//找到最后一个‘-’的位置:11
System.out.println(s.indexOf("-", 6));//从s[6]开始找‘-’的位置:11
9)concat():将两个字符串连接起来。
String s = "hello";
String s1 = "-world";
System.out.println(s.concat(s1));//拼接两个字符串:hello-world
10)replace():将字符串中的某个字符或字符串替换为新的字符或字符串。
String s = "hello";
System.out.println(s.replace("hello", "world"));//结果:world
System.out.println(s.replace("h", "w"));//结果:wello
4.正则表达式
1.概述:正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
2.普通字符:
1)[abc]:匹配 […] 中的所有字符(只选取一个)。
String s = "a";
String pattern = "[abc]";//匹配字符串中是否含有[abc]中的一个
System.out.println(s.matches(pattern));//结果:true
2 )[ ^abc]:匹配除了 […] 中字符的所有字符。
String s = "a";
String pattern = "[^abc]";//匹配字符串中是否含有除过[abc]的字符
System.out.println(s.matches(pattern));//结果:false
3)[A-Z]:[A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字。
String s = "a";
String pattern = "[^abc]";//匹配字符串中是否含有[a-z]区间的字符
System.out.println(s.matches(pattern));//结果:true
4). :匹配除换行符(\n、\r)之外的任何单个字符,相等于 [ ^\n\r]。
String s = "a";
String pattern = ".";//匹配除换行符(\n、\r)之外的任何单个字符
System.out.println(s.matches(pattern));//结果:true
5)\w:匹配字母、数字、下划线。等价于 [A-Za-z0-9_]。
String s = "a";
String pattern = ".";//匹配字母、数字、下划线
System.out.println(s.matches(pattern));//结果:true
3.限定符
代码如下:
String s = "hello";
System.out.println(s.matches("[a-z]*"));//结果:true
System.out.println(s.matches("[a-z]+"));//结果:true
System.out.println(s.matches("[a-z]?"));//结果:false
System.out.println(s.matches("[a-z]{5}"));//结果:true
System.out.println(s.matches("[a-z]{5,}"));//结果:true
System.out.println(s.matches("[a-z]{0,5}"));//结果:true
4.特殊符号
1)| :左右两边表达式之间 “或” 关系,匹配左边或者右边
2)():
···在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
···取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到
代码如下:
判断数字是否在18到60之间
String s = "61";
String pattern = "([2-5][0-9])|(1[8-9])|(60)";
System.out.println(s.matches(pattern));//结果:false
5.其他运算方法
1)replaceAll():根据正则表达式进行字符串的替换。
找到字符串的字母部分
String s = "h4e4l7l0o5wor4ld0";
String pattern = "[^a-z]";//非字母。即只要字母
System.out.println(s.replaceAll(pattern,""));//结果:helloworld
2)split():将字符串按照正则表达式规则拆分为字符串数组。
String s = "刘备-关羽-张飞";
String pattern = "-";
String[] s1 = s.split(pattern);
System.out.println("大哥:"+s1[0]);//结果:大哥:刘备
System.out.println("二哥:"+s1[1]);//结果:二哥:关羽
System.out.println("三弟:"+s1[2]);//结果:三弟:张飞
5.简单例题
1.将一个字符串进行反转,例如:”abcd” ➡ “dcba”。
循环方法:
public void test() {
String s = "abcd";
char[] cha =s.toCharArray();
for(int i = 0;i<cha.length/2;i++) {
char c = cha[i];
cha[i] = cha[cha.length-1-i];
cha[cha.length-1-i]=c;
}
s = new String(cha);
System.out.println(s);
}
StringBuilder方法:
public void test() {
String s = "abcd";
StringBuilder s1 = new StringBuilder(s);
StringBuilder s2 =s1.reverse();
s=s2.toString();
System.out.println(s);
}
2. 判定输入的一个字符串是否全为数字,使用两种方式完成。
循环方式:
public void test() {
String s = "45651";
char[] cha = s.toCharArray();
boolean f= true;
for(int i = 0;i<cha.length;i++) {
if(cha[i]<='0'||cha[i]>='9') {
f=!f;
break;
}
}
System.out.println(f);
}
正则表达式:
public void test() {
String s = "1561";
String pattern = "[0-9]+";
System.out.println(s.matches(pattern));
}
3. String str = “<h1>这是测试结果</h1><p>test a</p>”; 去除标签字符串。
public void test() {
String s ="<h1>这是测试结果</h1><p>test a</p>";
String pattern = "(<[a-z][0-1]*>)|(</[a-z][0-1]*>)";
s =s.replaceAll(pattern, "");
System.out.println(s);
}
4.输入一个由小写字符组成的字符串,统计出每个字符出现的次数。
public void test() {
String s ="ajdiosajidnlkcxzlkmiasdl";
char[] cha = s.toCharArray();//将字符串转化为数组
int[] count =new int[26];//存储26个字母出现的次数:count[0]---a;
for(int i = 0;i<cha.length;i++) {
count[cha[i]-'a']+=1;//cha[i]-'a' =字符串出现的字母对应的count数组位置。
}
for(int i = 0;i<count.length;i++) {
System.out.println((char)(i+'a')+"出现的次数为:"+count[i]+"次");//char(i+'a')=count数组位置对应的字母。
}
}