java集合学习总结

单列集合的根接口:Collection

主要有两类:1 List   特点:元素存取有序,可重复。

2 Set   特点:元素存取无序,不可重复。

============================================================

List总结:

List其中的两个实现类:ArrayList和LinkedList

ArrayList底层是使用一个Object数组实现的,因为数组的特点,其在查找时速度快,增删时速度慢,因为要复制数组元素。

LinkedList底层是使用链表的数据结构实现的,所以在查找时速度慢,增删时速度快。

所以在选择时,根据需求分析,查找操作较多的使用ArrayList,增删操作较多的使用LinkedList

=============================================================

Set详解:

主要总结两个Set的实现类:HashSet和TreeSet

HashSet底层使用哈希表进行存储,所以在存储自定义对象时,都要重写其hashCode方法和equals方法,由hashCode方法计算出元素的存储位置,若该存储位置上已经存在元素,则调用equals方法,比较是否是相同元素,若不是,才可以存储。下面从具体代码可以看出这一存储规则:

class Person{
	int id;
	
	String name;
	
	@Override
	public int hashCode() {
		System.out.println("hashCode方法被调用");
		return id;
	}
	
	@Override
	public boolean equals(Object obj) {
		System.out.println("equals方法被调用");
		Person p = (Person)obj;
		return this.id==p.id;
	}
	
	public Person(int id, String name) {
		this.id = id;
		this.name = name;
	}
	@Override
	public String toString() {
		return id+"-"+name;
	}
}

public class Demo1 {

	public static void main(String[] args) {
		Set<Person> set = new HashSet<Person>();
		set.add(new Person(1,"jack"));
		set.add(new Person(2,"tom"));
		set.add(new Person(1,"marry"));
		System.out.println(set);
	}
}

可以看出hashCode被调用了3次,而只有在hashCode得到2个元素的hash值一样时,才会去调用equals方法判断是否为相同元素。


TreeSet底层使用红黑树(二叉树)数据结构实现,能根据元素的自然顺序或自定义比较顺序,在添加的时候进行排序。因为基本数据类型和String都实现Comparable接口,且都定义了排序规则,所以添加元素时会完成排序。

要想添加自定义对象,方法一:该类要实现Comparable接口,在该接口的唯一方法compareTo的实现内定义排序规则,

方法二:在创建TreeSet时,传入Comparator接口的实现类,该实现类重写Compare方法定义排序规则。

若两者同时使用,调用的是方法二

TreeSet判断是否为重复元素的规则与HashSet不同,他的规则就是compareTo方法或Compare方法返回的值是否为0,为0就视为重复元素。

===========================================================================================


双列集合的根接口:Map

双列集合存储键值对(key-value)的元素,根据键存储/获取值。特点:key不可重复,value可以重复。在添加重复key的value值时,调用put方法会返回该key上一次对应的value值

System.out.println(map.put("1", "jack"));
System.out.println(map.put("1", "tom"));
返回值:

null
jack


Map接口其中的3个实现类:HashMap,TreeMap

HashMap在存储时和上面的HashSet的存储规则一样,用key去进行hashCode和equals计算,判断是否为重复元素,当key为自定义元素时,需重写hashCode和equals方法

TreeMap也和TreeSet的存储规则相同,对key的排序规则进行排序,当key为自定义元素时,该元素的类需要实现Comparable接口,或在创建TreeMap时,传入Comparator实现类。

HashTable(与HashMap类似,线程安全的实现类)


Map迭代的方法:方式1:KeySet():将map的所有key转成set集合,遍历set集合,根据key可以获取value,达到map的遍历。//缺点:只能获取key的集合,获取value还需调用其他方法。

方式2:values(): 将map的所有value转成Collection集合,遍历该集合,获取所有value//缺点:只能获取value值

方式3:entrySet():将map的key和value封装成一个个对象entry<K,T>,将封装的对象们存入set集合,遍历set集合,得到一个个entry,调用entry.getkey()和entry.getValue()获取键值。

一般使用方式3.

======================================================================================

最后介绍Collections的工具类,可以对集合进行排序,二分法查找等操作,一个重要的方法是可以把线程不安全的集合转成线程安全的

static <T> List<T> synchronizedList(List<T> list) 
        
static <K,V> Map<K,V> synchronizedMap(Map<K,V> map) 


static <T> Set<T> synchronizedSet(Set<T> set) 







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值