对类不重写,equals()方法是如何比较的?

答:

    比较的是对象的地址。

           

          

什么是构造函数,构造函数重载,复制构造函数?

答:

  1. 当对象被创建的时候,构造函数会被调用。每个类都有构造函数,在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。
  2. Java中构造函数重载和方法重载很相似。可以为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。
  3. Java不支持像C++中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,Java不会创建默认的复制构造函数。

           

          

是否可以在static环境中访问非static变量?

答:

  1. static变量在Java中是属于类的,它的所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。
  2. 如果代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
  3. 拓展:static方法不能被覆盖,因为方法覆盖是基于允许时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关。

           

          

对象的创建

答:

  1. 遇到一个新类时,会进行类的加载,定位到class文件。
  2. 对所有的静态成员变量初始化,静态代码块也会执行,而且只在类加载的时候执行一次。
  3. New对象时,JVM会在堆中分配一个足够大的存储空间。
  4. 存储空间清空,为所有的变量赋默认值,所有的对象引用赋值为null。
  5. 根据书写的位置给字段一些初始化操作。
  6. 调用构造器方法(没有继承)

           

          

List、Map、Set三个接口存取元素时的特点?

答:

  1. List以特定索引来存取元素,可以有重复元素。
  2. Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)
  3. Map保存键值对映射,映射关系可以是一对一或多对一。
  4. Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键构成排序树从而达到排序和去重的效果。

           

          

ArrayList、Vector、LinkedList的存储性能和特性

答:

  1. ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 中的方法由于添加了 synchronized 修饰,因此 Vector 是线程安全的容器,但性能上较 ArrayList 差,因此已经是 Java 中的遗留容器。
  2. LinkedList 使用双向链表实现存储(将内存中零散的内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构,这种链式存储方式与数组的连续存储方式相比,内存的利用率更高),按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
  3. Vector 属于遗留容器(Java早期的版本中提供的容器,除此之外,Hashtable 、 Dictionary 、 BitSet 、 Stack 、 Properties 都是遗留容器),已经不推荐使用,但是由于 ArrayList 和 LinkedListed 都是非线程安全的,如果遇到多个线程操作同一个容器的场景,则可以通过工具类 Collections 中的 synchronizedList 方法将其转换成线程安全的容器后再使用(这是对装潢模式的应用,将已有对象传入另一个类的构造器中创建新的对象来增强实现)。

           

          

List、Set、Map是否继承自Collection接口?

答:

  1. List、Set是,Map不是。
  2. Map是键值对映射容器,与List和Set有明显区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

           

        

ArrayList和LinkedList的区别

答:

  1. 都实现了List接口
  2. ArrayList类实现了可变的数组,允许保存所有元素,包括null,因为底层是数组,所有能够快速的随机访问,但插入和删除的速度较慢。
  3. LinkedList类采用链表结构保存对象。插入和删除对象的效率较高,但访问效率较低。
  4. LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

           

          

Iterator和ListIterator的区别?

答:

  1. Iterator可用来遍历Set和List集合,而ListIterator只能用来遍历List。
  2. Iterator对集合只能前向遍历,ListIterator既可以前向也可以后向。
  3. ListIterator实现了Iterator接口,并包含其他功能,比如:增加元素,替换元素等等。
  4. 注:在遍历元素时不能通过集合的方法删除元素,否则会抛异常。但是可以通过Iterator接口中的remove()方法进行删除。