JAVA企业面试题精选 Java SE 21-30

时间:2021-08-20 21:01:54

3.21.阐述一下ClassCastException通常在什么情况下发生?

参考答案:

  强制类型转换类型不匹配时出现此异常.例如:把某一对象强转其他类型,如果该对象并非该类的实例,就会发生ClassCastException.

3.22.画出集合的框架图

参考答案:

JAVA企业面试题精选 Java SE 21-30

3.23.编写一段程序,用来创建和迭代一个List

参考答案:

    public static void main(String[] args){
List<String> names = new ArrayList<String>();
names.add("Tom");
names.add("Jerry");
names.add("Andy");
names.add("Lee");
for(int i = 0; i < names.size(); i++){
String str = names.get(i);
System.out.println(str);
}
}

3.24.编写一段程序,用来创建和迭代一个set

参考答案:

    public static void main(String[] args){
Set<String> set = new HashSet<String>();
set.add("aaa");
set.add("bbb");
set.add("ccc");
set.add("ddd");
Iterator<String> ite = set.iterator();
while(ite.hasNext()){
String egg = ite.next();
System.out.println(egg);
}
}

3.25.编写一段程序,用来创建和迭代一个Map?

参考答案:

    public static void main(String[] args){
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("zhangsan",89);
map.put("lisi",98);
map.put("wangwu",56);
Set<Entry<String,Integer>> entrySet = map.entrySet();
for(Entry<String,Integer> entry : entrySet){
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}

3.26.Collection和Collections的区别?

参考答案:

  Collection是java.util下的接口,它是各种集合的父接口,继承与它的接口主要有Set和List;Collections是java.tuil下的类,是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索,排序,线程安全化等操作.

3.27.说说java集合类:HashMap是如何设计的?是如何解决什么冲突的?

参考答案:

  1)HashMap是基于哈希表的Map接口的非同步实现.在Java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造,HashMap也不例外.HashMap实际上是一个”链表的数组”的数据结构,每个元素存放链表头结点的数组,即数组和链表的结合体.HashMap底层就是一个数组结构,数组中的每一项又是一个链表.当新建一个HashMap的时候,就会初始化一个数组,Entry就是数组中的元素,每个Map.Entry其实就是一个key-value对,它持有一个指向下一个元素的引用,就构成了链表.
  2)HashMap的存储.当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾.如果数组该位置上没有元素,将直接将该元素放到此数组中的该位置上.
  3)HashMap的读取.从HashMap中get元素时,首先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素.
  4)HashMap的resize(rehash).当HaspMap中的元素越来越多的时候,hash冲突的几率也就越来越高,因为数组的长度是固定的.所以为了提高查询的效率,就要对HashMap的数组进行扩容,数组扩容这个才做一会出现在ArrayList中,这是一个常用的操作,而在HashMap数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是resize.那么HashMap什么时候进行扩容呢?当HashMap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,这是一个折中的取值,也就是说,默认情况下,数组大小为16,那么当HashMap中元素个数超过16*0.75=12(这个值就是代码中的threshold值,也叫做临界值)的时候,就把数组的大小扩展为2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这时一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能.

3.28.简述Hashtable原理,并说明它和HashMap的区别

参考答案:

  Hashtable原理:Hashtable是基于哈希表的实现.通过使用put(Object key,Object value)方法把两个对象进行关联,需要时用get(Object key)取得与key关联的值对象.还可以查询某个对象的索引值等等.这里的get方法查找一个对象时与Vector中的get方法在内部实现时有很大不同,在一个Hashtable中查找一个键对象要比在一个Vector中快的多.这是因为Hashtable使用了一种哈希表的技术,在Java每个对象缺省都有一个通过Object的hashCode()方法获得的哈希码,Hashtable就是利用这个哈希码实现快速查找键对象的.
  二者都实现了Map接口,是将惟一键映射到特定的值上;主要区别在于:
  1.HashMap没有排序,允许一个null键和多个null值,而Hashtable不允许;
  2.HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解;
  3.Hashtable继承自Dictionary类,HashMap是Java1.2引进的Map接口的实现;
  Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步.Hashtable和HashMap采用的hash/rehash算法大致一样,所以性能不会有很大的差异.

3.29.HashMap和HashSet有什么关系?

参考答案:

  HashSet底层是采用HashMap实现的,请看如下代码:

    private transient HashMap<E,Object> map;

  上述代码是HashSet类里面定义的一个私有的成员变量.放进HashSet中对象,其实是用这个HashMap的key来储存的.当调用HashSet的add方法时,实际上是向HashMap中增加了一行(key-value对),该行的key就是向HashSet增加的那个对象,该行的value就是一个Object类型的常量.

3.30.Vector和ArrayList有什么差异?

参考答案:

  ArrayList与Vector的区别主要从两方面来说:
  1)同步性:Vector是线程安全的(同步),而ArrayList是线程不安全的;
  2)扩容:当需要扩容时,Vector默认增长一倍,而ArrayList却是一半.