String相关
字符型常量和字符串常量的区别
- 形式上: 字符常量是单引号引起的一个字符 字符串常量是双引号引起的若干个字符
- 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量代表一个地址值(该字符串在内存中存放位置)
- 占内存大小 字符常量只占一个字节 字符串常量占若干个字节(至少一个字符结束标志)
String 是最基本的数据类型吗
不是。Java 中的基本数据类型只有 8 个 :byte、short、int、long、float、double、char、boolean
;除了基本类型(primitive type),剩下的都是引用类型(referencetype)
由于String 类使⽤final修饰,不可变,无法被继承
什么是字符串常量池?
字符串常量池位于堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时 JVM 会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用。
String、StringBuffer、StringBuilder 的区别
String
:String 的值被创建后不能修改,任何对 String 的修改都会引发新的 String 对象的⽣ 成,: 适用操作少量的数据StringBuilder
:StringBuffer的⾮线程安全版本,性能上更⾼⼀些 ,适合单线程操作字符串缓冲区下操作大量数据StringBuffer
:跟String类似,但是值可以被修改,使⽤ synchronized 来保证线程安全。适合多线程操作字符串缓冲区下操作大量数据
String s = new String(“abc”)创建了几个对象 ?
⼀个或两个
如果字符串常量池已经有“abc”,则是1个;
否则,2个。 当字符创常量池没有 “abc”,此时会创建如下两个对象: ⼀个是字符串字⾯量 “abc” 所对应的、字符串常量池中的实例 另⼀个是通过new String()
创建并初始化的,内容与"abc"相同的实例,在堆中。
String str="abc"与 String str=new String(“abc”)一样吗?
不一样,因为内存的分配方式不一样。String str="abc"
的方式,java 虚拟机会将其分配到常量池中;而 String str=new String("abc")
则会被分到堆内存中。
String有哪些特性
- 不变性:String 是只读字符串,是一个典型的 immutable 对象,对它进行任何操作,
其实都是创建一个新的对象,再把引用指向该对象
。不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性。 - 常量池优化:String 对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的引用。
其中 不可变是由于:
- 保存字符串的数组被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。
- String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。
String 类的常用方法都有那些?
- indexOf():返回指定字符的索引。
- charAt():返回指定索引处的字符。
- replace():字符串替换。
- trim():去除字符串两端空白。
- split():分割字符串,返回一个分割后的字符串数组。
- getBytes():返回字符串的 byte 类型数组。
- length():返回字符串长度。
- toLowerCase():将字符串转成小写字母。
- toUpperCase():将字符串转成大写字符。
- substring():截取字符串。
- equals():字符串比较。
在使用 HashMap 的时候,用 String 做 key 有什么好处?
HashMap
内部实现是通过key
的hashcode
来确定value
的存储位置,因为字符串是不可变的,所以当创建字符串时,它的hashcode
被缓存下来,不需要再次计算,所以相比于其他对象更快