zoukankan      html  css  js  c++  java
  • Java List集合和哈希表

    List集合和Set集合,先来看List集合。

    List集合存储元素的特点:

    1.有序(List集合中的元素有下标):存进去是什么样,取出来还是什么样

    2.可重复 

    可以结合以下的简单代码来看一看。

    import java.util.*;
    public class ListTest01{
     public static void main(String[] args){
       List l=new ArrayList();
       l.add(100);
       l.add(32);
       l.add(32);
       l.add(90);
       Iterator it=l.iterator();
       while(it.hasNext()){
         System.out.println(it.next());
       }
     }
    }

    编译运行后输出:

    100
    32
    32
    90

    由于ArrayList集合底层是数组,数组是有下标的,所以ArrayList集合有很多自己的特性。ArrayList集合底层默认初始化容量是10,扩大之后的容量是原容量的1.5倍。

    import java.util.*;
    public class ListTest02{
     public static void main(String[] args){
       List l=new ArrayList();
       l.add(12);
       l.add(23);
       l.add(43);
       
       //在下标为1的位置上插入元素
       l.add(1,555);
       //取得第一个元素
       System.out.println(l.get(0));
       System.out.println("-----------");
       for(int i=0;i<l.size();i++){
         Object element=l.get(i);
         System.out.println(element);
       }
     }
    }

    编译运行后输出:

    12
    -----------
    12
    555
    23
    43

    在上面代码中,首先List l=new ArrayList();new出一个新的List对象l,接着使用add()方法添加元素,l.add(a,b)可以在指定的下标为a的位置添加元素b,最后使用for循环遍历输出List l中的元素。注意for循环中的内容为List独有的遍历方式。

    Set的实现类主要有HashSet和TreeSet,在讲HashSet之前先来看看什么是哈希表。哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

    记录的存储位置=f(关键字)

    这里的对应关系f称为散列函数,又称为哈希(Hash函数),采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。

    哈希表的结构图如下图所示:

     

    哈希表是数组和单向链表的结合,我们都知道数组的特点是寻址容易,插入和删除困难,而链表的特点是寻址困难,插入和删除容易,哈希表将二者结合起来,得到了一种寻址容易,插入和删除也容易的数据结构。哈希表本质是一个数组,不过这个数组中的每个元素又都是单向链表,类似于现实世界中的字典。在单向链表的每一个节点,都包含四个组成部分,Object key; Object value; final int hash; Entry next; Entry next指向该节点的下一个节点。final int hash;是一个哈希值,是通过key调用hashCode方法得到的值,再通过“哈希算法”得出的值,并且在单向链表中每一个节点的哈希值是相同的,代表的是数组的下标。如果要对数组中某一个元素进行查找的话该怎么做呢?比如要查找一个o对象,o对象去调用hashCode方法,得出哈希值,哈希值代表数组的下标,得到数组的下标也就知道o对象在哪一个单向链表中。HashMap中有一个方法,Object get[Object key],得到Object value的值。那么如何往哈希表中添加元素呢?HashMap中有一个添加元素的方法,void put[Object key,Object value];首先调用Object key的hashCode方法,得到一个哈希值,如果哈希值已经存在于数组中,就能定位单向链表,通过key遍历单向链表,如果key与已经存在的key相同(通过equals方法),因为key无序不可重复,所以不添加,反之则在单向链表中添加;若哈希值在数组中不存在,则在数组后面的位置添加一个新的单向链表。因此哈希表的增删效率和查询效率都是非常高的。从上面的描述中我们知道Object key是非常重要的,不可重复。

    搜索微信公众号“程序员考拉”,欢迎关注!

  • 相关阅读:
    Mac php使用gd库出错 Call to undefined function imagettftext()
    centos 使用 locate
    Mac HomeBrew 安装 mysql
    zsh 命令提示符 PROMPT
    新的开始
    Java 面试题分析
    Java NIO Show All Files
    正确使用 Volatile 变量
    面试题整理 2017
    有10阶梯, 每次走1,2 or 3 阶,有多少种方式???
  • 原文地址:https://www.cnblogs.com/naihuangbao/p/9444501.html
Copyright © 2011-2022 走看看