美文网首页
Collection

Collection

作者: 大盗海洲 | 来源:发表于2019-06-16 00:08 被阅读0次

    参考地址:
    Java集合常见面试题集锦
    Java集合必会14问(精选面试题整理)

    Java中Collection和Collections的区别

    1.java.util.Collection 是一个集合接口(集合类的一个顶级接口),其直接继承接口有List与Set。
    2、Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

    1. 排序(Sort)
    2. 反转(Reverse)

    介绍Collection框架的结构

    image.png

    说说常见的集合有哪些吧?

    答:Map接口和Collection接口是所有集合框架的父接口:

    Collection接口的子接口包括:Set接口和List接口
    Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等
    Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
    List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等

    Collection框架中实现比较要实现什么接口

    要实现比较有两种方式,第一种,实体类实现Comparable<T>接口,比实现compareTo(T t)方法,我们称之为内部 比较器
    第二种,创建一个外部比较器,这个外部比较器要实现Compartor接口的compare(T t1,T t2)

    • 第一种实现comparable接口
    public class Student implements Comparable<Student> {
        private String name;
        private int age;
    
        public Student() {
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        @Override
        public int compareTo(@NonNull Student o) {
            //== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
            //equals用来比较的是两个对象的内容是否相等
            if (getAge()==o.getAge()){
                return 0;
            }else if (getAge()>o.getAge()){
                return 1;
            }
            return -1 ;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    
    
    
     @Test
        public void test(){
        Student student2 = new Student("wei", 123);
        Student student3 = new Student("wei", 0);
        Student student4 = new Student("wei", 1);
    
          List<Student> studentList = new ArrayList<>();
          studentList.add(student1);
          studentList.add(student2);
          studentList.add(student3);
          studentList.add(student4);
    
        Collections.sort(studentList);
        System.out.printf("Original  sort, list:%s\n", studentList);
      }
    
    Original  sort, list:[Student{name='wei', age=0}, Student{name='wei', age=1}, Student{name='wei', age=12}, Student{name='wei', age=123}]
    

    集合排序,需要实现comparable接口

    • 第二种实现compartor接口
        private String name;
        private int age;
    
        public Student2() {
        }
    
        public Student2(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    }
    
    
      @Test
      public void test2(){
        Student2 student1 = new Student2("wei", 12);
        Student2 student2 = new Student2("wei", 12);
    
        StudentCompartor studentCompartor = new StudentCompartor();
        String i= studentCompartor.compare(student1,student2)==0?"相等":"不相等";
        System.out.println("i:"+i);//相等
    
      }
    

    比较两个实体类大小活是否相等,用compartor 外部比较器更合适

    ArrayList 和Vector 的却别(是否有序、是否重复、数据结构、底层实现)

    相同:
    ArrayList 和Vector 都实现了List接口,他们都是有序集合,并且存放元素是允许重复的。他们底层都是数组结构,检查数据快,增删改慢。
    不同:
    1、线程安全。 Vector 是线程安全,而ArrayList 是线程不安全的。
    2、 数据增长。ArrayList 和Vector都有一个初始的容量大小,当存储进它们里面的元素好过容量时,就需要增加他们的存储容量。ArrayList 每次增长是原来的0.5倍,而Vector增长是原来的一倍。ArrayList和Vector都可以初始化空间的大小,Vector还可以设置增长的空间大小(setSize()),而ArrayList没有提供设置增长空间的方法。

    HashMap和Hashtable的区别

    HashMap和Hashtable都实现了Map接口,并且都是key-value的数据结构。它们的不同点主要在三个方面:

    HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的;
    HashMap允许K/V都为null;后者K/V都不允许为null;'
    HashMap继承自AbstractMap类;而Hashtable继承自Dictionary类;

    List 和 Map 区别?(数据结构,存储特点)

    这个要从两个方面来回答,一方面是List和Map的数据结构,另一方面是存储数据的特点。在数据结构方面,List存储的是单列数据的集合,而Map存储的是key、value类型的数据集合。在数据存储方面,List存储的数据是有序且可以重复的,而Map中存储的数据是无序且key值不能重复(value值可以重复)

    List、Map、Set三个接口,存取元素时,各有什么特点?

    List与Set具有相似性,它们都是单列元素的集合,所以,它们有一个功共同的父接口,叫Collection。Set里面不允许有重复的元素,所谓重复,即不能有两个相等(注意,不是仅仅是相同)的对象 ,即假设Set集合中有了一个A对象,现在我要向Set集合再存入一个B对象,但B对象与A对象equals相等,则B对象存储不进去。所以,Set集合的add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true,当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false。Set取元素时,没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

    List表示有先后顺序的集合, 注意,不是那种按年龄、按大小、按价格之类的排序。当我们多次调用add(Obj e)方法时,每次加入的对象就像火车站买票有排队顺序一样,按先来后到的顺序排序。有时候,也可以插队,即调用add(int index,Obj e)方法,就可以指定当前对象在集合中的存放位置。一个对象可以被反复存储进List中,每调用一次add方法,这个对象就被插入进集合中一次,其实,并不是把这个对象本身存储进了集合中,而是在集合中用一个索引变量指向这个对象,当这个对象被add多次时,即相当于集合中有多个索引指向了这个对象,如图x所示。List除了可以以Iterator接口取得所有的元素,再逐一遍历各个元素之外,还可以调用get(index i)来明确说明取第几个。

    Map与List和Set不同,它是双列的集合,其中有put方法,定义如下:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。取则可以根据key获得相应的value,即get(Object key)返回值为key 所对应的value。另外,也可以获得所有的key的结合(map.keySet()),还可以获得所有的value的结合(map.values()),还可以获得key和value组合成的Map.Entry对象的集合(map.entrySet())。

    List 以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。

    为什么数组查询比链表要快?而插入删除比链表效率低

    https://blog.csdn.net/weixin_33728268/article/details/87625867
    https://blog.csdn.net/qq_33915826/article/details/81167796

    美团试题:ArrayList和linkedlist有什么区别,如何遍历,使用for循环遍历linkedlist为什么不行,linkedlist能使用索引访问么,使用迭代器呢

    https://blog.csdn.net/qq_36520235/article/details/82535044
    ArrayList是数组数据结构,set和 get 快,Linkedlist 是双向链表数据结构,add 和remove 快
    Linkedlist 是可以用for循环遍历,只是效率比较低;区别在于是否实现RandomAccess接口而选择不同的遍历算法

    图解LinkedHashMap原理(了解基本原理,哪两种有序,如何用它实现LRU)

    LinkedHashMap是继承于HashMap,是基于HashMap和双向链表来实现的。
    HashMap无序;LinkedHashMap有序,可分为插入顺序和访问顺序两种。如果是访问顺序,那put和get操作已存在的Entry时,都会把Entry移动到双向链表的表尾(其实是先删除再插入)。
    LinkedHashMap存取数据,还是跟HashMap一样使用的Entry[]的方式,双向链表只是为了保证顺序。
    LinkedHashMap是线程不安全的。
    https://www.jianshu.com/p/8f4f58b4b8ab

    线程安全的集合 Collections.synchronized(T list/map) 其内部原理

    https://www.jianshu.com/p/9cca82a65b41

    ConcurrentHashMap了解其实现原理、扩容时做的优化、与Hashtable对比

    • ConcurrentHashMap是如何在保证并发安全的同时提高性能?
    • ConcurrentHashMap 是如何让多线程同时参与扩容?

    面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别

    CopyOnWriteArrayList 是如何保证线程安全

    ArrayList和CopyOnWriteArrayList

    相关文章

      网友评论

          本文标题:Collection

          本文链接:https://www.haomeiwen.com/subject/jfyifctx.html