Java 中 String 属于引用数据类型,它是 java.lang 包下的类,全称 java.lang.String,不属于八种基本数据类型,这个是 Java 基础高频考点,很多新手容易混淆,八种基本数据类型是 byte short int long float double char boolean,String 虽然经常和字符一起使用,但是本质是类,声明 String 变量的时候,变量保存的是字符串对象的内存引用地址,不是字符串本身的值,String 类被 final 关键字修饰,不能被继承,内部底层是 char 数组 JDK9 之后改成 byte 数组存储字符,并且 String 对象创建之后内容不可修改,也就是不可变特性,字符串常量会进入字符串常量池,这也是 String 非常重要的特性,写代码的时候不需要手动 import java.lang.String,因为 java.lang 包是 JVM 自动导入的,使用 String 可以直接写,面试经常会追问 String 为什么是引用类型,以及和基本类型的区别,还要区分 String StringBuilder StringBuffer 三者的差异。
基本类型和 String 对比表
| 对比项 | 八种基本数据类型 | String |
|---|---|---|
| 本质 | JVM 原生内置类型 | java.lang 包下的类 |
| 存储内容 | 直接存储数值 | 变量保存对象引用地址 |
| 是否有方法 | 没有成员方法 | 拥有 equals length substring 等大量方法 |
| 内存位置 | 栈内存直接存放值 | 对象存堆内存,常量存在字符串常量池 |
| final 修饰 | 无 | 类被 final 修饰,不可被继承 |
深度知识点
不可变特性
String 对象一旦创建,内部字符序列不能改动,代码里面写拼接操作,例如 str = str + "abc",并不是修改原来字符串对象,而是新建一个新的 String 对象,然后把引用指向新对象,旧对象如果没有引用,会等待 GC 回收,这也是循环里面大量字符串拼接性能差的原因,循环拼接推荐使用 StringBuilder。
字符串常量池
使用双引号直接赋值 String s = "hello",会优先在字符串常量池查找是否已经存在相同字符串,如果存在直接复用常量池里面对象,使用 new String ("hello") 会强制在堆里面新建对象,这个考点经常出现在 == 和 equals 的区分题目,== 比较引用地址,equals 比较字符串真实内容。
底层存储变化
JDK8 以及更早版本,String 内部是 private final char [] value 存储字符,JDK9 之后优化为 byte 数组加上编码标记,减少内存占用,这个改动不改变 String 属于引用类型这个结论。
继承关系
String 实现了 Serializable Comparable CharSequence 接口,继承自 Object 类,所有类默认继承 Object,所以 String 可以调用 Object 的 toString hashCode equals 方法,并且重写了 equals 方法,所以可以直接对比字符串内容。
相关扩展类
StringBuilder 可变字符序列,单线程推荐,没有线程安全锁,性能高,StringBuffer 可变字符序列,方法加 synchronized,线程安全,性能比 StringBuilder 低,这两个同样都是引用类型。
总结,Java 中 string 属于引用数据类型,是 java.lang.String 类,不是基本类型,核心特征是 final 类,对象不可变,支持字符串常量池复用,面试重点区分基本类型和引用类型,理解 == 和 equals 的区别。
【常见问题】
问题 1 Java 中 string 属于什么类型,为什么不是基本数据类型
回答 1 Java 中 string 属于什么类型,String 是类,属于引用数据类型,八种基本类型是 JVM 原生类型,String 拥有类的方法和对象引用机制,所以 Java 中 string 属于什么类型答案不是基本类型。
问题 2 Java 中 string 属于什么类型,String 变量存在栈还是堆
回答 2 Java 中 string 属于什么类型,String 的引用变量一般在栈内存,字符串对象本身在堆内存或者字符串常量池,Java 中 string 属于什么类型这个考点经常和内存存储结合考察。
问题 3 Java 中 string 属于什么类型,可以被继承吗
回答 3 Java 中 string 属于什么类型,String 类被 final 修饰,不可以被其他类继承,Java 中 string 属于什么类型这个知识点经常和 final 关键字考点结合出题。
问题 4 Java 中 string 属于什么类型,和 char 区别是什么
回答 4 Java 中 string 属于什么类型,String 是引用类型代表一串字符,char 是基本数据类型,只能存储单个字符,Java 中 string 属于什么类型要区分单个字符 char 和字符串 String。
免责声明:本文介绍的 Java 中 string 属于什么类型相关内容仅作为 Java 基础学习参考,不同 JDK 版本底层实现细节存在优化,核心分类结论保持不变,本文不构成强制编码规范。


