一、Collection接口
Collection接口属于java.lang包,是集合类框架的主要接口,List接口、set接口、Queue接口继承了Collection接口,分别是列表、集合和队列。
1、List接口
java.lang.List接口主要定义了一些添加、获取、删除的元素的方法,主要是存储引用。注意:基本数据类型在进行操作时,会自动进行拆装箱。元素是有序的,并且可以重复,每个元素都有自己的索引
void add(Object obj); //顺序的将一个引用放入列表中,增加元素
void add(int index,Object obj); //在指定位置增加元素
Object get(int index); //获取某个位置的引用
Object remove(int index); //删除指定位置元素
void set(int index,Object obj); //更改某一位置的元素
int size(); //得到当前列表的大小
ArrayList类:List接口的实现类
- 底层结构是动态数组
- 不支持线程同步,建议在单线程时使用
- 由于底层是数组,因此查找快,增删较慢,需要移动元素
LinkedList类:List接口的实现类
- 底层使用链表数据结构
- 不支持线程同步
- 查找需要遍历链表,因此慢,增删必须要移动元素,快
Vector类:List接口的实现类
- 底层是动态数组
- 支持线程同步,是线程安全的
- 查找快,增删慢
2、Set接口
Set是接口是集合,需要满足数学上集合特性,无序性、互异性,不支持线程同步
HashSet类:
- 底层是哈希表数据结构,根据hashcode()和equals()方法确定元素的唯一性
- 集合中的元素不重复且是无序的
TreeSet类:
- 底层数据结构是二叉树
- 可以对Set集合中的元素进行排序,自然顺序。也可以自己写个类实现Comparable接口或者Comparator接口,定义自己的比较器。
先准备一个类吧,要求对年龄从小到大进行排序
public class People{
int age;
String name;
public People(int age,String name){
this.age = age;
this.name = name;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
People other = (People) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
方式一:实现Comparator接口,不需要在类中实现该接口
public static void main(String[] args) {
// TODO 自动生成的方法存根
ArrayList<People> list = new ArrayList<>();
list.add(new People(15,"张三"));
list.add(new People(14,"李四"));
list.add(new People(20,"王五"));
list.add(new People(17,"赵六"));
Collections.sort(list,new Comparator<People>() {
@Override
public int compare(People o1, People o2) {
if(o1.age > o2.age)
return -1;
if(o1.age < o2.age)
return 1;
return 0;
}
});
for(int i = 0; i < list.size();i++) {
System.out.println(list.get(i).name + ":" + list.get(i).age);
}
}
//输出
王五:20
赵六:17
张三:15
李四:14
方法二:在People类中实现Comparable接口
public class People implements Comparable<People>{
int age;
String name;
People(int age,String name){
this.age = age;
this.name = name;
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
People other = (People) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public int compareTo(People o) {
// TODO 自动生成的方法存根
if(this.age > o.age)
return 1;
if(this.age < o.age)
return -1;
return 0;
}
}
public static void main(String[] args) {
Set<People> set = new TreeSet<>();
set.add(new People(15,"张三"));
set.add(new People(14,"李四"));
set.add(new People(20,"王五"));
set.add(new People(17,"赵六"));
for(People p : set)
System.out.println(p.name + ":" + p.age);
}
//输出
李四:14
张三:15
赵六:17
王五:20
二、Map接口
该集合是存储键值对的,确保键的唯一性。综合考虑了数组查找快和链表增删快的优点。
put(Object key,Object value);//向map中放入一个值
Object get(Object key);//根据键找值
boolean containsKey(Object key);//判断Map中是否有值为key的键
remove(Object key);//删除键值为key的键值对
int size();//得到键值对的个数
1、HashMap类
- 底层是哈希表数据结构
- 可以存入null键和null值,但最多允许一个键为null,多个值为null
- 线程不同步,但是效率高
- 如果想要线程同步,可以考虑使用ConcurrentHashMap
2、 HashTable类
- 底层是哈希表数据结构
- 不允许键或者值为null
- 支持线程同步,效率没有HashTable高
3、 TreeMap
- 底层二叉树数据结构
- 线程不同步
- 可以对map集合进行排序,可以自己指定比较器,与TreeSet相似
三、Java中Collection集合常见的面试题
1、ArrayList与LinkedList的区别
2、ArrayList与Vector的区别
3、HashMap与HashTable的区别
4、HashMap与ConcurrentHashMap以及HashTable的区别
5、HashSet如何检查元素的重复
7、有关Comparator接口与Comparator接口的区别(在TreeSet与TreeMap中可能会用到)
8、ConcurrentHashMap线程安全的具体实现方式