-
String
- java定义好的类,不需要导包
- java中所有的字符串文字("abcde")都被视为此类的对象
- 字符串不可变,创建后值不能更改
创建字符串
- 使用最多的,直接赋值 字符串在串池(堆内存)是否存在 字符串重复地址值一样
String s = "abc";
- 传递一个字符数组,根据字符数组创建新的字符串对象 每次new都在堆开辟新空间地址值不同
字符串转成字符数组,再拼接
String str = "abc";
char[] arr = str.toCharArray(); //字符串转成字符数组 ['a','b','c']
String s = new String(arr); //abc
- 传递一个字节数组,根据字节数组创建新的字符串对象
- 网络中传输的数据都是字节数据,将字节数据转成字符串
byte[] bytes = {97,98,99}; //ASCII表
String s = new String(bytes); //abc
常用方法
比较
- ==号比较
基本数据类型 == 比较的是数据值
引用数据类型 == 比较的是地址值 new 字符串 地址值不同 直接赋值,相同内容地址值相同
键盘录入的字符串 是new出来的
- 比较字符串内容是否相等 equals()
boolean res = s1.equals(s2);
- 比较字符串内容是否相等 英文忽略大小写 equalsIgnoreCase()
boolean res = s1.equalIgnoreCase(s2);
遍历
键盘录入字符串,遍历每个字符
比较字符大小
Scanner sc = new Scanner(System.in);
String str = sc.next(); //ctrl+alt+v 自动生成左边
//遍历
for(int i=0;i<str.length();i++){
char ch = str.charAt(i); // i 字符串的索引
//比较大小
if( ch >= 'a' && ch <= 'z' ){
//小写字母
}else if( ch >= 'A' && ch <= 'Z' ){
//大写字母
}
else if( ch >= '0' && ch <= '9' ){
//数字
}
}
字符串反转
import java.util.Scanner;
public class ReverseString {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
String res = reverser(str);
System.out.println(res);
}
public static String reverser(String s){
String res = "";
for(int i = s.length()-1;i>=0;i--){ //倒着遍历
char c = s.charAt(i); //得到每个字符
res = res+c; //拼接成字符串
}
return res;
}
}
截取字符串
String substring(int beginIndex,int endIndex) //包头不包尾
String substring(int beginIndex) //截取到末尾
//返回值是截取之后的,原字符串没有变化
字符转成整数
char gender = id.charAt(16); //获取身份证第17位的字符
//利用ASCII码转换
'0' ---> 48
'1' ---> 49
····
'9' ---> 57
int num = gender - 48; //字符转整数
替换
String s = "";
//TMD 替换成 ***
String res = s.replace("TMD","***");
StringBuilder
看成一个容器,创建后内容可变
构造方法 // 空参构造 含参构造
方法
- append(任意类型) 添加数据,并返回对象本身
- reverse() 反转容器中的内容
- length() 返回长度
- toString() 实现把StringBuilder 转换为String
//创建对象
StringBuilder sb = new StringBuilder("abc");
sb.append(1); //abc1
sb.reverse(); //反转后还是保存在sb中
int len = sb.length();
System.out.println(sb); //打印StringBuilder对象 不是打印地址值而是属性值(内容)
String st = sb.toString();
System.out.println(st);
sb.append(1).toString();//链式编程 根据调用完返回的对象类型可以接着调用其他方法
StringBuilder 使用场景:
- 字符串拼接
- 字符串反转
对称字符串
import java.util.Scanner;
public class Symmetry {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
//链式编程
String rStr = new StringBuilder().append(str).reverse().toString();
if(str.equals(rStr)){
System.out.println("str is symmetric");
}else{
System.out.println("str is not symmetric");
}
}
}
StringJoiner 拼接字符串
构造方法 两种含参构造
创建对象
StringJoiner sj = new StringJoiner(间隔符号);
//制定拼接时的间隔符号 如 ","
StringJoiner sj = new StringJoiner(间隔符号,开始符号,结束符号)
//如 ("," , "[" , "]" )
方法
sj.add("abc");//添加元素,只能添加字符串
sj.length(); //所有字符的长度
sj.toString(); //转成字符串类型
字符串原理
字符串拼接底层原理
- 如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串
- 如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。
StringBuilder提高效率原理
- 所有要拼接的内容都会放到StringBuilder,不会创建多余无用空间,节约内存
StringBuilder扩容
- 默认创建长度16的字节数组 //16 容量 sb.capacity();
- 添加的内容长度小于16,直接存
- 添加的内容大于16,扩容(16*2+2)
- 添加的内容大于(16*2+2),以实际长度为准