• 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);
    }
    
  • 相关阅读:
    mysql环境搭建
    php基础:查看上次插入的主键和影响的行数及关闭mysql连接
    php基础:文件包含与引用 require和include的区别
    php基础:echo和print_r和var_dump的区别
    php基础:变量检测
    php基础:动态变量名
    php基础:代码的短路特性和运算符优先级
    php基础:三元运算符及比较3个数的大小
    php基础:字符串基本函数
    php基础:数组的定义和遍历
  • 原文地址:https://www.cnblogs.com/ShenYian/p/12439057.html
Copyright © 2020-2023  润新知