ArrayList和HashMap到底有什么区别?

以下为个人理解:

ArrayList :数组
HashMap: 数组+键值对

所以说在java集合体系其实集合也可以按照某种维度来分为两类:
单列集合 双列集合
ArrayList是属于单列集合
HashMap: 是属于双列集合

两者的add数据的方式是不同的:
ArrayList添加数据是会根据底层数组下标去添加的
HashMap是根据添加数据的key经过计算去添加到对应位置的
怎么计算的,我这里简单的讲一下:
hashMap会拿到key的hashcode,经过扰动函数后拿到对应的hash值,通过(n-1) & hash 判断当前元素要存储的位置,如果当前位置有元素的话,就会判断当前元素与要存入的元素的hash值及key是否相同,如果相同,就直接覆盖,不相同就通过拉链法解决冲突。
1.扰动函数: 指的是hashMap的hash方法,其目的是为了防止一些实现比较差的hashCode方法,以此来减少碰撞的概率
2. (n-1)& hash n代表长度 &位运算符(不清楚的同学可以去自行了解一下) 当时其实我在想,为什么不用%来计算呢 ,其实是因为&是二进制操作符,相比效率来讲要比%快一些,那么为什么不直接拿n&hash呢,其实这样是行不通的,如果你用的运算符号是%是可以直接这么写,而用&就不行了,具体规则请自行去推理一下。
3. 拉链法: 元素很多的情况下,很大几率会出现key的hash相同,通过拉链法就可以解决,其实拉链法的这个拉链就是一个链表,大家都知道链表的特点增删快,查询慢,所以在jdk1.8的时候 对其做了一些改正,当链表长度大于8时,会转换为红黑树,来提高查询的效率

两者在获取数据的时候也是不同的:
	class Person{
		int id; //唯一
		String name;
	}
	//模拟1000个Person对象
	ArrayList.add(person) ..... (添加了1000个Person)
	现在我有一个Person 对象  id为500 我要从list集合中拿出id为500个Person
	怎么拿?
		Person p = null;
		for(int i = 0; i < arrayList.size(); i++){
			if(id == arrayList.get(i).id){
				//如果相等就赋值
				p = arrayList.get(i);
			}
		}
		当要去根据条件去获取对应的对象时,我们需要遍历才可以得到

	而hashMap,可以在存储对象的时候,根据id当做key 具体对象当做value 
	这样在获取对象的时候
		Person p = hashMap.get(500);

猜你喜欢

转载自blog.csdn.net/qq_43504447/article/details/106420059