String
...大约 2 分钟Java基础
String 是 Java 基本数据类型吗?可以被继承吗?
不是,String
是一个类,属于引用数据类型。
String 类可以继承吗?
不行。String 类使用 final 修饰,是所谓的不可变类,无法被继承。
String 有哪些常用方法?
我自己常用的有:
length()
- 返回字符串的长度。charAt(int index)
- 返回指定位置的字符。substring(int beginIndex, int endIndex)
- 返回字符串的一个子串,从beginIndex
到endIndex-1
。contains(CharSequence s)
- 检查字符串是否包含指定的字符序列。equals(Object anotherObject)
- 比较两个字符串的内容是否相等。indexOf(int ch)
和indexOf(String str)
- 返回指定字符或字符串首次出现的位置。replace(char oldChar, char newChar)
和replace(CharSequence target, CharSequence replacement)
- 替换字符串中的字符或字符序列。trim()
- 去除字符串两端的空白字符。split(String regex)
- 根据给定正则表达式的匹配拆分此字符串。
String 和 StringBuilder、StringBuffer 的区别?
String是不可变的,一旦创建就不能再原字符串上修改,你的后续修改操作(如拼接、替换等)实际上都会生成一个新的String
对象,适用于少量的字符串修改操作;
Stringbuilder可以直接在原字符串上进行增删改;适用于单线程下频繁修改操作,性能更好;但是线程不安全的(推荐);
StringBuffer 和 StringBuilder 类似,但每个方法上都加了 synchronized 关键字,所以是线程安全的(不常用)。
String s = new String("abc")创建了几个对象?
会创建 1 或 2 个字符串对象。
主要有两种情况:
- 如果常量池中没有
"yupi"
,则new String("yupi")
会创建 2 个对象:一个在常量池中,一个在堆中。 - 如果常量池中已有
"yupi"
,则只会在堆中创建 1 个新的字符串对象(其内容引用常量池中的"yupi"
)。
可以看下这个图再理解一下:

怎么拼接字符串:
String.concat()
String qinyi = "秦一"; String zuishuai = "最帅"; System.out.println(qinyi.concat(zuishuai));
StringBuilder
,builder.append("Hello, "); builder.append("World!");
String.format()
String.join()
String qinyi = "秦一"; String zuishuai = "最帅"; String cmower = String.join("", qinyi, zuishuai);
StringUtil.join