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