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是非常重要的,不可重复。
搜索微信公众号“程序员考拉”,欢迎关注!
Java List集合和哈希表的更多相关文章
- 集合>哈希表类Hashtable和SortedList排序列表类
集合>哈希表类Hashtable Hashtable一种键值对的集合 ,哈希表内部的排列是无序的,而且哈希表没有提供排序方法. 集合>哈希表类Hashtable>构造普通哈希表 代码 ...
- 11、C#基础整理(特殊集合和哈希表)
特殊集合:队列.栈 一.栈Stack类:先进后出,没有索引 Stack ss = new Stack(); 1.增加数据:push :将元素推入集合 ss.Push(); ss.Push(); ss. ...
- C#部分---特殊集合:stack栈集合、queue队列集合、哈希表集合。
1.stack栈集合:又名 干草堆集合 栈集合 特点:(1)一个一个赋值 一个一个取值(2)先进后出实例化 初始化 Stack st = new Stack(); //添加元素用push st.Pus ...
- Stack集合 Queue队列集合 Hashtable哈希表
Stack集合 干草堆集合 栈集合 栈;stack,先进后出,一个一个赋值,一个一个取值,安装顺序来. 属性和方法 实例化 初始化 Stack st = new Stack(); 添加元素 个数 Co ...
- Java数据结构和算法 - 哈希表
Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...
- Python 字典和集合基于哈希表实现
哈希表作为基础数据结构我不多说,有兴趣的可以百度,或者等我出一篇博客来细谈哈希表.我这里就简单讲讲:哈希表不过就是一个定长数组,元素找位置,遇到哈希冲突则利用 hash 算法解决找另一个位置,如果数组 ...
- Java哈希表入门
Java哈希表(Hash Table) 最近做题经常用到哈希表来进行快速查询,遂记录Java是如何实现哈希表的.这里只简单讲一下利用Map和HashMap实现哈希表. 首先,什么是Map和HashMa ...
- Java学习笔记31(集合框架五:set接口、哈希表的介绍)
set接口的特点: 1.不包含重复元素 2.set集合没有索引,只能用迭代器或增强for循环遍历 3.set的底层是map集合 方法和Collection的方法基本一样 set接口的实现类HashSe ...
- 链表与哈希表基本概念及Java常用集合
-链表- 是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成.每个结点包括两个 ...
随机推荐
- Java面向对象之异常(throw与throws)
一.基础概念 1.throw和throws的区别: 位置不同:throws用在函数上,后面跟的是异常类,可以跟多个. throw用在函数内,后面跟的是异常对象. 功能不同:throws用来声明异常,让 ...
- Access MongoDB Data with Entity Framework 6
This article shows how to access MongoDB data using an Entity Framework code-first approach. Entity ...
- [Swift实际操作]八、实用进阶-(7)使用通知的方法进行对象间的消息传递
本文将为你演示,如何使用Notification Center进行消息的传递.通知中心是一个调度消息通知的类,采用单例设计模式,实现数据传递,回调等功能.首先打开自定义视图的代码文件(CustomVi ...
- UItextfield各个通知和回调的顺序
成为第一响应者之前,调用delegate的textFieldShouldBeginEditing(_:)方法 成为第一响应者 发送通知UIKeyboardWillShow和UIKeyboardDidS ...
- scrapy连接MySQL
Scrapy中连接MySQL所需要做的工作如下: 1.settings中需要设置的部分 # 启动管道组件 ITEM_PIPELINES = { 'QianChengWuYu.mongoDBPiplel ...
- [原创] Linux 中的 nohup 与 &
目录 背景 结论放前面 & nohup nohup + & 测试 直接运行 单独使用 & 单独使用 nohup nohup + & 背景 一直没搞清楚 nohup 与 ...
- 【杂记】linux下各种软件安装方法(持续记录)
1.安装jdk: 网上一堆说先从windows下压缩包,然后通过共享文件夹copy到linux系统里,然后解压安装,emmmmm 首先进入usr文件夹,新建java文件夹: mkdir java 直接 ...
- mfix18.1.1的cmake编译相关问题
今天把mfix-18.1.1\model\monitors里的文件拷到当前工作目录,进行修改编译,发现修改后运行发现并没有出现任何修改后的效果,发现这几个文件只有在原始目录里修改的才起作用,拷贝到当前 ...
- js的跨域问题和解决办法
我们在开发中,经常会遇到跨域请求数据问题,那么什么是跨域呢?跨域就是js在不用域之间的数据传输或者通信,比如你在使用ajax从另外一个域请求数据,或者你的页面引入了iframe,要从iframe中获取 ...
- LESS从入门到精通
LESS从入门到精通 一.LESS是什么 LESS 是 CSS预处理语言,是 CSS 的扩展. 然后说说比较流行的几款预编译器:SASS/SCSS.LESS.Stylus. SASS 学习网站: ht ...