Java面试题-Java核心基础-第七天(String)

目录

一、String、StringBuffer、StringBuilder的区别

二、String为什么是不可变的

三、字符串拼接用"+"还是用StringBuilder

[四、String 中的equals和Object中的equals的区别](#四、String 中的equals和Object中的equals的区别)

五、字符串常量池的作用了解吗?

[六、String s1 = new String("abc")是创建了几个对象?](#六、String s1 = new String("abc")是创建了几个对象?)

七、String中的intern方法有什么作用

八、String类型的变量和常量做"+"时发生了什么?


一、String、StringBuffer、StringBuilder的区别

  1. 是否可变

String由于属性被private 而且还被final修饰 而且String类还是final的 所以子类也无法进行修改 外界无法进行干扰,可以理解为常量 自然就不可变了

而StringBuffer和StringBuilder都实现了StringBuilderAbstract类 这个抽象类中定义了许多方法 例如:append replace 等方法 是可变的

  1. 线程是否安全

String中的属性可以理解为常量,自然是线程安全的

StringBuffer中的方法获取调用的方法都加了同步锁,因此是线程安全的

StringBulider中都没有加同步锁,自然线程不安全

  1. 性能

String每次对其修改都需要重新创建一个新的对象,因此对内存的消耗也比较大,性能不是很高

StringBuffer和StringBuilder因为都是可变的,效率较高,而StringBuilder因为方法都没有加锁,因此性能更高

总结三者的使用:

  1. 如果是少量的操作,可以使用String

  2. 如果是处于单线程环境,并且有大量的字符串操作,可以使用StringBuilder

  3. 如果是多线程环境,大量的字符串操作,使用StringBuffer

二、String为什么是不可变的

因为字符数组(后面是字节数组)被private修饰 也被final修饰 并且没有对外提供修改方法,因此无法直接操作

并且String类还是被final修饰的,所以也不能被子类所修改

三、字符串拼接用"+"还是用StringBuilder

使用+其实底层就是使用的StringBuilder的append方法

对于大量的拼接操作,推荐使用StringBuilder(当然这个在jdk9中得到了优化,也可以使用+),因为这只是一个StringBuilder对象在使用,而如果在循环中连续的对一个字符串使用+操作的话,就会创建多个StiringBuilder对象,不能进行复用,因此效率较低。

四、String 中的equals和Object中的equals的区别

String中的equals方法是得到了重写的,是比较的字符串的内容,而非Object中直接比较地址

五、字符串常量池的作用了解吗?

字符串常量池相当于就是缓存,是为了减少资源消耗的,避免重复的创建字符串对象

字符串常量池是存在于方法区中,一旦有一个String s = "abc"或者是Stirng s = new Sting("abc")

那么就会在字符串常量池中保留abc这个字面量 当下次再去 String s2 = "abc"时,此时无需再创建对象,直接使用字符串常量池中的即可,对于Stirng s4 = new Sting("abc")也一样,此时就只需要创建堆中的字符串对象,里面的char[]数组其实还是直接使用的字符串常量池中的字符串引用、

所以此时就只需要创建一个对象即可

六、String s1 = new String("abc")是创建了几个对象?

当字符串常量池中已存在abc字符串那么就只创建一个对象 否则需要不仅要创建堆上的字符串对象 还要创建字符串常量池中的(其实是创建那个char[]的,只是后面把这个引用放到字符串常量池中)

例如:

String s = "abc";/String s = new Stirng("abc")这个也会放到字符串常量池中

String s1 = new String("abc")

此时创建一个对象

七、String中的intern方法有什么作用

就是手动的将字符串引用放到字符串常量池中

如果字符串常量池中已经存在了引用,那么就直接返回这个引用 否则创建一个引用再返回

当然当创建String对象的时候,实际上就已经自动的将其引用放到字符串常量池中去了

八、String类型的变量和常量做"+"时发生了什么?

如果是常量 + 常量的方式 再编译的时候,编译器就会进行 一种叫做"常量折叠"的优化

例如 "abc" + "fg" 编译器就会直接将其优化成"abcfg" 不仅字符串这样 像其他的int long byte char等也会存在此优化

对于常量可以这样优化,但是一旦有变量,也就是对象引用 那么在编译的时候是无法对其进行优化的 因此只能创建一个新的创建 在堆上

String s1 = "abc" String s2 = "df"

s1 + s1 其实是 new StringBuilder().append(s1).append(s2).toString()

相关推荐
述雾学java1 天前
反射、 Class类、JVM的类加载机制、Class的常用方法
java·java基础·java核心基础
Java 第一深情2 个月前
面试题解,JVM的运行时数据区
jvm·java面试
非学无以质疑3 个月前
Java中的SPI机制
java·后端·编程语言·java面试
linweidong4 个月前
宁德时代Java面试题及参考答案
java·大厂面试·后端面试·java面试·java面经·java校招·后端offer
linweidong6 个月前
作业帮大数据面试题及参考答案
大厂面试·java面试·牛客网·flink面试·校招面经·flink面经·hadoop面试
北顾丶7 个月前
Redis作为缓存,如何与MySql的数据进行同步?
java·开发语言·redis·mysql·缓存·java基础·java面试
李东平|一线码农7 个月前
MySQL 是如何实现数据的排序的?
java面试
北顾丶8 个月前
Arraylist与LinkedList的区别
java基础·java面试·arraylist·linkedlist·java八股文
zouhuu8 个月前
面试题001-Java-Java基础
java·java面试·java面试题·java基础题
Andy&lin8 个月前
最新Java面试题及答案(Java基础、设计模式、Java虚拟机(jvm))
java·jvm·设计模式·java面试·java面试题目