[Java面试学习]String是如何实现的?它有哪些重要的方法?

学习课程来源于:bilibili,拉勾教育 up主
一、String是如何实现的?
典型回答:以主流的jdk版本1.8来说,String内部实际存储为char[]数组,1.9之后使用byte[]数组存储

  1. String包含下列4个重要的多构造方法,
  • public String(String original){},以String为参数的构造方法
  • public String(char value[]){},以char数组为参数的构造方法
  • public String(StringBuffer buffer){},以StringBuffer为参数的构造方法
  • public String(StringBuilder builder){},以StringBuilder为参数的构造方法
  1. public boolean equals(Object anObject){},String类重写了Object类中的equals方法,equals需要传递一个Object类型的参数值,在比较时会先通过instanceof关键字判断Object类型的参数是否是String类型,若不是直接返回false,若是String类型之后,会循环对比两个字符串中的每一个字符,当所有字符都相等时,返回true,否则返回false; 还有一个和equals比较相似的方法equalsIgnoreCase,它用于忽略字符串大小写之后,进行字符串对比
  2. public int compareTo(String anotherString){},compareTo()比较两个字符串。compareTo方法会循环对比所有的字符串,当两个字符串中有任意一个字符不相同时,则return char1-char2。
  3. compareTo()方法和equals()方法都是用于比较两个字符串的,但有两点不同,equals()方法可以接收一个Object类型的参数,而compareTo()只能接收一个String类型的参数。equals()返回值为Boolean,而compareTo()的返回值为int。它们都可以用于两个字符串的比较,当equals()方法返回true时,或者compareTo()方法返回0时,则说明两个字符串完全相等
  4. 其他重要方法:
  • indexOf():查询字符串首次出现的下标位置
  • lastIndexOf():查询字符串最后出现的下标位置
  • contains():查询字符串中是否包含另一个字符串
  • toLowerCase():把字符串全部转换成小写
  • toUpperCase():把字符串全部转换成大写
  • length():查询字符串的长度
  • trim(): 去掉字符串首尾空格
  • replace():替换字符串中的某些字符
  • split():把字符串分割并返回字符串数组
  • join():把字符串数组转为字符串
    String源码属于所有源码中最基础,最简单的一个,对String源码的理解也反应了你的Java基本功底。

二、为什么String类型要用final修饰?

三、和equals的区别是什么?
对于基本类型数据类型来说,是用于比较值是否相等,而对于引用类型来说,是用于比较引用地址是否相同的。其他回答
1."
" 的作用是判断两个对象的地址是不是相等。即判断两个对象是不是同一个对象。(基本数据类型
比较的是值,引用数据类型比较的是内存地址)
2.equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
3.类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“
”比较这两个对象。
4.类覆盖了equals()方法。一般,我们都覆盖equals()方法来两个对象的内容相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。

final修饰的好处:高效,另一个原因是安全

四、String 和StringBuilder、StringBuffer有什么区别?
String类型是不可变的,所以在字符串拼接的时候如果使用String的话,性能会很低,因此就需要使用另一个类StringBuffer,它提供了append和insert方法可用于字符串的拼接,它使用了synchronized关键字来保证线程安全,由于是线程安全,性能不是很高,于是在jdk1.5时,Java又提供了StringBuilder类,由于它没有使用synchronized关键字修饰,在性能上优于StringBuffer,所以在非并发情况下,可以使用StringBuilder进行字符串拼接,效率更高。
五、String的intern()方法有什么含义?

六、String类型在JVM中是如何存储的?编译器对String做了哪些优化?
String常见的创建方式有两种:

  • String s1 = “Java”; 直接赋值的方式
  • String s2 = new String(“Java”); 的方式,
    两者在JVM的存储区域却截然不同,在jdk1.8中,字符串s1会先去字符串常量池中找字符串Java,如果有相同的字符串,则直接返回字符串常量池中的句柄,如果没有此字符串,则会先在字符串常量池中创建该字符串,然后再返回常量句柄。而s2则直接在堆内存中创建变量,如果调用intern()方法,才会将此字符串保存在常量池中

小结:从String的源码入手,重点讲解了String的构造方法、equals()方法和compareTo()方法。其中equals()重写了Object的equals()方法,把引用对比改成了字符串值的对比。介绍了final修饰String的好处,可以提升效率和增强安全性,介绍了String和JVM的一些执行细节。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值