一、字符串的存储
字符串是常量,创建之后不可改变。
字符串字面值存储在字符串池中,可以共享。
String s = “Hello”; 产生一个对象,字符串池中存储。
public static void main(String[] args) {
String str1 = "Hello"; //将 "Hello" 常量存储在字符串池中
System.out.println(str1.hashCode());
//把"张三"赋值给str,但并没有修改"Hello"这块数据,而是重新开辟空间
str1 = "张三";
System.out.println(str1.hashCode());
String str2 = "张三";
System.out.println(str2.hashCode());
//字符串的另一种创建方式 - 会创建两个对象,一个在堆中一个在常量池中,可能造成空间的浪费
String str3 = new String("李四");
}
在我这里的输出结果为:
69609650
774889
774889
可以看到,在修改了str1的字符串之后,地址发生了改变,而新创建的str2内容与地址都和str1相同
证明了"Hello" 和 “张三” 都是在常量池中,创建后将不会改变,并且str1与str2共享了 “张三” 这个字符串,所以地址是相同的
而 “Hello” 这一字符串在没有使用到之后,可能会在某个阶段被认为“垃圾”而被处理掉
思考:以下代码输出的是true
or false
?为什么?(根据上面的图进行思考,具体答案请自行验证)
String str1 = new String("test");
String str2 = new String("test");
System.out.println(str1 == str2);
二、常用方法
方法 | 作用 |
---|---|
public int length() | 返回字符串的长度 |
public char charAt(int index) | 根据下标获取字符 |
public boolean contains(String str) | 判断当前字符串中是否包含str |
public char[] toCharArray() | 将字符串转换成数组 |
public int indexOf(String str) | 查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1 |
public int lastIndexOf(String str) | 查找字符串在当前字符串中最后一次出现的下标索引 |
public String trim() | 去掉字符串前后的空格 |
public String toUpperCase() | 将小写转成大写 |
public String toUpperCase() | 将大写转成小写 |
public boolean startWith(String str) | 判断字符串是否以str开头 |
public boolean endWith(String str) | 判断字符串是否以str结尾 |
public String replace(char oldChar, char newChar) | 将旧字符串替换成新字符串 |
public String[] split(String str) | 根据str做拆分 |
可变字符串
StringBuffer:可边长字符串,JDK1.0提供,运行效率慢、线程安全。
StringBuilder:可边长字符串,JDK5.0提供,运行效率快、线程不安全。
public static void main(String[] args) {
StringBuffer sb = new StringBuffer();
//1.append(); 追加
sb.append("test1 ");
System.out.println(sb.toString());
sb.append("test2 ");
System.out.println(sb.toString());
//2.insert(); 添加 - 可选位置
sb.insert(0, "test3 ");
System.out.println(sb.toString());
//3.replace(); 替换
sb.replace(0, 5, "test4");
System.out.println(sb.toString());
//4.delete(); 删除
sb.delete(0, 6);
System.out.println(sb.toString());
//5.清空
sb.delete(0, sb.length());
}
知识点总结自bilibili(Java学习营)视频链接