一、介绍Collection框架的结构java
集合是Java中的一个很是重要的一个知识点,主要分为List、Set、Map、Queue三大数据结构。它们在Java中的结构关系以下:数组
Collection接口是List、Set、Queue的父级接口。安全
Set接口有两个经常使用的实现类:HashSet和TreeSet。List接口的经常使用接口有ArrayList和Vector接口。数据结构
Map接口有两个经常使用的实现类:Hashtable和HashMap。多线程
二、Collection框架中实现比较要实现什么接口框架
要实现比较有两种方式:第一种,实体类实现Comparable<T>接口,并实现 compareTo(T t) 方法,咱们称为内部比较器。第二种,建立一个外部比较器,这个外部比较器要实现Comparator接口的 compare(T t1, T t2)。ide
第一种,实现Comparable接口:大数据
package com.chanshuyi.comparable; import java.util.*; 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(Student o) { if ( getAge() > o.getAge()) { return 1; } else if ( getAge() < o.getAge()) { return -1; } else { return 0; } } //重写toString() 用于输出 public String toString() { return "[" + name + "," + age + "]"; } public static void main(String args[]){ Student s1 = new Student("Tom", 12); Student s2 = new Student("Marry", 9); Student s3 = new Student("Json", 88); List<Student> studentList = new ArrayList<Student>(); studentList.add(s1); studentList.add(s2); studentList.add(s3); Collections.sort(studentList); System.out.printf("Original sort, list:%s\n", studentList); } }
第二种,实现Comparator接口:this
先定义一个Student类,无须实现任何接口。spa
public class 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; } }
定义一个外部比较器类,实现Comparator接口:
public class StudentComparator implements Comparator<Student>{ @Override public int compare(Student o1, Student o2) { if (o1.getAge() > o2.getAge()) { return 1; }else if (o1.getAge() == o2.getAge()) { return 0; }else{ return -1; } } public static void main(String args[]) { Student marry = new Student("marry", 12); Student tom = new Student("tom", 3); Student jackson = new Student("jackson", 88); StudentComparator comparator = new StudentComparator(); System.out.println(comparator.compare(marry, tom)); //1 System.out.println(comparator.compare(tom, jackson)); //-1 } }
因而可知,若是你但愿该实体类在放入集合的时候能按照你但愿的方式排序(若是集合支持),那么你须要让实体类实现Comparable接口。若是你只是须要简单比较两个实体类的大小,最后返回一个结果,那么用Comparator接口实现一个外部比较器更合适。
三、ArrayList和Vector的区别(是否有序、是否重复、数据结构、底层实现)
ArrayList和Vector都实现了List接口,他们都是有序集合,而且存放的元素是容许重复的。它们的底层都是经过数组来实现的,所以列表这种数据结构检索数据速度快,但增删改速度慢。
而ArrayList和Vector的区别主要在两个方面:
第一,线程安全。Vector是线程安全的,而ArrayList是线程不安全的。所以在若是集合数据只有单线程访问,那么使用ArrayList能够提升效率。而若是有多线程访问你的集合数据,那么就必需要用Vector,由于要保证数据安全。
第二,数据增加。ArrayList和Vector都有一个初始的容量大小,当存储进它们里面的元素超过了容量时,就须要增长它们的存储容量。ArrayList每次增加原来的0.5倍,而Vector增加原来的一倍。ArrayList和Vector均可以设置初始空间的大小,Vector还能够设置增加的空间大小,而ArrayList没有提供设置增加空间的方法。
四、HashMap和Hashtable的区别
HashMap和Hashtable都实现了Map接口,而且都是key-value的数据结构。它们的不一样点主要在三个方面:
第一,Hashtable是Java1.1的一个类,它基于陈旧的Dictionary类。而HashMap是Java1.2引进的Map接口的一个实现。
第二,Hashtable是线程安全的,也就是说是线程同步的,而HashMap是线程不安全的。也就是说在单线程环境下应该用HashMap,这样效率更高。
第三,HashMap容许将null值做为key或value,但Hashtable不容许(会抛出NullPointerException)。
五、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可多值。