常用类-String类
1.1. String类不可变
- String是一个字符串类,是不可变的字符串
- 一旦改动字符串内容 就是生成新的对象
- 底层存储使用的是字符数组,使用final修饰 因此不可更改
1.2.常用的方法
1,构造方法
public static void main(String[] args) {
String s1 = new String();// ""
String s2 = new String("java");// "java"
char[] chars = {'9', '中', 'c', 'd', 'e'};
String s3 = new String(chars, 2, 3);
byte[] bytes = {65, 66, 99, 100};
String s4 = new String(bytes);// 是字符的ascii码值
System.out.println(s4);//
}
2,常见的字符编码
01101010
ACSII 每个字符都占用要一个字节 128
ISO-8859-1 ,欧洲用到字符是远远多于128个的 对ASCII码进行了扩展 2个字节可以存储65536 字符
GBK/ GB2312 针对中文的字符编码 中文汉字一般占用2个字节
乱码 字符的编码和解码用的字符编码不一致
UTF定义了一套规范 统一全球的编码规范
UTF-8 中文汉字一般占用3个字节,英文字符只占一个字节
UTF-16
3,比较判断方法
- length() 返回字符串字符序列长度
- equals() 返回boolean值
- equalsIgnoreCase() 返回boolean值
- startsWith() 返回boolean值
- endsWith() 返回boolean值
4,将字符串转化数组方法:split();
public static void main(String[] args) {
// String类内部使用字符数组保存 字符串序列
String s1 = new String("JavaSM"); // char[] str={'j','a','v','a' }
String s2 = new String("javasm");
// length() 字符串中字符的长度
int length = s1.length();
System.out.println("字符串长度" + length);
// 1,equals()比较的是字符序列是否一一相等
boolean flag1 = s1.equals(s2);
System.out.println("使用equals进行比较" + flag1);
// 2,equalsIgnoreCase()比较的是字符序列是否一一相等
boolean flag2 = s1.equalsIgnoreCase(s2);
System.out.println("使用equalsIgnoreCase忽略大小写进行比较" + flag2);
// 3,startsWith()
boolean flag3 = s1.startsWith("JavaSM", 0);
System.out.println("是否以某个字符串开头" + flag3);
// 4,endsWith()
boolean flag4 = s1.endsWith("JavaSM");
System.out.println("是否以某个字符串结束" + flag4);
}
4,字符串搜索
-
indexOf()
-
lastIndexOf()
返回字符或者字符串出现的索引值
如果找不到返回值都是 -1
public static void main(String[] args) {
String a = "javasmvava";//char[]
int index = a.indexOf('a',12);
int lastIndex = a.lastIndexOf('a');
System.out.println("字符首次出现的索引值" + index);
System.out.println("字符最后一次出现的索引值" + lastIndex);
// char-> int
int strIndex = a.indexOf("vab");
int strLastIndex = a.lastIndexOf("va");
System.out.println("字符串首次出现的索引值" + strIndex);
System.out.println("字符串最后一次出现的索引值" + strLastIndex);
}
5,提取字符串
- char chartAt() 返回char
- String trim() 去除前后空格
- replace() 替换
- replaceAll()
public static void main(String[] args) {
String s1 = "javasunoracle";//char[] {j,a,v,a}
/* System.out.println(s1.hashCode());
s1 = "sm";
System.out.println(s1.hashCode());*/
// 返回指定的索引对应的字符
char c = s1.charAt(1);// return
System.out.println(c);
String s2 = s1.trim();
System.out.println(s1);
System.out.println("去除前后空格" + s2);
String s3 = s1.replace('a', 'w'); //jwvw
String s4 = s1.replaceAll("av", "wb");
System.out.println(s3);
System.out.println("替换所有" + s4);
System.out.println(s1);// jwvw
// concat 拼接
String s5 = s1.concat("oracle");
System.out.println("拼接 " + s5);
// substring 截取字串
String s6 = s1.substring(4);
// 前闭后开 [)
String s7 = s1.substring(4, 7);
System.out.println(s6);
System.out.println(s7);
// 切分
String[] strs = s1.split("a");
System.out.println(Arrays.toString(strs));
}
// 按指定符号进行拼接字符串
String join = String.join("&", "java", "sun","oa");
System.out.println(join);
6,大小写转换
public static void main(String[] args) {
String s1 = "javaSUNoracle";//char[] {j,a,v,a}
String s2 = s1.toUpperCase();
System.out.println(s2);
String s3 = s1.toLowerCase();
System.out.println(s3);
}
扩展点:
//可变长参数 传0或者多个都可以 本质上是一个数组来接收
public static String join(CharSequence delimiter, CharSequence... elements) {
Objects.requireNonNull(delimiter);
Objects.requireNonNull(elements);
// Number of elements not likely worth Arrays.stream overhead.
StringJoiner joiner = new StringJoiner(delimiter);
for (CharSequence cs: elements) {
joiner.add(cs);
}
return joiner.toString();
}
7,格式转换
public static void main(String[] args) throws UnsupportedEncodingException {
String s1 = "中国abc";
//1,转字节数组,默认使用UTF-8进行编码解码
byte[] bytes = s1.getBytes("GBK");
System.out.println(Arrays.toString(bytes));
String string = new String(bytes,"GBK");
System.out.println(string);
//2,转字符数组
char[] chars = s1.toCharArray();
System.out.println(Arrays.toString(chars));
}
1.3.字符串常量池
- JVM为了节省内存空间 提高性能 提供了一个字符串常量池
- 在给String引用赋值的时候 会首先查看常量池中是否有此字符序列 如果没有就创建 如果有直接返回内存地址
- 使用+连接字符串的时候 如果都是字符串常量 也是先去常量池中查找;如果+ 旁边有变量 此时生成的字面量会放入一个临时缓冲区中
public static void main(String[] args) {
String s1 = "java";
String s2 = "java";
String s3 = new String("java");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
String s4 = "javasm";
s1 = s1 + "sm";
//s1 = "java" + "sm";
System.out.println(s1 == s4);//true
}
StringBuffer/StringBuilder可变长
1.1. StringBuffer类
StringBuffer是线程安全的,性能较低
StringBuilder线程不安全,性能较高
常用方法
public static void main(String[] args) {
StringBuilder stringBuilder2 = new StringBuilder();
StringBuilder stringBuilder1 = new StringBuilder("ja");
System.out.println(stringBuilder1.hashCode());
//append是追加 在原串后面添加字符串
stringBuilder1.append("va");
stringBuilder1.append("sun");
System.out.println(stringBuilder1);
// 获取长度
System.out.println(stringBuilder1.length());
// 颠倒字符序列 reverse会改动源字符序列
// StringBuilder reverse = stringBuilder1.reverse();
System.out.println("源SB:" + stringBuilder1);
// System.out.println(reverse);
// 索引: [)
stringBuilder1.delete(2, 4);
System.out.println("delete :" + stringBuilder1);
//指定索引位 进行插入
stringBuilder1.insert(1, "oracle");
System.out.println("insert:" + stringBuilder1);
}