在考核的时候突然发现自己对字符串的掌握不够然后总结一下
一.字符串
字符串(String)是用一对双引号括起来的零个或多个字符组成的有限序列。在Java中,字符串被当作对象来处理。
程序中需要用到的字符串可以分为两大类:
String类:创建之后不会再做修改和变动的字符串常量;
StringBuffer类:创建之后允许再做更改和变化的字符串变量。
串的两种最基本的存储方式是顺序存储方式和链接存储方式。
1.String类字符串
字符串变量必须赋值后才可以使用,这称为字符串对象初始化。
字符串的创建和赋值的方式有三种:
String 字符串变量名;
字符串变量名="字符串常量";
String username="";
username="Tom"
或者
String 字符串变量名="字符串常量";
String SayHello="Hello world";
或者
String studentName=new String("周杰杰");
2.获取字符串的长度
length()方法是用来获取字符串长度的。它会返回字符串对象中所包含的字符的个数,例如:
public class myfirst {
public static void main(String[] args) {
String sayHello="Hello,Welcome to Java!!!"; //创建一个sayHello字符串并赋值
int length=sayHello.length(); //创建一个变量length存放所获取的字符串长度
System.out.println(length);
}
}
运行结果为:24
注意:字符串中的标点或空格在计算字符串长度时,也要包括在内。
3.字符串的输入
next()和nextLine都是Scanner类中的方法,而且作用都是获取输入的String类型的内容。
具体代码实现:
Scanner scanner=new Scanner(System.in);
String string=scanner.next();
String string1=scanner.nextLine();
那么重点来了,那他们又有什么区别呢?这就要先了解他们的处理机制了。
1.next
next():
它会自动地消除有效字符之前的空格,只返回输入的字符,不会得到带空格的字符串。
也就是说如果输入了一串字符,到了有空格的时候就会停止录入,只录入空格前面的东西,空格后面的东西(包括分隔的空格都会保留在缓存区域)
除了空格以外,Tab键和Enter键都被视为分隔符(结束符)。
2.nextLine()
nextLine():
它返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。
也就是说输入一串字符,它就可以接受所有字符包括空格,但是遇到回车Enter就会停止录入,只录入前面的东西。
3.搭配使用
搭配使用:他们也是可以搭配使用的哦。
它们可以单独使用,也可以搭配使用,搭配使用可以处理很多的录入情况。
情况1
如果想录入一个字符串,但是中间有一个空格间隔。
例如:如果想录入:你好 再见。
具体代码实现:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
//如果想录入:你好 再见
String string = scanner.next();
String string1 = scanner.next();
System.out.println(string);
System.out.println(string1);
//如果没有第二个next(),那么只能输出‘你好’,没有‘再见’
//第一个next()录入‘你好’,然后遇到空格停止,将空格以及后面的‘再见’保存到缓存区,第二个next()则直接跳过空格,录入‘再见’。
//也可以直接用nextLine
String string2 = scanner.nextLine();
System.out.println(string2);
}
情况2
如果想录入一个字符串,但是中间有一个回车Enter。
例如:如果想录入:
你好
再见
具体代码实现:
String string = scanner.next();
String string1 = scanner.next();
System.out.println(string);
System.out.println(string1);
//与上面一样,也是用两个next()。第一个next()录入你好,将回车和‘再见’保存到缓冲区,第二个next()跳过回车,直接录入再见。
//也可以用nextLine()和nextLine()搭配使用
String string2 = scanner.nextLine();
String string3 = scanner.nextLine();
System.out.println(string2);
System.out.println(string3);
//第一个nextLine()录入回车之前的‘你好’,遇到回车结束,‘再见’保存到缓冲区,第二个nextLine()直接录入‘再见’。
//也可以用nextLine()和next()搭配使用
String string4 = scanner.nextLine();
String string5 = scanner.next();
System.out.println(string4);
System.out.println(string5);
//同样的道理,第一个nextLine()录入回车之前的‘你好’,遇到回车结束,‘再见’保存到缓冲区,第二个next()直接录入‘再见’。
特别注意:nextLine()前面有输入语句怎么解决nextLine()不运行的问题
特别注意:!!!
在录入中间有回车的字符串的时候,不要使用next()和nextLine()的配合,next会将回车之前的字符串录入,将回车以及后面的内容留在缓存区,next()直接去缓存区录入数据,结果上来就碰上了回车,(还没有开始就结束了),那么缓存区回车后面的内容自然就无法接受了
解决方法:可以在next()和nextLine()中间再加一个nextLine(),让新加的这个nextLine()将回车吸收,结束,然后最后的nextLine()就可以直接录入数据了。
代码实现:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String string1= scanner.next();
String string2= scanner.nextLine();
String string3= scanner.nextLine();
System.out.println(string1);
System.out.println(string3);
}
二.字符串基本操作
Java语言提供了几种对字符串的操作函数或方法
1.字符串连接
最常用对字符串进行的操作之一就是将两个字符串连接起来,合并为一个字符串。
String类提供连接两个字符串的方法concat(),语法格式为:
string1.concat(string2);
concat()方法返回一个字符串,是将字符串string2添加到string1后面之后形成新字符串,例如:
public class myfirst {
public static void main(String[] args) {
String sayHello1="Hello,"; //创建字符串sayHello1、sayHello2并赋值
String sayHello2="Welcome to Java!!!";
String sayHello3=sayHello1.concat(sayHello2); //将合并后的字符串赋值给sayHello3
System.out.println(sayHello3);
}
}
运行结果为:Hello,Welcome to Java!!!
也可以直接使用字符串字面量来调用concat()方法。例如:
String sayHello3="Hello,".concat("welcome to Java!!!")
连接字符串还可以使用加号“+”运算符。
这是一个重载了的运算符,用来直观地连接两个字符串,它使用起来比concat()方法更加灵活。
例如:
String 字符串3=字符串1+字符串2;
注意:
当表达式中包含多个加号,并且存在各种数据类型参与运算时,则按照加号运算符从左到右进行运算;
Java会根据加号运算符两边的操作数类型来决定是进行算术运算还是字符串连接的运算。
2.字符串比较
(1).比较两个字符串是否相等
equals()方法,它是比较两个字符串是否相等,返回值boolean值;
equalsIgnoreCase()方法,同样返回值为boolean值,使用格式为:
字符串1.equals(字符串2); //严格比较字符串是否相同
字符串1.equalsIgnoreCase(字符串2); //忽略字母大小写来进行比较
例如:
public class myfirst {
public static void main(String[] args) {
String sayHello1="HELLO"; //创建两个字符串
String sayHello2="hello";
System.out.println(sayHello1.equals(sayHello2)); //使用equals方法进行严格比较
System.out.println(sayHello1.equalsIgnoreCase(sayHello2)); //使用equalsIgnoreCase方法忽略大小写进行比较
}
}
运行结果为:
false
true
(2).比较两个字符串的大小
我们可以使用compareTo方法比较两个字符串的大小,
(1).若调用方法的字符串比较参数字符串大,返回正整数;
(2).若比参数字符串小,则返回负整数;
(3).若两字符串相等,则返回0;
(4).若两个字符串各个位置的字符都相同,仅长度不同,则返回值为两者长度之差。
public class myfirst {
public static void main(String[] args) {
String sayHello1="HELLO";
String sayHello2="hello";
System.out.println(sayHello1.compareTo(sayHello2)); //比较两个字符串的大小
}
}
3.字符串的查找和截取字符串
(1).查找:
(1).int indexOf(char ch):搜索字符ch出现的第一个索引号,如果没有找到匹配,则返回-1;
(2).int indexOf(char ch,int fromIndex):从fromIndex位置开始搜索字符ch出现的第一个索引号;
(3).int indexOf(String str):搜索字符串str出现的第一个索引号。
例如:
public class myfirst {
public static void main(String[] args) {
String s1="abcdefg"; //创建字符串s1并赋值
System.out.println(s1.indexOf('c')); //输出字符'c'的索引号
System.out.println(s1.indexOf('c',5)); //输出索引号为5的字符是否是字符'c'
System.out.println(s1.indexOf("de")); //输出字符串出现的第一个索引号
}
}
运行结果为:
2
-1
3
(2).截取字符串:
String substring(int index):提取从位置索引开始的字符串部分;
String substring(int beginindex,int endindex):提取beginindex到endindex-1为止的字符串部分。
例如:
public class myfirst {
public static void main(String[] args) {
String s1="abcdefg";
System.out.println(s1.substring(3)); //截取开始位置为3的字符串
System.out.println(s1.substring(2, 5)); //截取开始索引为2,结束索引为5但不包含5的字符串
}
}
运行结果为:
defg
cde
4.字符串替换
字符串替换是用新字符去替代字符串中指定的所有字符,String类提供的replace方法可以实现这种替换。语法格式为:
string1.replace(char oldchar,char newchar)
例如:
public class myfirst {
public static void main(String[] args) {
String s1="abcdeag";
char oldchar='a'; //被替换字符
char newchar='A'; //替换字符
String s2=s1.replace(oldchar, newchar); //进行替换
System.out.println("替换后的字符串为:"+s2); //输出新字符串
}
}
运行结果为:
替换后的字符串为:AbcdeAg
5.字符数组转换为字符串
我们可以将字符数组转换为字符串,然后利用字符串对象的属性和方法,进一步对字符串进行处理,例如:
public class myfirst {
public static void main(String[] args) {
char []helloArray= {'h','e','l','l','o'}; //声明一个字符数组
String helloString=new String(helloArray); //将字符数组作为构造函数的参数
System.out.println(helloString);
}
}
运行结果为:
hello
6.字符串转换为字符数组
我们也可以将字符串转换为字符数组,这需要使用字符串对象的一个方法toCharArray()。它返回一个字符串对象转换过来的字符数组。例如:
public class myfirst {
public static void main(String[] args) {
String helloString ="hello"; //声明一个字符串变量并赋值
char []helloArray=helloString.toCharArray(); //进行字符串和字符数组的转换
for(int i=0;i<helloArray.length;i++) { //for循环输出字符数组
System.out.print(helloArray[i]+" ");
}
}
}
运行结果为:
h e l l o
7.字符串转数字
1、使用包装类的 valueOf() 方法
通过包装类的 valueOf() 方法,可以将字符串转换为想要的包装类,Byte、Short、Integer、Long、Float、Double 都有对应的 ValueOf() 方法。
String str = "123";
Integer a = Integer.valueOf(str); // 123
Double b = Double.valueOf(str); // 123.0
2、使用包装类的 parseXXX() 方法
通过包装类的 parseXXX() 方法,可以将字符串转换为想要的基本数据类型
String str = "456";
int a = Integer.parseInt(str); // 456
int b = Double.parseDouble(str); // 456.0
3、将字符串的字串转化为数字
String str = "123456";
int a = Integer.valueOf(str.substring(0,3)); // 123
int b = Integer.valueOf(str.substring(3,6)); // 456
4、字符转化为数字
String str = "123456";
int a = str.charAt(0) - '0'; // 1
5、数字转化为字符串
1、String的 valueOf() 方法
这是最常用的方法,对于包装类以及基本数据类型都适用。
Integer a1 = 123;
int a2 = 456;
String str1 = String.valueOf(a1); // "123"
String str2 = String.valueOf(a2); // "456"
2、直接拼接空字符串
int a = 123;
String str = a + ""; // "123"
3、包装类的 toString() 方法
注意该方法只适用于包装类,基本数据类型需要先调用包装类的 valueOf() 方法再使用。
Integer a1 = 123;
String str = a1.toString(); // "123"
int a2 = 456;
Integer b = Integer.valueOf(a2);
String str2 = b.toString(); // "456"
三.StringBuilder类
可变字符串,StringBuilder对象的内容可以修改。
打印SrtirngBuilder打印的不是地址值,是属性值。
1.StringBuilder类的常用方法
1)拼接:append()方法
使用append()方法可实现字符串的拼接操作,返回拼接后的StringBuilder对象。
2)反转:reverse()方法
使用reverse()方法可实现StringBuilder字符串的反转操作。
3)删除:delete(int start, int end)方法
删除字符串中指定索引范围为 [start,end) 的所有内容。
Java中大多数范围均为左闭右开区间。
StringBuilder sb = new StringBuilder("hello");
sb.append("world");
sb.delete(5,8); //删除索引范围为[5,8)内的所有内容,即从w开始删除到l之前
System.out.println(sb); //输出hellold
4)插入:insert(int start, 任意数据类型)方法
在索引start处开始插入任意数据类型的内容。插入内容的起始索引是start。
StringBuilder sb1 = new StringBuilder("hello");
sb1.insert(2,77);
System.out.println(sb1); //输出he77llo
sb1.insert(3,"ooo");
System.out.println(sb1); //输出he7ooo7llo
2.StringBuilder与String的相互转换
1)String转为StringBuilder
① 构造方法StringBuilder(String str)
StringBuilder sb = new StringBuilder("hello");
1
② 字符串拼接方法append(String str)
StringBuilder sb = new StringBuilder();
sb.append("123");
2)StringBuilder转为String
通过StringBuilder对象调用toString()方法
String str = sb.toString();
String、StringBuilder、StringBuffer的区别
String为不可变字符串类,StringBuilder、StringBuffer为可变字符串类。
StringBuilder类性能较高,但存在线程安全问题; StringBuffer类线程安全,但性能较差。
四.StringJoiner
1.StringJoiner 概述
StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。
JDK8出现的
2. StringJoiner 构造方法
方法名 说明
public StringJoiner (间隔符号) 创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner (间隔符号,开始符号,结束符号) 创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号
3. StringJoiner 成员方法
方法名 说明+
public StringJoiner add (添加的内容) 添加数据,并返回对象本身public int length0返回长度(字符出现的个数)public String toString0返回一个字符串(该字符串就是拼接之后的结果)
练习:
public static void main(String[] args) {
// 1.创建一个对象 并指定中间的建个字符
StringJoiner sj = new StringJoiner("---");
// 2. 添加数据
sj.add("aaa").add("bbb").add("ccc");
System.out.println(sj); // aaa---bbb---ccc
// 3.创建另一个对象
StringJoiner sj2 = new StringJoiner(",", "[", "]");
// 4. 添加对象
sj2.add("aaa").add("bbb").add("ccc");
System.out.println(sj2); // [aaa,bbb,ccc]
// 5.打印长度
int len = sj2.length();
System.out.println(len); // 15
// 6.转换字符串
String str = sj2.toString();
System.out.println(str); // [aaa,bbb,ccc]
}
三、总结
1.String
表示字符串的类,定义了很多操作字符串的方法。
1.StringBuilder
一个可变的操作字符串的容器。
可以高效的拼接字符串,还可以将容器里面的内容反转。
1.StringJoiner
JDK8出现的一个可变的操作字符串的容器,可以高效,方便的拼接字符串。