day0607–String类_副本
-
jar是一种压缩方式,常用的引用类型
-
java.lang包 核心类 Math System
-
字符串对象不可变
string常用类
-
字节数组
byte[] bytes = str.getBytes(); char[] chars = str.toCharArray();
// 字符编码:人认识符号转换为计算机认识的字节数组形式/
-
字符解码
Arrays.toString(bytes)); Arrays.toString(chars) // 字符解码:字节转换为人认识的符号
-
大写
String str2 = str.toUpperCase();
-
小写
str.toLowerCase()
-
截取
str.charAt(0)
str.substring(7) str.substring(4, 7);[4,7)
-
字符串拼接
会产生两个字符串对象
str.concat("www"));
-
替换
str.replace("Sun", "www")); str.replaceAll("Sun", "WWW"));
-
去除空格 前后的
str.trim()
-
切分,返回值是字符串数组
String[] as = str.split(""); System.out.println(Arrays.toString(as));
-
查找
indexOf() 如果指定的字符/字符串 不存在 返回值都是 -1;-1表示找不到。首次出现索引
str.indexOf('w') lastIndexOf 找不到 也是返回值是-1 str.lastIndexOf("Son")
-
判断前缀
str.startsWith("ja")
-
判断后缀
str.endsWith("jav")
-
判断字符串内容相等
str.equals(“java”)
忽略大小写str.equalsIgnoreCase(“JAVA”))
public boolean equals(Object anObject) { //先比较地址 if (this == anObject) { return true; } //再比较内容 if (anObject instanceof String) { String aString = (String)anObject; if (coder() == aString.coder()) { return isLatin1() ? StringLatin1.equals(value, aString.value) : StringUTF16.equals(value, aString.value); } } return false; }
-
比较
compareTo返回值情况: 0:两个对象相等 正数:第一个对象大 负数:第二个对象大
str.compareTo("jav")
/**
* 常见的面试题
*/
private static void method10() {
String str1 = new String("java");
String str3 = new String("java");
String str2 = "java";
String str4 = "java";
String str5 = "javaSun";
// +两边都是字符串常量,拼接后的字符串对象依然在运行时常量池中;
// +两边一旦出现了变量, 拼接后的字符串对象临时放到一个缓冲区中 而不在运行时常量池中
String str6 = str2 + "Sun"; //javaSun
System.out.println(str1 == str3); //false
System.out.println(str1.equals(str3));//true
System.out.println(str2 == str4); // true
System.out.println(str1 == str2); //false
System.out.println(str5 == str6); //true
}
string字符串
-
字符串是常量,创建后不可以改变(对象不可变,引用可变),其源码是final修饰。保存在字符串池中,属于方法区,可以共享(为了达到这个节省空间的目的,string必然不可以修改,相应的string相关的包也都是不修改值的。比如a,b,c都指向同一个地址,如果为了修改a,修改了该地址的内容,那么b,c就受到了影响)
-
这里可以想到string储存敏感数据就很危险
如果重要的数据(保存在内存中)在使用后没有及时清理,有可能会导致信息泄漏。开发人员通常都回用String 保存敏感数据(密码,卡号等)。因为String 对象是不可变的,只有 JVM 的垃圾回收器才能从内存中清除String的值。而只有内存不足的时候虚拟机才会执行垃圾回收,所以我们不能保证垃圾回收什么时候进行。当系统崩溃后,memory dump 可能会泄漏敏感数据。
Memory dump : 内存转存
用途:存一个当时内存的副本,可以用工具打开复原当时的情况。因为东西都在内存里当重要数据不需要再使用的时候,保证把它清除掉。用byte 数组 或 character 数组来代替一些不可变的对象,比如String。应为byte 和 character 数组能用程序清理掉。
-
当我们写String name =“hello”;时是name引用hello所在的地址。
-
修改:会重新开辟空间,一个新的字符串的地址给name
-
==判断相等,引用类型数据用的是地址,这里可以用equals
-
+两边都是字符串常量,拼接后仍在运行时常量池中;两边一旦出现了变量,拼接后的字符串对象临时放到了一个缓冲区中,不在常量池中
StringBuffer和StringBuilder
-
可变
-
字符串拼接常用
-
StringBuffer:线程安全,性能较低(内部有线程同步);多线程应用中使用
-
StringBuilder:线程不安全,性能高;只能在单线程项目中使用
-
内部也是使用字节数组 存储字符内容 value没有final修饰符
-
拼接
// append追加字符串 拼接 stringBuilder2.append("Sun");
-
插入
// 插入 指定位置进行插入 stringBuilder2.insert(4, "123");
-
查找
System.out.println("indexOf首次出现 :" + stringBuilder2.indexOf("Son")); System.out.println(" lastIndexOf: " + stringBuilder2.lastIndexOf("Sun"));
-
替换
// 使用新的字符替换指定索引所对应的字符 stringBuilder2.setCharAt(0, 'n'); // [start,end) replace() stringBuilder2.replace(7, 10, "www");
-
倒置(特有的,相比较string)
// reverse倒置 // stringBuilder2.reverse();
-
删除
// 删除某个字符 指定索引所对应的字符 stringBuilder2.deleteCharAt(4); // [start,end) stringBuilder2.delete(6, 9);
-
转换
// toString 把StringBuilder对象 转换为String类型 String string = stringBuilder2.toString();