Java 基础之String 类型

148 阅读4分钟

知识点:

String

  • String 类型表示的是字符串

  • String 类型的声明为final,不可以被继承

  • 字符串的String 使用的是 Unicode 进行编码,一个字符占两个字节

  • String实现了Serializable接口和Comparable接口:

    • Serializable接口:表示字符串是支持序列化的,说明可以在网络上传输.
    • Comparable接口:表示String可以比较大小 (可以使用使用compareTo的方法进行比较)
  • String类内部定义了final char[] value用于存储字符串数据 一定要注意:value是一个final类型,不可以修改:即value不能指向新的地址,但是单个字符内容是可以变化的。

  • String代表不可变的字符序列,简称:不可变性

    • 体现:
      • 当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值。
      • 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
      • 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
  • 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中

  • 字符串常量池中是不会存储相同内容的字符串的

总结: String 类型是一个表示字符串的最终类,它表示的是一个不可变的序列,通过将字面量进行赋值时,会从原先的常量池地址间接/直接的指向一个新的常量池地址值.因为它实现了Serializable和Comparable,所以它具备了序列化和比较的功能.

StringBuffer

  • StringBuffer 类是可变的字符串类
  • 每个 StringBuffer 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了StringBuffer 类对象的容量,则该对象的容量会自动扩大
  • 说StringBuffer 线程安全,是因为StringBuffer 的内部对长度添加了线程锁,多个线程中中能有一个线程进行执行.

总结: StringBuffer 是一个线程安全的可变字符串,他的长度在不足的时候会自动扩大.

StringBuilder

  • StringBuilder 是可变的字符串序列
  • StringBuilder 非线程安全

相关的面试题目:

1.      String 类型是基本数据类型吗?

答: java 的基本数据类型有 int short byte long float double boolean char 8种,String类型不属于

2.      String类型是可变的吗?

答: String类型是不可变的,他内部的原理是将常量池中的地址值进行修改.

3.      怎么比较两个字符串的值一样,怎么比较两个字符串是否为同一对象?

答: 比较字符串的值是否相同用equals,比较字符串对象是否是同一个使用 ==

4.      Switch 中可以使用string吗?

答: 在jdk7之前Switch中是不可以使用String类型的,但是在jdk7以后新加了String类型与枚举.

5.      String 、StringBuffer 、StringBuilder 有什么区别?

答: 从效率上讲,因为String的值是不可变的,所以每次对String 对象进行操作都会生成新的String对象,所以String类浪费内存空间效率低下.

         因为StringBuffer 是一个可变线程安全的字符串类,所以对比String他的效率较高

         因为StringBuilder 也是一个可变的字符串,但是在它的内部没有添加线程锁,所以相对于StringBuffer 类它的效率较高.

         所以可以得出结论:StringBuilder > StringBuffer > String

         第二点,长度不同,String类型,每次重新赋值的时候会将内部的字符串地址值进行修改,从而直接/间接的指向常量池中的新地址,所以我们可以认为他的长度不可变

         StringBuffer 和StringBuilder 的长度都是可变的.

         第三点,StringBuffer 和StringBuilder 相比线程是安全的,多个线程中只有一个线程可以进行调用.

6.      equals 和 == 的区别是什么?

答:

  • 类型不同:
    • equals是超类 Object 中的方法,而 == 是比较运算符
  • 比较对象不同:
    • equals 是用来比较两个对象的值是否相同,比较的是值
    • == 用于比较引用和基本数据类型,比较的是地址值
  • 运行速度不同
    • 因为== 比较的是地址值,所以对标equals那样,从地址值中获取到值然后进行对比运行速度较快.

7.      String str = new String("ab" + "c"); 创建了多少个对象,为什么?

答: 创建了两个对象.

          首先大家可以清除的看到有关键字 new ,所以这就代表着创建了一个新的对象,开辟了一片新的内存空间.

        其次大家可以看到 有 ("ab" + "c"),这里大家会认为这里创建了三个对象,分别为 ab、c、abc,但是大家知道String类的值不可变,所以这里的("ab" + "c"),本质上是将原先的内容从一个常量池中的地址进行了修改,并没有创建新的对象.

          所以,结果是创建了两个对象.