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 集合 韩顺平老师 底层对比分析的主要内容,如果未能解决你的问题,请参考以下文章

Go语言视频免费下载了!尚硅谷韩顺平老师再次发力!

韩顺平循序渐进学Java零基础 第11章 枚举和注解

韩顺平循序渐进学java 第21讲 集合(未完待续)

韩顺平循序渐进学Java零基础 第14章 集合

韩顺平老师的“坚持”说

韩顺平循序渐进学Java零基础 第15章 泛型