字符串对象创建后不能被改变
String s = "asd";
String s1 = "asd";
String s2 = new String("asd")
System.out.println(s==s1); // true
System.out.println(s==s2); // false
System.out.println(s.equals(s2); // true
字符串存储在字符串常量池中,首先来到s他在常量池里找有没有abc,没有则创建一个然后把地址给s。之后s1来在常量池里发现有abc,则把s的地址给s1,所以他俩一模一样
s2是在堆内存中创建的,不一样
String类中的equals复写了Object中的,只比较内容,不比较地址
构造函数
String(byte[] arr)
: 将数组元素拼接成字符串
byte[] arr = {'a', 67, 68, 69};
String s = new String(arr);
System.out.println(s); // aCDE
String(char[], int offset, int length)
: 从数组中的offset角标取,取length个拼成字符串
char[] arr = {'a', 'w', 'g', 'u'};
String s = new String(arr, 1, 3);
System.out.println(s); // wgu
字符串操作
-
s.charAt(int index) 获取s中index角标的字符
-
s.indexof(int ch) 返回s中第一次出现ch的角标 没找到返回-1
-
s.indexof(int ch, int fromIndex) 返回从s中指定位置开始第一次出现ch的角标
-
s.indexof(String str) 返回s中第一次出现str的角标
-
s.indexof(String str, int fromIndex) 返回从s中指定位置开始第一次出现str的角标
-
s.lastIndexof 四种参数形式同上 改成最后一次出现/从指定位置从后往前找
-
s.substring(int begin, int end) 返回子串, 左闭右开
-
s.substring(int begin) 返回子串
-
s.split(String regex) 参数是字符串,支持正则表达式,分割后的元素放在数组中
-
s.toCharArray() 将字符串转换为字符数组
-
String s = "asni"; byte[] b = s.getBytes(); //将字符串转换为字节数组
输出97 115 110 105
-
s.toUpperCase()/s.toLowerCase() 不改变原字符串
-
s.replace(char old, char new) 用new替换old,如果s中没有old字符则不变
String s = "asni"; String s1 = s.replace('q','d'); System.out.println(s==s1); //输出true,若把q改为a输出false
-
s.replace(String old, String new) 字符串替换
-
s.trim() 去除s两端空格
-
s.concat(String s1) 将s1连接到s后面
-
s.equalsIgnoreCase(String s1) 忽略大小写判断俩字符串相等
-
s.contains(String str) s中是否包含str ,其实和indexof一样,不包含就返回-1
-
s.startsWith(String str)/s.endsWith(String str) 是否以指定字符串开头/结尾
-
s.compareTo(String str) 按字典顺序比较,等返回0,s大返回正数,否则负数
StringBuffer
字符串缓冲区,是用来存储数据的容器
特点:1.长度可变 2.可以存不同类型的数据 3.最后转成字符串
构造函数StringBuffer(),构造一个不带字符的缓冲区,初识容量为16个字符
方法
返回的都是StringBuffer对象
- sb.append(ElementType e) 将e添加到sb中
StringBuffer sb = new StringBuffer();
sb.append(4).append(false); //sb变成4false
- sb.insert(int offset, ElementType e) 在offset角标插入e
sb.append("haha");
sb.insert(1,"sht");
System.out.println(sb); // hshtaha
-
sb.delete(int start, int end) 删除,左闭右开
sb.delete(0, sb.length()) 清空
-
sb.deleteCharAt(int index) 删除指定位置元素
-
sb.charAt(int index)
-
sb.indexof(String)/sb.lastIndexof(String)
-
sb.replace(int start, int end, String s) 用s替换start~end,左闭右开
-
sb.setCharAt(int index, char c) 将index角标替换为c
-
sb.setLength(int length) 设置缓冲区长度
-
sb.reverse() 反转
StringBuilder与StringBuffer操作一模一样,但是StringBuffer是线程安全(同步)的,而StringBuilder是未同步的,速度更快。比如StringBuffer在插入时就不能查找,每次都要判断锁