String详解
1 存储原理
-
String属于java.lang.String类,表示字符串,是引用数据类型。
-
使用双引号括起来的都是String对象,在整个生命周期内是不可变的。
-
显式的String常量放在方法区中的常量池,String对象放在堆中。
-
垃圾回收器是不会释放常量的。
package com.yupeng.string; public class StringTest01 { public static void main(String[] args) { // 字符串拼接表示一个新的字符串对象,所以以下两行代码表示共创建了3个字符串对象,分别是"abc","xy","abcxy" String sa = "abc"; // sa中保存的是字符串"abc"的内存地址 String sb = "abc"+ "xy" ; // sb中保存的是字符串"abcxy"的内存地址 // 第一句执行后在常量池中创建了一个字面量为string1的String类型对象 // 第二句执行时,常量池中已经存在string1,就不再创建新的String类型对象 // ==双等号比较的是引用中保存的对象地址 // 引用s1和s2在栈中,保存的都是"string1"字符串对象在方法区内存池的内存地址 String s1 = "string1"; String s2 = "string1"; System.out.println(s1 == s2); // true /*以下例子表明字符串对象之间的比较不能使用==,要调用String类的equals方法*/ // 在类加载时,就在常量池中创建了一个值为string2的String对象 // 第一句执行时会在堆里创建new String("string2")对象 // 第二句执行时,因为常量池中存在string2,所以就不再创建新的String对象了,直接在堆里创建new String("string2")对象。 // 两个引用s3和s4指向两个不同的堆中的String对象,但这两个对象中保存的都是同一个字面量String2的内存地址 String s3 = new String ("string2"); String s4 = new String ("string2"); System.out.println(s3 == s4); // false System.out.println(s3.equals(s4)); // true // 分析以下程序共创建了几个对象? // 共3个:方法区常量池1个:"hello";堆内存中两个String对象 String str1 = new String ("abcd"); String str2 = new String ("abcd"); } }
2 常用方法
2.1 常用构造方法
package com.yupeng.string;
public class StringTest02 {
public static void main(String[] args) {
// 最常用的方式
String s1 = "hello world!";
// 将字节数组转换为字符串
byte[] bytes = {97, 98, 99}; // 97是a,98是b,99是c
String s2 = new String(bytes);
// String类已经重写了toString方法,输出字符串对象的时候,不是输出内存地址,而是输出对象本身
System.out.println(s2); // abc
System.out.println(s2.toString()); // abc
// String(字节数组,数字元素的下标起始位置,长度)
// 将字节数组中的一部分字符转换为字符串
String s3 = new String(bytes, 1, 2);
System.out.println(s3); // bc
// 将字符数组转换为字符串
char[] chars = {'你', '好', '世', '界'};
String s4 = new String(chars);
System.out.println(s4); // 你好世界
// 将字符数组中的一部分字符转换为字符串
// String(字符数组,下标起始位置,长度)
String s5 = new String(chars, 2, 2);
System.out.println(s5); // 世界
}
}
2.2 charAt方法
输出指定位置的字符
public class StringTest03 {
public static void main(String[] args) {
String s1 = "中国人";
char c = s1.charAt(1);
System.out.println(c);
}
}
2.3 compareTo方法
字符串之间比较大小(了解)
public class StringTest03 {
public static void main(String[] args) {
System.out.println("abcd".compareTo("abcd")); // 0
System.out.println("abcd".compareTo("abcf")); // -2
System.out.println("abcd".compareTo("abcc")); // 1
}
}
2.4 contains方法
判断前面的字符串是否包含后面的字符串
System.out.println("abcd".contains("ab")); // true
System.out.println("abcd".contains("xyz")); // flase
2.5 endWith和startWith方法
判断当前字符串是否以某个字符串结尾或开始
System.out.println("test.java".endsWith(".java")); // true
System.out.println("test.java".endsWith(".txt")); // false
System.out.println("test.java".startsWith("test")); // true
2.6 equals方法
比较两个字符串方法是否相等,必须使用equals方法,不能使用"=="
2.7 equalsIgnoreCase方法
比较两个字符串方法是否相等,并且同时忽略大小写
System.out.println("ABc".equalsIgnoreCase("abc")); // true
2.8 getBytes方法
将字符串对象转换为字节数组
byte[] bytes = "ascm".getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.println(bytes[i]); // 97 115 99 109
}
2.9 isEmpty方法
判断某个字符串是否为空字符串(底层通过length判断)
String s = "";
System.out.println(s.isEmpty()); // true
2.10 length方法
返回字符串的长度
System.out.println("abcd".length()); // 4
// 注意区分判断数组长度和字符串长度,判断数组长度是属性:.length,判断字符串长度是方法:.length()
2.11 replace方法
替换字符串
String newString = "http://www.baidu.com".replace("http://", "https://");
System.out.println(newString); // https://www.baidu.com
2.12 split方法
拆分字符串
String[] ymd = "1980-10-10".split("-"); // 以“-”将“1980-10-10”分隔符进行拆分
for (int i = 0; i < ymd.length; i++) {
System.out.println(ymd[i]);
} // 1980 10 10
2.13 substring方法
截取字符串
System.out.println("substring方法");
System.out.println("http://www.baidu.com".substring(7)); // www.baidu.com
System.out.println("http://www.baidu.com".substring(7, 10)); // www 左闭右开,包含起始位置7,不包含结束位置10
2.14 toCharArray方法
将字符串转换称char数组
char[] chars = "你好世界".toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.print(chars[i] + " "); // 你 好 世 界
}
2.15 toLowerCase和toUpperCase方法
转换为大小写
System.out.println("ABHSFKHdkjDGSH".toLowerCase()); // abhsfkhdkjdgsh
System.out.println("ABHSFKHdkjDGSH".toUpperCase()); // ABHSFKHDKJDGSH
2.16 trim方法
去除字符串前后空白
System.out.println(" hello world! ".trim()); // hello world!
2.17 valueOf方法
String类中只有valueOf方法是静态方法,将非字符串转换为字符串
String str = String.valueOf(true);
System.out.println(str); // true
// 参数是一个对象的时候,自动调用该对象的toString()方法
// Customer类没有重写toString方法,所以输出的是内存地址
System.out.println(String.valueOf(new Customer())); // com.yupeng.string.Customer@1b6d3586
System.out.println(new Customer()); // com.yupeng.string.Customer@4554617c
class Customer{
}
System.out.println()
方法调用了valueOf方法,而valueOf方法又调用了toString方法,所以打印输出到控制台的都是字符串。