学习课程来源于:bilibili,拉勾教育 up主
一、String是如何实现的?
典型回答:以主流的jdk版本1.8来说,String内部实际存储为char[]数组,1.9之后使用byte[]数组存储
- String包含下列4个重要的多构造方法,
- public String(String original){},以String为参数的构造方法
- public String(char value[]){},以char数组为参数的构造方法
- public String(StringBuffer buffer){},以StringBuffer为参数的构造方法
- public String(StringBuilder builder){},以StringBuilder为参数的构造方法
- public boolean equals(Object anObject){},String类重写了Object类中的equals方法,equals需要传递一个Object类型的参数值,在比较时会先通过instanceof关键字判断Object类型的参数是否是String类型,若不是直接返回false,若是String类型之后,会循环对比两个字符串中的每一个字符,当所有字符都相等时,返回true,否则返回false; 还有一个和equals比较相似的方法equalsIgnoreCase,它用于忽略字符串大小写之后,进行字符串对比
- public int compareTo(String anotherString){},compareTo()比较两个字符串。compareTo方法会循环对比所有的字符串,当两个字符串中有任意一个字符不相同时,则return char1-char2。
- compareTo()方法和equals()方法都是用于比较两个字符串的,但有两点不同,equals()方法可以接收一个Object类型的参数,而compareTo()只能接收一个String类型的参数。equals()返回值为Boolean,而compareTo()的返回值为int。它们都可以用于两个字符串的比较,当equals()方法返回true时,或者compareTo()方法返回0时,则说明两个字符串完全相等
- 其他重要方法:
- 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的一些执行细节。