java中的字符串基础
String类
String 类代表字符串, 所有""字符串都是String 类的对象。
String类的特点:
- 字符串不可变, 它的值在创建后不可改变。
- 可以被共享(在常量池中相同的字符串指向同一个地址)
- 字符串效果上相当于char数组, 实际基于byte 数组实现。
String的创建
/*
1.通过构造方法创建
2.直接等号赋值创建
*/
public class StringDemo() {
public static void main(String[] args) {
// 通过构造方法创建一个 ""
String s1 = new String();
// 通过char数组 构造方法创建 "abc"
char[] chs = {'a', 'b', 'c'};
String s2 = new String(chs);
// 通过 byte数组 构造方法 创建 "abc"
byte[] bys = {97, 98, 99};
String s3 = new String(bys);
// 直接赋值创建
String s4 = "abc";
}
}
通过构造方法与直接赋值的区别:
- 构造方法创建字符串不管内容如何, 都会在堆中创建新的内存所以地址不相等。
- 直接赋值创建字符串, 如果内容是相同的, 会直接将已有的地址赋值给新的变量。
/*
验证字符串 两种构建方法的区别
*/
public class StringDemo02 {
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 == s1); // false
String s3 = "abc";
String s4 = "abc";
System.out.println(s3 == s4); // true
}
}
String 的一些操作
内容相等判断:
因为字符串都是对象,栈内存中保存的是地址,所以不能直接使用== 号判断字符串的内容是否相等。
public boolean equals(String s)
方法是String类的成员方法, 作用是判断字符串的内容是否相等。
/*
用户登录案列:
账号: admin 密码: 123
通过Scanner 接收用户输入的字符串, 判断是否登录成功, 3次机会
*/
import java.util.Scanner;
public class LoginDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String username = "admin";
String password = "123";
for (int i = 0; i < 3; i++) {
System.out.println("请输入用户名");
String temp_username = sc.nextLine();
System.out.println("请输入密码");
String temp_password = sc.nextLine();
if (username.equals(temp_username) && password.equals(temp_pssword)) {
System.out.println("登录成功");
break;
} else {
if (2 - i == 0) {
// 没有机会了
System.out.println("你的账号被锁定,请联系管理员");
} else {
System.out.println("登录失败你还剩" + (2 - i) + "次机会");
}
}
}
}
}
字符串遍历
完成一个方法, 作用是逐个打印出传入字符串中的字符。
/*
String类的两个方法
public char charAt(int index); 根据索引返回对应字符
public int length(); //获取字符串的长度
*/
public class StringTest01 {
public static void main(String[] args) {
String s1 = "qwer";
printCharByString(s1);
}
/*
返回值, 无
参数: String
*/
public static void printCharByString(String str) {
for (int i = 0; i < str.length(); i++) {
System.out.println(str.charAt(i));
}
}
}
字符串拼接
完成一个方法, 作用是将数组拼成一个字符串打印
public class StringTest02 {
public static void main(String[] args) {
int[] arr = {1, 2, 3,};
String arrStr = getStringByArray(arr);
}
/*
返回值: String
参数: int[]
*/
public static String getStringByArray(int[] arr) {
String str = "[";
for(int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
str += i;
} else {
str += i + ", ";
}
}
str += "]";
}
}
StringBuilder
因为String不可改变, 频繁字符串拼接会创建多个String对象,造成内存浪费。
StringBuilder可以构建可以改变的字符串。通过构造方法 StringBuilder()
, 接受一个String来穿创建StringBuilder。
常用方法:
- public StringBuilder append(any) 接受一个任意类型 返回拼接后的StringBuilder
- public StringBuilder reverse() 将Stringbuilder反转
- public String toString() 将StringBuilder转为String
/*
字符数组 StringBuilder版
*/
public class StringBuilderTest01 {
public static void main(String[] args) {
int arr = {1, 2, 3};
String arrStr = getStringByArray(arr);
}
/*
返回值: String
参数: int[]
*/
public static String getStringByArray(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]);
} else {
// 链式编程法
sb.append(arr[i]).append(", ");
}
}
return sb.append("]").toString();
}
}
// 完成方法将传入的字符串反转
public class StringBuilderTest02 {
public static void main(String[] args) {
}
public static String reverseStr(String str) {
// 使用链式编程一句话搞定
return new StringBuilder(str).reverse().toString();
}
}