一、前序

    前几篇文章我结合数据结构说了一些常用的集合,但是我感觉那样可能不系统,于是乎想着重写,按照由整体到细节的方式去写,这样才能更好的把握集合,废话不多说开始吧;

二、集合框架

    

上面这副图是集合框架中的基本接口,另外还有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--集合(一)的更多相关文章

  1. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  2. Scala集合和Java集合对应转换关系

    作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...

  3. java集合你了解多少?

    用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...

  4. 深入java集合学习1-集合框架浅析

    前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...

  5. Java集合框架List,Map,Set等全面介绍

    Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I]   +--java.util.ArrayList [C]   +- ...

  6. Java集合框架练习-计算表达式的值

    最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...

  7. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  8. Java 集合框架

    Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...

  9. Java集合概述

    容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用.要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系. String str = ...

  10. 深入java集合系列文章

    搞懂java的相关集合实现原理,对技术上有很大的提高,网上有一系列文章对java中的集合做了深入的分析, 先转载记录下 深入Java集合学习系列 Java 集合系列目录(Category) HashM ...

随机推荐

  1. 【JAVA零基础入门系列】Day4 变量与常量

    这一篇主要讲解Java中的变量,什么是变量,变量的作用以及如何声明,使用变量. 那么什么是变量?对于初学者而言,可以将变量理解为盒子,这些盒子可以用来存放数据,不同类型的数据需要放在对应类型的盒子里. ...

  2. jP61 2.15

    import java.util.Scanner; public class Distance { public static void main(String[] args) {    Scanne ...

  3. Vue实现选项卡切换

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  4. JavaScript命令模式

    第一,命令模式: (1)用于消除调用者和接收者之间直接的耦合的模式,并且可以对(调用这个过程进行留痕操作) (2)真的不要乱用这个模式,以为他使你简单调用写法变得非常的复杂和有些难以理解. (3)你的 ...

  5. table插件

    //动态添加一行function addRow(){ var firstrow=document.getElementById('firstrow'); var firstCopy=firstrow. ...

  6. FreeType in OpenCASCADE

    FreeType in OpenCASCADE eryar@163.com Abstract. FreeType is required for text display in the 3D view ...

  7. Oracle学习笔记之PL/SQL编程

           SQL(Structure Query Language)的含义是结构化查询语句,最早由Boyce和Chambedin在1974年提出,称为SEQUEL语言.1976年,IBM公司的Sa ...

  8. ios 返回不会自动刷新页面问题

    在实际开发过程中,移动端的兼容性问题有很大的坑,安卓可以了ios不行,ios可以了安卓又失效了这样,其中ios的回退操作就是不会自动刷新页面,很烦! 常见的history.back() history ...

  9. 关于python如果没有numpy模块如何处理

    1.在python中,你在python的shell输入>>>import numpy 但是编译器告诉你没有numpy库,这时候你就要导入python库,那么如何导入呢 2.收下访问h ...

  10. 字符串解码DecodeString

    字符串解码 原创博客,转载请注明出处!eg:ss=2[abc]3[cd]ef   return:abcabccdcdcdefss=3[a2[c]]2[a]    return:accaccaccaas ...