【Java基础】Java基础题

1. 重载和重写的区别

1)重载:

  • 发生在同一个类中,要求方法名相同、参数类型不同(个数不同、顺序不同、类型不同)

  • 和方法的返回值和访问修饰符没关系(在只有返回值和访问修饰符不同的这种情况下,编译时会报错)

2)重写: 子类重写父类的方法

  • 方法名、参数列表都相同
  • 子类的返回值范围小于父类
  • 抛出的异常范围小于父类
  • 访问修饰符的范围大于等于父类
  • 如果父类方法访问修饰符为 private 则子类就不能重写该方法

2. List 和 Set 的区别

  • List 有序、可重复、允许多个 null 元素对象,可以使用迭代器取出所有元素,再逐一遍历,还可以使用 get(index) 下标的形式获取指定下标的元素,也就是说支持随机访问
  • Set 无序,不可重复,最多容许一个 null 元素对象,取元素时,只可以使用迭代器接口取得所有元素,再逐一遍历各个元素 (很好理解鸭,它无序,所有肯定不能用 get(index) 这种方式取,下标对它来说无意义)

3. ArrayList 和 LinkedList 的区别

  • 在底层实现上,ArrayList 底层是数组,LinkedList 底层是链表
  • 这样的结构导致了他们的使用场景的区别,ArrayList 更适合随机查找比较多的场景,LinkedList 更适合删除和添加场景比较多的场景
  • ArrayList 和 LinkedList 都实现了 List 接口,但是 LinkedList 还实现了 Deque 接口,也就是说LinkedList 可以当作双端队列的来使用

4. ConcurrentHashMap 的扩容机制

  • jdk 1.7

1.7 中的 ConcurrentHashMap 基于 Segment 实现,每个 Segment 相当于一个小型的 HashMap。当需要进行扩容时,Segment 对象内部进行扩容。和 HashMap 扩容机制类似,先生成新数组,然后将元素转移到新数组中,再修改指针指向新的数组。其对扩容阈值的判断,是基于每个 Segment 内部进行判断的

【Java基础】Java基础题_第1张图片

  • jdk 1.8

1.8中的 ConcurrentHashMap 不再基于 Segment 实现,其扩容是可以多线程的。扩容之前也生成一个新数组,然后将需要转移的元素分组,每组交给不同线程转移,每个线程负责一组或多组的转移工作。若是出现扩容时,一线程想 put 的情况,则该线程帮忙一起扩容

【Java基础】Java基础题_第2张图片


你可能感兴趣的:(Java,Java)