Java集合类框架总结

一、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线程安全的具体实现方式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值