Collection集合框架详解
【Java的集合框架】
接口:
collection map
list set
实现类:
ArryList HashSet HashMap
LinkList LinkHashSet LinkHashMap
TreeSet TreeMap
HashTable
【四个接口的区别】
1、collection:存储不唯一、无序的数据;
2、list:存储有序的、不唯一的数据;
3、set:存储无序的、唯一的数据;
4、Map:以键值对的形式存储数据,以键取值。键不能重复、值可以重复。
【List接口】
1、常用方法:
① add():在列表的最后添加元素;
② add(int index,E element):在列表的指定位置插入元素;
③ size():返回当前列表的元素个数;
④ get(int index):返回下标为index的元素。
如果没有泛型约束,返回Object类型,需要强转;如果有泛型约束,直接返回泛型类型,无需强转。
⑤ clear():清除列表中的所有数据
isEmpty():检测列表是否为空
⑥ contains():传入一个对象,检测列表中是否包含该对象。
如果传入的是String和基本数据类型,可以直接比对
如果传入的是实体类,则默认只比对两个对象的地址。因此,需要在实体类重写equals()方法;
Tips:
String s = "123";
"123".equals(s);//这个顺序可以防止空指针
⑦ indexOf():传入一个对象,返回该对象在列表中首次出现的地址。
lastIdexOf():传入一个对象,返回该对象在列表中最后一次出现的地址。
⑧remove():传入一个下标,或者一个对象,删除指定元素;
如果传入下标,返回被删除的对象,如果下标大于size(),会报下标越界异常;
如果传入对象,则要求重写equals方法,返回true或false表示删除是否成功
⑨set(index, obj):用新传入的对象,将指定位置的元素替换掉;
返回被替换掉的元素对象。
⑩subList(1,3):截取一个子列表,返回List类型;
toArray():将列表转为数组。返回一个Object[]类型的数据
2、ArrayList
实现了一个长度可变的数组,在内存空间中开辟一串连续的空间,与数组的区别在于长度可以随意修改。这种存储结构在循环遍历和随机访问元素的速度比较快。
3、LinkedList
使用链表结构存储数据,在插入和删除元素时速度非常快。
LinkedList的特有方法:
① addFirst():开头插入元素。
addLast():结尾插入元素。
② removeFirst():删除第一个元素,并返回被删除的元素。
removeLast():删除最后一个元素,并返回被删除的元素。
③getFirst():返回列表的第一个元素,不删除。
getLast():返回列表的最后一个元素,不删除。
【Set接口】
1、常用方法:与List接口基本相同。
但是,由于Set接口中的元素是无序的,因此没有与下标相关的方法。
例如:get() remove() add()
2、Set接口的特点:唯一、无序;
3、HashSet 底层是调用HashMap的相关方法,传入数据后,根据数据的HashCode进行散列运算,得到一个散列值后再进行运算,确定元素在列表中的位置。
HashSet如何确定一个对象是否相等?
① 先判断对象的hashCode(),如果hashCode不同,那肯定不是一个对象。
如果hashCode相同,那继续判断equals()方法;
② 重写equals()方法。
所以,使用HashSet存储实体对象时,必须重写对象的hashCode() 和 equals()两个方法!!
4、LinkedHashSet:在HashSet的基础上,新增了一个链表。
用链表来记录HashSet中元素放入的顺序,因此使用迭代器遍历时,可以按照放入的顺序依次读出元素。
5、TreeSet:将存入的元素,进行排序,然后输出。
如果存入的是实体对象,那么实体类必须实现Comparable接口,并重写compareTo()方法。
或者,也可以在实例化TreeSet的同时,通过构造函数传入一个比较器(一个实现了Comparator接口,并重写了compare()方法的实现类的对象。
Set<person> set = new TreeSet<Person>(new Comparator(){
public int compare(Person p1,Person p2){
return p1.getId() - p2.getId();
}
});
Set<Person> set = new TreeSet<Person>(new Compare());
class Compare implements Comparator(){
//重写compare方法
}
【Comparable接口和Comparator接口的区别】
1、Comparable由实体类实现,重写comparTo()方法;
实体类实现Comparable接口以后,TreeSet使用空参构造即可
2、Comparator需要单独一个比较类进行实现,重写Compare()方法。
实例化TreeSet的时候,需要传入这个比较类的对象。
【Map接口】
1、Map接口特点:以键值对的形式存储数据,以键取值。
键不能重复,值可以重复。
2、Map接口的常用方法:
① put(key,value):向map的最后追加一个键值对;
② get(key):通过键,取到一个值;
③ clear():清除Map中的所有数据;
④ containsValue(obj):检测是否包含指定的键
containsKey(obj):检测是否包含指定的键
【HashMap 与 Hashtable 的主要区别】
1、Hashtable是线程安全的(线程同步),HashMap是线程不安全的(线程不同步);
2、Hashtable的键不能为null,HashMap的键可以为null;
3、HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口。
4、HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。
5、HashMap扩容时是当前容量翻倍即:capacity*2,Hashtable扩容时是容量翻倍+1即:capacity*2+1。
【LinkedHashMap】
可以使用链表,记录数据放入的次序,进入让读出的顺序与放入的顺序一致,与LinkedHashSet一样。
【TreeMap】
根据键的顺序,进行排序后,输出。
如果传入的是实体对象,必须重写比较函数。详见TreeSet。
Collection集合框架详解的更多相关文章
- java集合框架详解
java集合框架详解 一.Collection和Collections直接的区别 Collection是在java.util包下面的接口,是集合框架层次的父接口.常用的继承该接口的有list和set. ...
- Java集合框架详解(全)
一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...
- Java—集合框架详解
一.描述Java集合框架 集合,在Java语言中,将一系类的对象看成一个整体. 首先查看jdk中的Collection类的源码后会发现Collection是一个接口类,其继承了java迭代接口Iter ...
- java的集合框架详解
前言:数据结构对程序设计有着深远的影响,在面向过程的C语言中,数据库结构用struct来描述,而在面向对象的编程中,数据结构是用类来描述的,并且包含有对该数据结构操作的方法. 在Java语言中,Jav ...
- Java--集合框架详解
前言 Java集合框架的知识在Java基础阶段是极其重要的,我平时使用List.Set和Map集合时经常出错,常用方法还记不牢, 于是就编写这篇博客来完整的学习一下Java集合框架的知识,如有遗漏和错 ...
- iOS 开发之照片框架详解(2)
一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)
转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...
- iOS 开发之照片框架详解
转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework.html 一. 概要 在 iOS 设备中,照片和视频是相当重 ...
- Java集合中List,Set以及Map等集合体系详解
转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...
随机推荐
- FxCop卸载后依然生成文件夹的问题
在 http://www.cnblogs.com/heroius/p/8270004.html 中,通过编辑csproj文件可以移除对旧版nuget独立程序的依赖. 实际上,通过编辑项目文件的方式可以 ...
- 手写ButterKnife
开发中使用注解框架可以极大地提高编码效率,注解框架用到的技术可以分为两种,运行时注解跟编译时注解.运行时注解一般配合反射机制使用,编译时注解则是用来生成模板代码.这里我们分别使用这两种方法实现Butt ...
- 测试对bug如何分析和定位
如何去区分一个功能测试工程师的水平高和低? 可以从很多个方面去检查,比如测试的思路, 比如测试用例的覆盖度?,比如测试出bug是否能够定位到根因? 上面说的各个方面都很合理,那我们平常如何如更深的定位 ...
- zip详解
http://www.360doc.com/content/06/0915/14/10610_208147.shtml
- SQL根据B表内容修改A表内容,查询表中重复记录,删除掉重复项只保留一条
以下sql是a,b两张表通过关联条件id修改a表值,如果b表有重复数据记录,选第一条更新,红色条件为附加限制条件,具体视情况而定: UPDATE a SETname = b.fname,pwd = b ...
- iOS 代码开发规范
最近公司因为业务增多,又招了一个iOS小伙伴,内心无比开心呀.但是多了一个人,日常代码开发就要统一规范起来,方便日后维护和查找.下边列一下我日常用到一些代码规范. (一).SVN规范 1.代码一定要先 ...
- python学习笔记1——基础
1)注释 单行注释以#开头,例:#第一个注释 多行注释可用多个#号,还有'''和""",例: #第一行注释 #第二行注释 ''' 第三行注释 第四行注释 ''' &quo ...
- 201621123057 《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 答: (普通方法 / 构造函数)重载. static . final.继承与多态.extends.object类.abstrac ...
- bzoj千题计划271:bzoj4869: [六省联考2017]相逢是问候
http://www.lydsy.com/JudgeOnline/problem.php?id=4869 欧拉降幂+线段树,每个数最多降log次,模数就会降为1 #include<cmath&g ...
- C++高效安全的运行时动态类型转换
关键字:static_cast,dynamic_cast,fast_dynamic_cast,VS 2015. OS:Window 10. C++类之间类型转换有:static_cast.dynami ...