String和StringBuilder类
一.String
所谓的字符串就是值一连串的字符,它是由许多单个字符连接而成的,这些字符必须包含在一对双引号" "之内。
1.字符串的创建
1.1字符串的创建代码示列
public static void main(String[] args) {
//创建一个空白字符串,不包含任何内容
String s1=new String();
System.out.println("s1:"+s1);
//根据字符数组的内容,来创建字符串对象
char[] chs={'a','b','c'};
String s2=new String(chs);
System.out.println("s2:"+s2);
//根据字节数组的内容,来创建字符串对象,会根据ascall码表进行转换
byte[] bys={97,98,99};
String s3=new String(bys);
System.out.println("s3:"+s3);
//直接赋值的方式创建字符串对象
String s4="hahaha";
System.out.println("s4:"+s4);
}
运行结果
s1:
s2:abc
s3:abc
s4:hahaha
知识点补充
- 字符串不可变,它们的值在创建后不能被更改,虽然String的值不可变,但是它们可以被共享。
- 推荐使用直接赋值的方式得到字符串。
1.2构造方法创建和直接赋值方法的比较
public static void main(String[] args) {
//构造方法得到的对象,地址不同
char[] chs={'a','b','c'};
String s1=new String(chs);
String s2=new String(chs);
System.out.println(s1==s2);
//直接赋值的方法得到的对象,s2和s3本质上是相同的,他们的地址会相同
String s3="abc";
String s4="abc";
System.out.println(s3==s4);
}
运行结果
false
true
知识点补充
- 通过构造方法得到的字符串对象,地址值不同。
- 通过直接赋值的方法的字符串,如果内容相同,那么它们本质上是一样的,地址也相同。
2.字符串拼接
public static void main(String[] args) {
String s1 = "abc";
String s2 = "def";
String s3 = "ghi";
String s4 = "jkl";
String sum = s1 + s2 + s3 + s4;//字符串内容不可改变
//abcdef abcdefghi abcdefghijkl会形成新的三个字符串
System.out.println(sum);
}
运行结果
abcdefghijkl
知识点补充
- 因为字符串床架年后它就不能被改变,所以,字符串拼接时是形成了一个额外的新的字符串。
3.字符串内容和地址的比较
public static void main(String[] args) {
//构造方法创建对象
char[] chs={'a','b','c'};
String s1=new String(chs);
String s2=new String(chs);
//直接赋值创建对象
String s3="abc";
String s4="abc";
String s5="Abc";
//比较的是地址值是否一样
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s3==s4);
System.out.println(s4==s5);
System.out.println("------------------");
//比较的是内容是否一样
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s3.equals(s4));
System.out.println(s4.equals(s5));
System.out.println(s4.equalsIgnoreCase(s5));//比较字母忽略大小写
}
运行结果
false
false
true
false
------------------
true
true
true
false
true
知识点补充
- 使用==做比较:
基本数据类型:比较的是数据值是否相同
引用类型:比较地址值是否相同 - 使用equals 做比较
比较字符串内容是否相同
3.1代码示列
登录用户名和密码验证
public static void main(String[] args) {
String username="root";
String password="123456";
Scanner sc=new Scanner(System.in);
int count=3;
while (true){
System.out.println("请输入用户名:");
String name=sc.nextLine();
System.out.println("请输入密码:");
String pwd=sc.nextLine();
if (username.equals(name)&&password.equals(pwd)){
System.out.println("登录成功");
break;
}else {
if (count==0){
System.out.println("你没有机会了");
}else {
System.out.println("你还有"+count+"次机会");
count--;
}
}
}
}
运行结果
请输入用户名:
root
请输入密码:
123456
登录成功
3.字符串的遍历
public static void main(String[] args) {
String s="今宵酒醒何处,杨柳岸,晓风,残月";
//获取字符串长度
int a = s.length();
System.out.println(a);
//字符串遍历
for (int i = 0; i <s.length() ; i++) {
char f=s.charAt(i);
System.out.print(f+" ");
}
}
运行结果
16
今 宵 酒 醒 何 处 , 杨 柳 岸 , 晓 风 , 残 月
4.统计字符类型次数
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入字符串:");
String s = sc.nextLine();
int bigCount=0;
int smallCount=0;
int numberCount=0;
int otherCount=0;
for (int i = 0; i <s.length() ; i++) {
char ch=s.charAt(i); //取出字符串中索引i位的字符
if (ch>='A'&&ch<='Z'){
bigCount++;
}else if (ch>='a'&&ch<='z'){
smallCount++;
}else if (ch>='0'&&ch<='9'){
numberCount++;
}else {
otherCount++;
}
}
System.out.println(bigCount);
System.out.println(smallCount);
System.out.println(numberCount);
System.out.println(otherCount);
}
运行结果
请输入字符串:AA45sfAD6fs
4
4
3
0
5.对数组进行字符串拼接
public static void main(String[] args) {
int[] arr={1,2,3};
String s = arrayToString(arr);
System.out.println("s:"+s);
String s1 = Arrays.toString(arr);
System.out.println(s1);
}
public static String arrayToString(int[] arr){
String s="";
s+="[";
for (int i = 0; i <arr.length ; i++) {
if (i==arr.length-1){
s+=arr[i]+"]";
}else {
s+=arr[i]+", ";
}
}
return s;
}
运行结果
s:[1, 2, 3]
[1, 2, 3]
6.字符串反转
import java.util.Scanner;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入一个字符串:");
String s = sc.nextLine();
String r = reverse(s);
System.out.println(r);
}
private static String reverse(String s) {
String ss="";
for (int i =s.length()-1 ; i >=0 ; i--) {
ss+=s.charAt(i);
}
return ss;
}
运行结果
请输入一个字符串:
assfahfjs
sjfhafssa
二.StringBuilder
1.StringBuilder添加和反转方法和链式编程
public static void main(String[] args) {
//创建对象
StringBuilder sb = new StringBuilder();
sb.append("hello");
sb.append("world");
sb.append("java");
System.out.println("sb:"+sb);
//链式编程
StringBuilder sb1 = new StringBuilder();
sb1.append("hello").append("world").append("haha");
System.out.println("sb1:"+sb1);
//字符串反转
sb1.reverse();
System.out.println("sb1:"+sb1);
}
运行结果
sb:helloworldjava
sb1:helloworldhaha
sb1:ahahdlrowolleh
知识点补充
- String:内容不可变
- StringBuilder:内容可变的
2.StringBuilder和String相互转换
public static void main(String[] args) {
String s="清明上河图";
//String转StringBuilder
StringBuilder sb=new StringBuilder(s);
sb.reverse();
System.out.println(sb);
//StringBuilder转String
String s1 = sb.toString();
System.out.println(s1);
}
运行结果
图河上明清
图河上明清
3.数组元素使用StringBuilder拼接成字符串
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
String s = arrToString(arr);
System.out.println(s);
}
private static String arrToString(int[] arr) {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
sb.append(arr[i]).append("]");
} else {
sb.append(arr[i]).append(", ");
}
}
String s = sb.toString();
return s;
}
运行结果
[1, 2, 3, 4, 5]
4.字符串反转(简化)
public static void main(String[] args) {
String s = "123456789";
String s1 = myReverse(s);
System.out.println(s1);
}
public static String myReverse(String str) {
// StringBuilder sb=new StringBuilder(str);
// String ss=sb.reverse().toString();
// return ss;
return new StringBuilder(str).reverse().toString();
}
运行结果
987654321
5.数组转化成字符串输出(简化)
public static void main(String[] args) {
int[] arr={1,2,3,4,5};
String s= Arrays.toString(arr);
System.out.println(s);
}
运行结果
[1, 2, 3, 4, 5]
6.StringBuffer类
StringBuffer类和StringBuilder差不多, StringBuffer类更安全,但是效率更低,这里就不进行更多的赘述了。