String

tim-qtp...大约 2 分钟Java基础

String 是 Java 基本数据类型吗?可以被继承吗?

不是,String 是一个类,属于引用数据类型。

String 类可以继承吗?

不行。String 类使用 final 修饰,是所谓的不可变类,无法被继承。

String 有哪些常用方法?

我自己常用的有:

  1. length() - 返回字符串的长度。
  2. charAt(int index) - 返回指定位置的字符。
  3. substring(int beginIndex, int endIndex) - 返回字符串的一个子串,从 beginIndexendIndex-1
  4. contains(CharSequence s) - 检查字符串是否包含指定的字符序列。
  5. equals(Object anotherObject) - 比较两个字符串的内容是否相等。
  6. indexOf(int ch)indexOf(String str) - 返回指定字符或字符串首次出现的位置。
  7. replace(char oldChar, char newChar)replace(CharSequence target, CharSequence replacement) - 替换字符串中的字符或字符序列。
  8. trim() - 去除字符串两端的空白字符。
  9. split(String regex) - 根据给定正则表达式的匹配拆分此字符串。

String 和 StringBuilder、StringBuffer 的区别?

String是不可变的,一旦创建就不能再原字符串上修改,你的后续修改操作(如拼接、替换等)实际上都会生成一个新的String对象,适用于少量的字符串修改操作;

Stringbuilder可以直接在原字符串上进行增删改;适用于单线程下频繁修改操作,性能更好;但是线程不安全的(推荐);

StringBuffer 和 StringBuilder 类似,但每个方法上都加了 synchronized 关键字,所以是线程安全的(不常用)。

String s = new String("abc")创建了几个对象?

会创建 1 或 2 个字符串对象。

主要有两种情况:

  1. 如果常量池中没有 "yupi",则 new String("yupi") 会创建 2 个对象:一个在常量池中,一个在堆中。
  2. 如果常量池中已有 "yupi",则只会在堆中创建 1 个新的字符串对象(其内容引用常量池中的 "yupi")。

可以看下这个图再理解一下:

怎么拼接字符串:

  1. String.concat()

    String qinyi = "秦一";
    String zuishuai = "最帅";
    System.out.println(qinyi.concat(zuishuai));
    
  2. StringBuilderbuilder.append("Hello, "); builder.append("World!");

  3. String.format()

  4. String.join()

    String qinyi = "秦一";
    String zuishuai = "最帅";
    String cmower = String.join("", qinyi, zuishuai);
    
  5. StringUtil.join