java集合杂谈
一:java集合框架如下图所示:
大致说明:
看上面的框架图,先抓住它的主干,即Collection和Map。
1、Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作和属性。Collection包含了List和Set两大分支。
(1)List是一个有序的队列,每一个元素都有它的索引。第一个元素的索引值是0。List的实现类有LinkedList, ArrayList, Vector, Stack。
(2)Set是一个不允许有重复元素的集合。Set的实现类有HastSet和TreeSet。HashSet依赖于HashMap,它实际上是通过HashMap实现的;TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。
2、Map是一个映射接口,即key-value键值对。Map中的每一个元素包含“一个key”和“key对应的value”。AbstractMap是个抽象类,它实现了Map接口中的大部分API。而HashMap,TreeMap,WeakHashMap都是继承于AbstractMap。Hashtable虽然继承于Dictionary,但它实现了Map接口。
3、接下来,再看Iterator。它是遍历集合的工具,即我们通常通过Iterator迭代器来遍历集合。我们说Collection依赖于Iterator,是因为Collection的实现类都要实现iterator()函数,返回一个Iterator对象。ListIterator是专门为遍历List而存在的。
二.具体详细讲解:
1.List接口:
有序的 collection(也称为序列),允许重复,此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
2.ArrayList原理:
当我们调用无参构造方法来构造ArrayList对象的时候,它会在内部分配一个出事大小为10的一个Object类型数组,当添加的数组容量超过数组大小的时候会产生一个新的数据,新的数组大小为原来数据大小的1.5倍,接着把元数组
中的数据拷贝到新的数组中;
3.LinkedList原理:
LinkedList内部封装的是双向链表数据结构,每一个节点是一个Node对象,Node对象中封装的是你要添加的元素,还有一个指向上一个Node对象的应用和指向下一个Node对象的引用,不同的容器有不同的数据结构,不同的数据结构操作起来性能是
不一样的,链表数据结构做添加、删除的效率比较高,做查询效率比较低;数组结构,做查询效率高,因为可以通过下标直接找到元素,但添加和删除效率比较低,因为要做以为操作;
4.Map接口详解:
映射(map):是一个存储键/值对的对象,给定一个键,可以查询得到它的值,键和值都是对象;
键必须唯一,值可以重复,有些映射可以接收null键和null值,有些则不行;
Map:映射唯一关键字给值;
Map.Entry:描述映射中的元素(关键字/值对),这是Map的一个内部类;
SortedMap:扩展Map以便关键字按照升序保持;
5.HashMap类:基于哈希表的map接口的实现,并允许使用null键和null值;
HashMap实现Map并扩展AbstractMap,本身并没有增加任何新的方法;
散列映射不保证它的元素的顺序,元素加入散列映射的顺序并不一定是它们被迭代读出的顺序;
//当我们调用put(key,value)方法的时候,首先会把key和value封装到Entry这个静态类对象中,
//把Entry对象再添加到数组中,所以我们想获取map中的所有键值对,我们只需要取得数组的所有Entry对象,接下来调用Entry对象
//中的获取键值对的方法
/*hashmap调用默认构造方法会产生一个底层长度为16的Entry数组,
* int hash =hash(key.hashCode());
* 首先调用key的hashcode方法得到一个整数--哈希码
* 把哈希码作为参数传递到hash函数中进行运算-散列函数得到一个整数值
* int i= indexFor(hash,table.length);
* 把散列值和数组的长度进行运算,最终得到Entry对象要存放的数组的位置;
* hashmap的内部结构是数组链表结构,因为不同的key有可能算出来是相同的数列值,根据数列值计算出存放的数组的下表会冲突;
6.哈希码:
当调用对象的hashCode()方法时会返回当前对象的哈希码值,支持此方法是为了提高哈希表的性能;
hashCode的常规协定:
若根据equals(Object)方法,两个对象是相等的,那么对这两个对象中的对象调用hashCode()方法都必须生成相同的整数结果;
同一对象:HashCode相同且或者键相同或者equals相同;
7.TreeMap:
TreeMap类通过使用红黑树实现Map接口,提供按排序顺序存储键/值对的有效手段,同时允许快速检索,不像散列映射,树映射保证它的元素按关键字升序排列;
TreeMap实现SortedMap并且扩展AbstractMap,它本身并没有定义其他方法;
/*TreeMap的key存储引用类型数据,需要满足一定条件:
* 要么引用类型实现Comparable接口
* 要么为该TreeMap容器提供实现Comparable接口的比较器对象
* */
8.Set容器:
Set容器是一个不包含重复元素的Collection,并且最多包含你一个null元素,它和list容器相反,Set容器不能保证其元素的顺序,常用实现类有Hash和TreeSet;
9.HashSet:
HashSet扩展AbstractSet并且实现Set接口,HashSet使用散列表(又称哈希表)进行存储,没有定义任何超过他的父类和接口提供的其他方法;
散列集合没有确保其元素的顺序,因为散列通常不参与排序;
10.TreeSet:
TreeSet为使用树来进行存储的Set接口提供了一个工具,对象按升序存储,访问和检索很快;在存储了大量的需要进行快速检索的排序信息时,TreeSet可以得到很好的应用;
TreeSet的内部操作的底层结构是TreeMap,只是我们操作的是TreeMap的key;
11.Collections类:
Collections类是类集工具类,定义了若干用于类集合映射的算法,这些算法被定义为静态方法;
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 = ...
随机推荐
- PCLVisualizer可视化类(4)
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=168 多视口显示 所示,并进行比较分析,利用不同的搜索半径,基于同一点云计算 ...
- Ubuntu 使用 heirloom-mail 调用外部邮箱 SMTP 服务器发送邮件
使用本地服务发邮件,经常被过滤掉而且占用资源,发送成功率不高.所以使用外部SMTP服务器发送邮件成为了需求. SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰,简单地说就是要求必须在提供了账户名和 ...
- Frequent Pattern 挖掘之二(FP Growth算法)
Frequent Pattern 挖掘之二(FP Growth算法) FP树构造 FP Growth算法利用了巧妙的数据结构,大大降低了Aproir挖掘算法的代价,他不需要不断得生成候选项目队列和不断 ...
- HDU 5980 Find Small A (水题)
题意:众所周知,字符 'a' 的ASCII码为97.现在,找出给定数组中出现了多少次 'a' .注意,此处的数字为计算机中的32位整数.这表示, 1个数字由四个字符组成(一个字符由8位二进制数组成). ...
- HTML中的ID不能以数字开头
最近在学习网页制作,发现ID在w3c规范里是不能以一个数字开头的,chrome浏览器是可以,firefox就不能使用数字开头了,其它浏览器未测试. 记录一下! W3C规范链接:http://www.w ...
- Java静态导入
Java静态导入 静态导入的语法是: import static ...; 静态导入的好处就是可以简化一些操作,例如System.out.println(…);就可以将其写入一个静态方法 import ...
- Instruments10 分析某个类中方法的执行时间
此步骤也可用户内存分配.内存泄漏的检测 最新操作步骤参考: https://www.jianshu.com/p/e499ce63ed72
- 浅谈JavaScript--事件委托与事件监听
事件监听 该方法用于向指定元素添加事件句柄(代码块),且不会覆盖已存在的事件句柄. 即可以向同一个元素添加同一个事件多次. 添加事件 语法: element.addEventListener(even ...
- 暴风魔镜SDK:MojingSDK For Unity V1.3.5112 (R).zip
去年买了个暴风魔镜4,如今一直放在家里吃灰,这些天对Unity3D开发VR兴趣正浓,刚好公司项目不忙,花了几天玩玩暴风魔镜SDK,因为网上的资料不算多,暴风提供的文档也不太适合像我这样的Unity小白 ...
- ios 自定义导航栏,开启侧滑返回手势
自定义一个常用ListViewController .h文件 #import <UIKit/UIKit.h> @interface ListViewController : UIViewC ...