源码学习day1—String

108 阅读2分钟
  • JDK1.8版本,String内部存储结构为Char数组

  • String有四个构造方法

    • 以String为参数的构造方法
    • 以char()为参数的构造方法
    • 以StringBuffer为参数的构造方法
    • 以StringBuilder为参数的构造方法
  • equals()

    • String类型重写了Object中的equals()方法,equals()方法需要传递一个Object类型的参数值,在比较时会先通过instanceof判断是否时String类型,如果不是则直接返回false
    • 判断参数类型为String时,会循环对比两个字符串中的每一个字符,当所有字符都相等时返回true,否则返回false
    • 与equals()类似方法equalsIgnoreCase(),hulve大小写进行对比
  • compareTo() ,返回数字

    • compareTo()会循环对比所有字符,若两字符串中有任意一个字符不相同,则返回char1 - char2
    • compareTo()返回0,表示两字符串完全相同
compareTo()与equals()不同点
  1. equals() 可以接收一个 Object 类型的参数,而 compareTo() 只能接收一个 String 类型的参数

  2. equals() 返回值为 Boolean,而 compareTo() 的返回值则为 int

面试题

1. == 和 equals()的区别

**==:**对于基本数据类型来说,是用于比较“值”是否相等;对于引用类型来说,是用于比较引用地址是否相同的。而Object类中的equals()方法,就是==

**equals():**String 重写了 equals() 方法把它修改成比较两个字符串的值是否相等

2. final修饰的好处
  • 使用final,较为高效,可以缓存结果,在传参数时,无需考虑谁会修改它的值,如果String是可变类的话,则有可能需要重新拷贝出来一个新值进行穿参,会降低代码的性能

    只有字符串不可变,才可以实现字符串常量池

  • 使用final,较为安全,当在调用其他方法时,会存在一些校验。若是可变类的话,校验过后,内部值会发生变化

3. String与StringBuilder、StringBuffer的区别

因为String类型是不可变的,故字符串拼接,使用String效率较低

StringBuffer使用了synchronized来保证线程安全,故性能不高

StringBuilder无synchronized修饰,性能优于StringBuffer,可用于非并发环境使用

4. String与JVM

String常见的创建方式有两种:

**new String():**此种方式会先在堆上创建一个字符串对象,然后再去常量池中查询次字符串的值是否已经存在,若不存在,会先在常量池中创建此字符串,然后把引用的值指向此字符串

**直接赋值:**直接赋值会先去字符串常量池中查找是否已经有此值,如果有,则把引用地址指向此值,否则会先在常量池中创建,然后再把引用指向此值