算法程序员面试题

Java面试题的基础内容

2019-04-10  本文已影响19人  小小知识分子

1、JDK、JRE的区别?
jdk 面向开发人员使用的SDK是Java开发工具包,包含各种工具和类库;JDK是开发环境。JRE面向程序使用者核心内容是JVM及核心类库。JRE是运行环境。
2、== 和 equals 的区别是什么?
总结来说:1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址。
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

3、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
(1)重写equals方法,不重写hashCode方法,当两个对象equals相等时,它们的哈希码不一定相等;
(2)重写hashCode方法,不重写equals方法,当两个对象equals相等时,它们的哈希码不一定相等;
(3) 重写equals方法,同时重写hashCode方法,当两个对象equals相等时,它们的哈希码一定相等;
4、.抽象类必须要有抽象方法吗?
抽象类不一定要有抽象方法;但是有抽象方法的类一定是抽象类。

5、普通类和抽象类有哪些区别?
a.抽象类不能被实例化。
b.抽象类可以有构造函数,被继承时子类必须继承父类一个构造方法,抽象方法不能被声明为静态。
c.抽象方法只需申明,而无需实现,抽象类中可以允许普通方法有主体
d.含有抽象方法的类必须申明为抽象类
e.抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。

6、接口和抽象类有什么区别?
a.抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。
b.抽象类要被子类继承,接口要被类实现。
c.接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
d.接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
e.抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
f.抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
g.抽象类里可以没有抽象方法
h.如果一个类里有抽象方法,那么这个类只能是抽象类
i.抽象方法要被实现,所以不能是静态的,也不能是私有的。
j.接口可继承接口,并可多继承接口,但类只能单根继承。

7、java 中 IO 流分为几种


fileiol流.jpg

总结:
1.Java IO是采用的是装饰模式,即采用处理流来包装节点流的方式,来达到代码通用性。
2.处理流和节点流的区分方法,节点流在新建时需要一个数据源(文件、网络)作为参数,而处理流需要一个节点流作为参数。
3.处理流的作用就是提高代码通用性,编写代码的便捷性,提高性能。
4.节点流都是对应抽象基类的实现类,它们都实现了抽象基类的基础读写方法。其中read()方法如果返回-1,代表已经读到数据源末尾。

8、Collection 和 Collections 有什么区别
8-1、java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set

8-2、java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

9、Java中 List、Set、Map 之间的区别
List(列表)List的元素以线性方式存储,可以存放重复对象,List主要有以下两个实现类:

ArrayList : 长度可变的数组,可以对元素进行随机的访问,向ArrayList中插入与删除元素的速度慢。 JDK8 中ArrayList扩容的实现是通过grow()方法里使用语句newCapacity = oldCapacity + (oldCapacity >> 1)(即1.5倍扩容)计算容量,然后调用Arrays.copyof()方法进行对原数组进行复制。
LinkedList: 采用链表数据结构,插入和删除速度快,但访问速度慢。
Set(集合)
  Set中的对象不按特定(HashCode)的方式排序,并且没有重复对象,Set主要有以下两个实现类:

HashSet: HashSet按照哈希算法来存取集合中的对象,存取速度比较快。当HashSet中的元素个数超过数组大小*loadFactor(默认值为0.75)时,就会进行近似两倍扩容(newCapacity = (oldCapacity << 1) + 1)。
TreeSet :TreeSet实现了SortedSet接口,能够对集合中的对象进行排序。
Map(映射)
  Map是一种把键对象和值对象映射的集合,它的每一个元素都包含一个键对象和值对象。 Map主要有以下两个实现类:

HashMap:HashMap基于散列表实现,其插入和查询<K,V>的开销是固定的,可以通过构造器设置容量和负载因子来调整容器的性能。
LinkedHashMap:类似于HashMap,但是迭代遍历它时,取得<K,V>的顺序是其插入次序,或者是最近最少使用(LRU)的次序。
TreeMap:TreeMap基于红黑树实现。查看<K,V>时,它们会被排序。TreeMap是唯一的带有subMap()方法的Map,subMap()可以返回一个子树。
HashMap
  底层实现:HashMap底层整体结构是一个数组,数组中的每个元素又是一个链表。每次添加一个对象(put)时会产生一个链表对象(Object类型),Map中的每个Entry就是数组中的一个元素(Map.Entry就是一个<Key,Value>),它具有由当前元素指向下一个元素的引用,这就构成了链表。
  存储原理:当向HsahMap中添加元素的时候,先根据HashCode重新计算Key的Hash值,得到数组下标,如果数组该位置已经存在其他元素,那么这个位置的元素将会以链表的形式存放,新加入的放在链头,最先加入的放在链尾,如果数组该位置元素不存在,那么就直接将该元素放到此数组中的该位置。
  去重原理:不同的Key算到数组下标相同的几率很小,新建一个<K,V>放入到HashMap的时候,首先会计算Key的数组下标,如果数组该位置已经存在其他元素,则比较两个Key,若相同则覆盖写入,若不同则形成链表。
  读取原理:从HashMap中读取(get)元素时,首先计算Key的HashCode,找到数组下标,然后在对应位置的链表中找到需要的元素。
  扩容机制:当HashMap中的元素个数超过数组大小*loadFactor(默认值为0.75)时,就会进行2倍扩容(oldThr << 1)。

上一篇下一篇

猜你喜欢

热点阅读