java程序员面试(三)

字符串与数组

  1. 字符串创建与存储的机制是什么?

    • new总会生成新的对象
    • JVM中存在着一个字符常串池
    • String的实现采用Flyweight设计模式,当创建一个字符串常量时,会首先在字符串池中是否已经有相同的字符串被定义,其判断依据是String类equals(Object obj)方法的返回值。若已经定义则直接获取对其的引用,此时不需要创建新的对象;若没有定义,则首先创建这个对象,然后把他加入到字符串池中,再将它的引用返回。
    • String是不可变类,一旦创建好了就不能被修改,因此String对象可以被共享而且不会导致程序混乱。

new String("abc")创建了几个对象?
一个或两个。如果常量池中原来有“abc”,那么只创建一个对象;如果常量池中原来没有字符串“abc”,那么就会创建两个对象。

public class TestString {
  public static void main(String[] args) {
      String s1 = new String("abc");
      String s2 = new String("abc");

      String s3 = "abc";
      String s4 = "abc";

      String s5 = "ab"+"c";

      System.out.println("s1 == s2 :" + (s1==s2));
      System.out.println("s3 == s4 :" + (s3==s4));
      System.out.println("s1 == s3 :" + (s1==s3));
      System.out.println("s1 == s5 :" + (s1==s5));
      System.out.println("s3 == s5 :" + (s3==s5));

  }
}
  1. “==”,equals和hashcode有什么区别?

    • ==比较的是两个变量的值是否相等,这里面的值,对于基本数据类型就是数值,而对于引用数据类型就是地址值;
    • 对象占用一块内存(堆),变量也占用一块内存(栈)
    • equals方法是基于Object类的,在Object类的底层其实也是用的 == 进行值比较返回;但是equals方法可以被重写,如String就重写了equals方法,所以在比较的是对象的内容。
    • hashCode()方法是从Object类继承过来的,它也用来鉴别两个对象是否相等。返回的是一个内存地址转化的int值。所以也是需要重写hashCode方法的。
    • equals方法是给用户调用的,hashCode一般用户不调用。
    • 一般在重写equals方法的时候同时也要重写hashCode方法,否则,就会违反Object.hashCode的通用约定,从到导致该类无法与所有基于散列值hash的集合Hashset、HashMap、Hashtable结合在一起正常运行。
  2. String 、StringBuffer、StringBuilder和StringTokenzier有什么区别?

    • 四个可以对字符或字符串操作的类:Character、String、StringBuffer、StringTokenizer
    • Character 单个字符 String不可变类 StringBuffer可变类、运用缓冲区、线程安全 StringBuilder 线程不安全;
    • 在执行效率方面:StringBuilder最高,StringBuffer次之,String最低;一般而言,操作的数据量小,用String类;单线程下操作大量的数据用StringBuilder,多线程下操作大量数据用StringBuffer;
    • StringTokenizer是用来分割字符串的工具类;
  3. Java中的数组是不是对象?

    • 是对象。
  4. 数组的初始化方式有哪几种?

    • 好多种。
  5. length属性与length()方法有什么区别

    • length是属性,length()是方法。

本文链接:

https://heyzen.club/index.php/J/296.html
1 + 2 =
快来做第一个评论的人吧~