Java 集合 韩顺平老师 底层对比分析
Posted codeSpiderMan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 集合 韩顺平老师 底层对比分析相关的知识,希望对你有一定的参考价值。
1 集合框架
Collection接口有List和Set这两个主要的接口,他们的实现类都是单列集合
Map接口的实现子类是双列集合,存放key和value这样的数据
2 对比和底层机制
1 ArrayList和Vector
ArrayList 的底层操作机制源码分析
Vector
对比
ArrayList 和LinkedList
LinkedList 的底层操作机制
ArrayList 和LinkedList 的比较
3 List和Set的区别
List特点:元素有放入顺序,元素可重复
Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉(元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)
4 HashSet和LinkedHashSet
-
HashSet
-
LinkedHashSet
5 HashMap和HashTable
6 equals()与hashCode()
hashCode()用于获取哈希码(散列码),eauqls()用于比较两个对象是否相等,它们应遵守如下规定:
-
如果两个对象相等,则它们必须有相同的哈希码。
-
如果两个对象有相同的哈希码,则它们未必相等。
需要注意的是当equals()
方法被override时,hashCode()
也要被override。
当向HashSet中加入一个元素时,它需要判断集合中是否已经包含了这个元素,从而避免重复存储。HashSet首先会调用对象的hashCode()方法获取其哈希码,并通过哈希码确定该对象在集合中存放的位置。假设这个位置之前已经存了一个对象,则HashSet会调用equals()对两个对象进行比较。若相等则说明对象重复,此时不会保存新加的对象。若不等说明对象不重复,但是它们存储的位置发生了碰撞,此时HashSet会采用链式结构在同一位置保存多个对象,即将新加对象链接到原来对象的之后。之后,再有新添加对象也映射到这个位置时,就需要与这个位置中所有的对象进行equals()比较,若均不相等则将其链到最后一个对象之后。
3 遍历
1 遍历 ArrayList
import java.util.*;
public class Test
public static void main(String[] args)
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("HAHAHAHA");
//第一种遍历方法使用 For-Each 遍历 List
for (String str : list) //也可以改写 for(int i=0;i<list.size();i++) 这种形式
System.out.println(str);
//第二种遍历,把链表变为数组相关的内容进行遍历
String[] strArray=new String[list.size()];
list.toArray(strArray);
for(int i=0;i<strArray.length;i++) //这里也可以改写为 for(String str:strArray) 这种形式
System.out.println(strArray[i]);
//第三种遍历 使用迭代器进行相关遍历
Iterator<String> ite=list.iterator();
while(ite.hasNext())//判断下一个元素之后有值
System.out.println(ite.next());
2 遍历 Map
import java.util.*;
public class Test
public static void main(String[] args)
Map<String, String> map = new HashMap<String, String>();
map.put("1", "value1");
map.put("2", "value2");
map.put("3", "value3");
//第一种:普遍使用,二次取值
System.out.println("通过Map.keySet遍历key和value:");
for (String key : map.keySet())
System.out.println("key= "+ key + " and value= " + map.get(key));
//第二种
System.out.println("通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext())
Map.Entry<String, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
//第三种:推荐,尤其是容量大时
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String, String> entry : map.entrySet())
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
//第四种
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values())
System.out.println("value= " + v);
以上是关于Java 集合 韩顺平老师 底层对比分析的主要内容,如果未能解决你的问题,请参考以下文章