集合 面试题

集合 面试题

1.HashSet 是如何保证数据不可重复的?
答:HashSet 的底层其实就是 HashMap,只不过 HashSet 实现了 Set 接口并且把数据作为 K 值,而 V 值一直使用一个相同的虚值来保存,我们可以看到源码:

public boolean add(E e) {
    return map.put(e, PRESENT)==null;// 调用 HashMap 的 put 方法,PRESENT 是一个至始至终都相同的虚值
}

由于 HashMap 的 K 值本身就不允许重复,并且在 HashMap 中如果 K/V 相同时,会用新的 V 覆盖掉旧的 V,然后返回旧的 V,那么在 HashSet 中执行这一句话始终会返回一个 false,导致插入失败,这样就保证了数据的不可重复性。

 for (Entry<K, V> e = table[i]; e != null; e = e.next) {
        Object k;
        // 判断该条链上是否有hash值相同的(key相同) 
        // 若存在相同,则直接覆盖value,返回旧value 
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            // 旧值 = 新值  
            V oldValue = e.value;
            // 将要存储的value存进去
            e.value = value;
            e.recordAccess(this);
            // 返回旧的value
            return oldValue;
        }
    }

从上我们可以看到在添加对应的key-value这样的组合时,如果原本已经存在对应的key,则直接改变对应的value,并返回旧的value,而在判断key是否存在的时候是先比较key的hashCode,再比较相等或equals的。

2.执行以下程序会输出什么结果?为什么?

Integer num = 10;
Integer num2 = 5;
System.out.println(num.compareTo(num2));

答:程序输出的结果是 1,因为 Integer 默认实现了 compareTo 方法,定义了自然排序规则,所以当 num 比 num2 大时会返回 1,Integer 相关源码如下:

public int compareTo(Integer anotherInteger) {
    return compare(this.value, anotherInteger.value);
}
public static int compare(int x, int y) {
    return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

compareTo() 方法用于将 Number 对象与方法的参数进行比较。可用于比较 Byte, Long, Integer等。

该方法用于两个相同数据类型的比较,两个不同类型的数据不能用此方法来比较。

语法

public int compareTo( NumberSubClass referenceName )

参数
referenceName – 可以是一个 Byte, Double, Integer, Float, Long 或 Short 类型的参数。

返回值
如果指定的数与参数相等返回0。

如果指定的数小于参数返回 -1。

如果指定的数大于参数返回 1。

3.如何用程序实现后进先出的栈结构?

答:可以使用集合中的 Stack 实现,Stack 是标准的后进先出的栈结构,使用 Stack 中的 pop() 方法返回栈顶元素并删除该元素,示例代码如下。

Stack stack = new Stack();
stack.push("a");
stack.push("b");
stack.push("c");
for (int i = 0; i < 3; i++) {
    // 移除并返回栈顶元素
    System.out.print(stack.pop() + " ");
}

程序执行结果:c b a

Java Stack 类
栈是Vector的一个子类,它实现了一个标准的后进先出的栈。

堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。

Stack()
除了由Vector定义的所有方法,自己也定义了一些方法:

序号 方法描述
1 boolean empty()
测试堆栈是否为空。
2 Object peek( )
查看堆栈顶部的对象,但不从堆栈中移除它。
3 Object pop( )
移除堆栈顶部的对象,并作为此函数的值返回该对象。
4 Object push(Object element)
把项压入堆栈顶部。
5 int search(Object element)
返回对象在堆栈中的位置,以 1 为基数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java集合面试题52共有52个问题,具体问题如下: 1. Java集合框架的核心接口是什么? 2. ArrayList和LinkedList的区别是什么? 3. HashSet和TreeSet的区别是什么? 4. HashMap和Hashtable的区别是什么? 5. ConcurrentHashMap和Hashtable的区别是什么? 6. 如何实现一个线程安全的集合? 7. 如何遍历一个ArrayList? 8. 如何遍历一个LinkedList? 9. 如何遍历一个HashSet? 10. 如何遍历一个TreeSet? 11. 如何遍历一个HashMap的Key? 12. 如何遍历一个HashMap的Value? 13. 如何遍历一个HashMap的Entry? 14. 如何遍历一个Hashtable的Key? 15. 如何遍历一个Hashtable的Value? 16. 如何遍历一个Hashtable的Entry? 17. 如何遍历一个ConcurrentHashMap的Key? 18. 如何遍历一个ConcurrentHashMap的Value? 19. 如何遍历一个ConcurrentHashMap的Entry? 20. 如何使用Collections类对List进行排序? 21. 如何使用Collections类对Set进行排序? 22. 如何使用Collections类对Map的Key进行排序? 23. 如何使用Collections类对Map的Value进行排序? 24. 如何使用Comparator接口对对象进行排序? 25. 如何使用Comparable接口对对象进行排序? 26. 如何使用Iterator遍历集合? 27. 迭代器的remove()方法和集合的remove()方法有什么区别? 28. 什么是Fail-Fast机制? 29. 什么是Fail-Safe机制? 30. 如何使用ListIterator进行双向遍历? 31. 如何使用Enumeration进行遍历? 32. 如何使用Iterator进行并发修改的安全遍历? 33. 如何使用并发集合类进行并发操作? 34. 如何使用CopyOnWriteArrayList进行并发操作? 35. 如何使用CopyOnWriteArraySet进行并发操作? 36. 如何使用ConcurrentSkipListSet进行并发操作? 37. 如何使用BlockingQueue进行并发操作? 38. 如何使用LinkedBlockingQueue进行并发操作? 39. 如何使用ArrayBlockingQueue进行并发操作? 40. 如何使用PriorityBlockingQueue进行并发操作? 41. 如何使用SynchronousQueue进行并发操作? 42. 如何使用ConcurrentLinkedQueue进行并发操作? 43. 如何使用DelayQueue进行并发操作? 44. 如何使用ConcurrentHashMap进行并发操作? 45. 如何使用ConcurrentSkipListMap进行并发操作? 46. 如何使用CountDownLatch进行并发操作? 47. 如何使用CyclicBarrier进行并发操作? 48. 如何使用Semaphore进行并发操作? 49. 如何使用Exchanger进行并发操作? 50. 如何使用Lock和Condition进行并发操作? 51. 如何使用ReadWriteLock进行并发操作? 52. 如何使用AtomicInteger进行并发操作? 相关问题: 1. Java基础知识面试题有哪些? 2. Java多线程面试题有哪些? 3. Java异常处理面试题有哪些?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值