2020/03/07-基础复习day_02

2020/03/07-基础复习day_02

1.获取用键盘输入常用的两种方法

- 方法1:通过Scanner
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
sc.close();
- 方法2:通过BufferedReader
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
String s = br.readLine();

2.接口和抽象类的区别

  • 接口的方法默认是public,在java8以前,所有的方法在接口中不能有实现,java8以后,方法可以有默认实现,抽象类可以有非抽象的方法

  • 接口中的实例变量默认是final类型的,但是抽象类则不一定

  • 一个类可以实现多个接口,但是最多只能实现一个抽象类

  • 一个类实现接口的话,需要实现接口的所有方法,抽象类不一定

  • 接口不能用new实例化,可以理解为规范

    在 JDK8 中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,必须重写,不然会报错。
    

3.ArrayListLinkedList的比较

1.是否保证线程安全:
  • ArrayListLinkedList都是不同步的,不保证线程安全
2.底层数据结构:
  • ArrayList底层使用的是Object数组;LinkedList底层使用的是双向链表数据结构
3.插入和删除数据是否受元素位置的影响:
  • ArrayList采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响
  • LinkedList采用链表存储,所以插入/删除元素时间复杂度不会受元素位置的影响,均近似O(0),但是数组是近似O(0)
4.是否支持快速高效的随机访问:
快速随机访问就是通过元素的序号快速回去元素对象( 对应 get(int index) 方法 )
  • LinkedList不支持持高效的随机元素访问,ArrayList支持
5.内存空间占用:
  • ArrayList在list列表结尾都会预留空间,LinkedList需要存放直接后继和直接前驱和数据
6.RandomAccess接口
查看源码我们发现实际上 RandomAccess 接口中什么都没有定义。所以 RandomAccess 接口是一个标识,标识实现这个接口的类具有随机访问的功能
在 binarySearch()方法中,它要判断传入的 list 是否 RamdomAccess的实例,如果是,调用indexedBinarySearch()方法,如果不是,那么调iteratorBinarySearch()方法
public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key) {
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key);
else
return Collections.iteratorBinarySearch(list, key);
}

ArrayList 实现了 RandomAccess 接口, 而 LinkedList 没有实现

  • ArrayList 底层是数组,而 LinkedList 底层是链表。数组天然支持随机访问,时间复杂度为 O(1),所 以称为快速随机访问。链表需要遍历到特定位置才能访问特定位置的元素,时间 复杂度为 O(n),所以不支持快速随机访问。
  • ArrayList 实现了 RandomAccess 接口,就表明了他具有快速随机访问功 能。 RandomAccess 接口只是标识,并不是说 ArrayList 实现 RandomAccess 接口才具有快速随机访问功能的

4.双向链表

是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。
所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

//---LinkedList的底层使用的是双向循环列表数据结构---
public interface RandomAccess {
}
public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key) {
if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)
return Collections.indexedBinarySearch(list, key);
else
return Collections.iteratorBinarySearch(list, key);
}
原文地址:https://www.cnblogs.com/ShenYian/p/12439057.html