Java--集合(一)
一、前序
前几篇文章我结合数据结构说了一些常用的集合,但是我感觉那样可能不系统,于是乎想着重写,按照由整体到细节的方式去写,这样才能更好的把握集合,废话不多说开始吧;
二、集合框架
上面这副图是集合框架中的基本接口,另外还有NavigableSet和NavigableMap这两个接口;看到这些接口如果你有些什么想法的话,那么恭喜你,你对Java集合掌握非常可以;这里述说下每个接口的主要作用以及常用的一些方法,等等针对于单个接口的实现的时候我们到时候具体再说也可以;
1.Iterator接口:主要实现对集合进行迭代的迭代器;
2.基本接口:Collection和Map,这2个接口里面封装基本的集合操作,比如add,put,get等一系列方法,总体比较简单;
3.List接口:有序集合,这里面主要包括2种数据结构前面讲的很清楚了,另外还有获取元素的方法,迭代器,索引和随机访问,也就是上面的RandomAccess接口;
4.ListIterator接口:这个是Iterator接口的子接口,这个定义一个可以在迭代器以前增加元素的方法;
5.Set接口:Set接口等同于Collection接口,Set里面add里面不允许增加相同的元素;
Java里面有个 很明显的特点,就是不直接继承接口,增加一层抽象类,然后在去实现抽象类,这样有个好处就是方便我们对抽象类扩展,一但继承接口那么就必须对接口下面的所有方法进行实现,但是抽象类却不需要;
以上简单对接口的整体框架进行介绍,接下来我们开始对每一个具体的实现进行详细介绍;
三、List接口
实现这个接口的集合主要有ArryList,Vector和LinkedList,前面介绍数据接口的链表的时候已经介绍过,这里进行下对比;ArryList和Vector这两个集合就要是基于动态数组实现的,区别就在Vector是线程同步的,每一个方法都是synchronized修饰,这个地方的好处就在于读取的时候可以开2个线程同时访问这个集合,建议是不同步的时候使用ArryList,同步的时候使用Vector,LinkedList主要是基于双向链表实现,只要明白了数据结构相信这块的东西很简单,要是不明白的话可以看下我写的链表那2章;这里需要提一下LinkedList的迭代,LinkedList实现了ListIterator这个接口,可以用来遍历集合;
四、Set接口
在明白这个之前我们先要了解一种数据结构--散列表(哈希表):
什么是Hash?是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
为什么需要Hash?上面已经简单提到出现Hash的目的,是为了快速查找到我们想要的数据,这个是针对于数组和链表结构的集合来说的,当我们需要查询集合中是否于某个元素相同的时候我们需要便利整个集合,然而我们使用Hash可以减少我们的次数;这个我们举个例子,好比我们在图书管找我们需要的一本书,假设图书管理员没有进行分类整理的话,那么我们需要在一堆乱七八糟的书堆里查找我们需要的书,但是图书管理进行分类以后我们只需要按照规则去我们需要的地方找我们需要的图书就好,那么在时间上我们就更加快速;
Hash函数?上面我们已经简单提到了,Hash表的内部是按照某种规则进行分类排列,那么接下来我们说一下常见的几种函数:
1.直接定法址;
2.数字分析法;
3.平方取中法;
4.折叠法;
5.取模(求余数);----这种最常用,集合内部散列就是这样实现的;
6.随机数法;
基本上就是这几种,应该都比较简单,大家一看就明白;关键在于2点,计算简单和分布均匀;
Hash冲突?上面简单的说了一下Hash函数,我们考虑一下这个问题,就按照取模方法来说,肯定会有2个数字计算出的的余数相同,那么针对这种情况我们怎么办,怎么处理?这就是我们所说的冲突,接下来我们说一下处理冲突的手段:
1.开放定址法,这个是基于数组实现的,根据不同的处理方式我们可以分为线性探测法,二次探测法,随机探测法,再散列函数法;这里做一下概述:当发生冲突的时候我们需要存放冲突的数据,线性探测法和二次线性探测法这两个方法主要是在自身的散列上存储数据,线性探测的就是在冲突的位置继续向下查找,直到找到为空的将数据存放,这一过程中难免会遇到已经有数据的位置,这种情况叫做聚集,影响效率,二次探测法就是将向寻址的结果平方,这样就可以向前向后查找,另外二次探测法可以避免聚集,基本上只是散列表为填满的时候,我们都可以使用上面2种方法解决冲突的问题;接下来就是在散列函数法,就是冲突的时候在增加一个散列表,重新计算地址然后将数据放入;
2.链地址法,这个居于链表和数组的实现,就是当出现冲突的时候继续增加链表的节点,HashMap就是使用的这个方法;
明白Hash是什么东西接下来我们开始看下Set接口下面的集合源码,篇幅估计会比较大,我们在下一节说;
Java--集合(一)的更多相关文章
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- java集合你了解多少?
用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...
- 深入java集合学习1-集合框架浅析
前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Java 集合框架
Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...
- Java集合概述
容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用.要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系. String str = ...
- 深入java集合系列文章
搞懂java的相关集合实现原理,对技术上有很大的提高,网上有一系列文章对java中的集合做了深入的分析, 先转载记录下 深入Java集合学习系列 Java 集合系列目录(Category) HashM ...
随机推荐
- FPGA在AD采集中的应用
AD转换,也叫模数转换,是将模拟信号转换为数字信号.目前包括电脑CPU,ARM,FPGA,处理的信号都只能是数字信号,所以数据信号在进入处理芯片前必须要进行AD转换. 在高速的AD转换中,FPGA以其 ...
- 远程连接MySQL,防火墙阻止访问,解决方法
远程连接MySQL,防火墙阻止访问,解决方法 xp/2003添加防火墙例外端口 打开防火墙,选择例外选项卡,添加端口 名称:mysqlport 端口号:3306 选中TCP win7添加防火墙例外 ...
- SqlServer和Oracle中一些常用的sql语句8 触发器和事务
--创建和执行事后触发器 --更新仓库备份表中记录时自动创建数据表且插入三条记录 create trigger db_trigger1 on 仓库备份 for update as begin if E ...
- Linux向文件添加内容的几种方法
例如,要想test.txt文件添加内容"I am a boy",test.txt在当前目录中 方法一:vi编辑法 打开终端,输入vi test.txt 回车,按a或i进入编辑模式, ...
- live555_RTSP连接建立以及请求消息处理过程
1,RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器,该类同时在其内部定义了一个RTSPClientSession类,用于处理单独的客户会话. 首先创建RTSP服务 ...
- Lavarel artisan 命令
[alex@iZ25c5aeyiiZ yiqizou3.0]# php artisan list Laravel Framework version Usage: command [options] ...
- UWP xaml 圆形头像
圆形头像 去掉黑边 拖动打开图形 圆形头像 现在很多软件都喜欢使用圆形头像 win10 uwp使用圆形头像很简单 <Ellipse Width="200" Height=&q ...
- windows server 2003安装 SQL server 2008r2 版本的步骤
大家好,这里介绍的是在系统 windows server 2003安装 SQL server 20008r2版本,如有雷同,敬请谅解,如果错误,欢迎大家多提意见 1.下载好安装包解压以后,就会出现如下 ...
- 损失函数&经验函数
损失函数:度量模型一次预测的好坏 经验函数:度量模型平均意义下的预测好坏 输出预测值F(x)与实际值Y可能不一致也可能一致,损失函数(Loss function)可以度量一次预测,记作L(Y,F(x) ...
- Java 从键盘输入
package io; import java.io.*; public class ReadAndWrite { public static void main(String[] args) { I ...