Java集合框架知多少——干货!!!
Java集合框架的组成
注意:四个接口的区别
① Collection:存储无序的、不唯一的数据;
② List:存储有序的、不唯一的数据;
③ Set:存储无序的、唯一的数据;
④ Map:以键值对的形式存储数据,以键取值,键不可以重复、值可以重复。
下面分别看一下各个接口和对应的实现类:
一、List接口
有序、不唯一
1、常用方法:
① add(): 在列表的最后添加元素;
② add(index,obj): 在列表的指定位置插入元素;
③ size(): 返回当前列表的元素个数;
④ get(int index): 返回下标为index的元素;
如果没有泛型约束,返回object类型,需要强转;如果有泛型约束,直接返回泛型类型,无需强转
⑤ clear(): 清除列表中所有元素。
isEmpty(): 如果此列表不包含元素,则返回 true。 检测列表是否为空。
⑥ contains(): 传入一个对象,检测列表中是否包含该对象;
如果传入的是String 和 基本数据类型,可以直接比对;
如果传入的是实体对象,则默认只对比两个对象的地址。因此,需要在实体类重写equal()方法。
⑦ indexof(): 传入一个对象,返回该对象在列表中首次出现的地址。
LastIndexof(): 最后一次。
⑧ remove(): 传入一个下标,或者一个对象,删除指定元素。
如果传入下标,返回被删除的元素对象。如果下标大于size(),会报下标越界异常。
如果传入对象,则要求重写equal()方法,返回true或false表示删除是否成功。
⑨ set(index,object): 用新传入的对象,将指定位置的元素替换掉。
返回被替换掉的元素对象。
⑩ List.subList(1,3): 截取一个子列表,返回List类型。
toArray(): 将列表转为数组,返回一个object[]类型的数组。
2、实现类:
1)ArrayList
实现了一个长度可变的数组,在内存空间中开辟一串连续的空间,与数组的区别在于长度可以随意修改。
这种存储结构,在循环遍历和随机访问元素时的速度比较快。
2)LinkedList
使用链表结构存储数据,在插入和删除元素时速度非常快。
线程不安全,速度较快,常用!
LinkedList 的特有方法:
① add.first(): 开头插入元素。(在该列表开头插入指定的元素。)
add.last(): 结尾插入元素。(将指定的元素追加到此列表的末尾。)
② removeFirst(): 删除第一个元素,并返回被删除的元素。
removeLast(): 删除最后一个元素,并返回被删除的元素。
③ getFirst(): 返回列表的第一个元素,并不会被删除。
getLast(): 返回列表的最后一个元素,并不会被删除。
3、List循环遍历方法:
1)使用for循环遍历列表:
2)使用foreach遍历列表:
3)使用iterator迭代器遍历列表
① 使用列表调用 .iterator()返回一个迭代器对象。
② 使用迭代器对象调用.hasNext()判断是否有下一条数据。
③ 使用迭代器对象调用.next()取出下一条数据
二、Set接口
无序、唯一
1、常用方法:
与List接口基本相同。(参考上述List接口常用方法 ↑↑↑)
但是,由于Set接口中的元素是无序的,因此没有与下标相关的方法。
例如:get(index) remove(index) add(index,obj) ... ...
2、实现类
1)HashSet
HashSet 底层是调用HashMap的相关方法,传入数据后,根据数据的hashCode进行散列运算。
得到一个散列值后再进行运算,确定元素在序列中存储的位置。
HashSet如何确定两个对象是否相等?(存储无序、唯一的数据)
① 先判断对象的hashCode(),如果hashCode不同,那肯定不是一个对象;
如果hashCode相同,那继续判断equal方法。
② 重写equal()方法。
>>>所以,使用HashSet存储实体对象时,必须重写hashCode()和equal()两个方法!
2)LinkedHashSet
LinkedHashSet:在HashSet的基础上,新建了一个链表。
用链表来记录HashSet中元素放入的顺序,因此使用迭代器遍历时,可以按照放入的顺序依次读出元素。
3)TreeSet
TreeSet:将存入的元素,进行排序,然后再输出。(二叉树原理)
如果存入的是实体对象:
(1)那么实体类必须实现Comparable接口,并重写compareTo()方法。
Set<Person> set3 = new TreeSet<Person>();
排序后,遍历输出:
实现Comparable接口:
重写compareTo()方法:
(2)或者,也可以在实例化TreeSet的同时,通过构造函数传入一个比较器;
比较器:一个实现了Comparator接口,并重写了compare()方法的实现类的对象。
① 使用匿名内部类,拿到一个比较器对象。
Set<Person> set = new TreeSet<Person>(new Comparator(){
public int compare(Person p1,Person p2){
return p1.getId() - p2.getId();
}
});
② 自定义一个比较类,实现Comparator 接口。
Set<Person> set = new TreeSet<Person>(new Compare());
class Compare implements Comparator(){
// 重写compare方法。
}
[ Comparable接口 和 Comparator接口 的区别 ]
① Comparable 由实体类实现,重写compareTo()方法;
实体类实现Comparable接口以后,TreeSet使用空参构造即可。
② Comparator 需要单独一个比较类进行实现,重写compare()方法。
实例化TreeSet的时候,需要传入这个比较类的对象。
三、Map接口
以键值对的形式存储数据,以键取值;键不能重复,值可以重复。
1、常用方法:
① put(key,value): 向map的最后追加一个键值对;
② get(key): 通过键,取到一个值;
③ clear(): 清除map中的所有数据;
④ containsValue(obj): 检测是否包含指定的值;
containsKey(obj): 检测是否包含指定的键。
⑤ replace(key,oid v,new v): 替换值
2、实现类:
1)HashMap 与 HashTable
区别:
① HashTable 是线程安全(线程同步)的,HashMap是线程不安全的(线程不同步);
② HashTable 的键不能为null;HashMap的键可以为null;
2)LinkedHashMap
可以使用链表,记录数据放入的次序,读出的顺序和放入的顺序一致,与LinkedHashSet一样。
3)TreeMap
根据键的顺序,进行排序后,输出。(与TreeSet类似,参见上述TreeSet)
如果传入的是实体对象,必须重写比较函数。(见TreeSet)
3、遍历Map的方式:
Java集合框架知多少——干货!!!的更多相关文章
- Java集合框架面试题
www.cnblogs.com/zhxxcq/archive/2012/03/11/2389611.html 这里的两个图很形象,由于放进图片链接,图片显示不了,所以只能给出该链接. Java集合框架 ...
- Java集合框架梳理(含经典面试题)
Java Collections Framework是Java提供的对集合进行定义,操作,和管理的包含一组接口,类的体系结构. 1. 整体框架 Java容器类库一共有两种主要类型:Collection ...
- 浅入深出之Java集合框架(中)
Java中的集合框架(中) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
- Java集合框架总结
java集合框架主要分为实现了Collection接口的List和Set.映射接口Map. |-- List 有序,元素都有索引,可重复. |-- Set 无序,不可以存储重复的元素. |-- Map ...
- Java集合-----java集合框架常见问题
1什么是Java集合API Java集合框架API是用来表示和操作集合的统一框架,它包含接口.实现类.以及帮助程序员完成一些编程的算法. 简言之,API在上层完成以下几件事: ● 编程更加省力,提高城 ...
- Java集合框架详解(全)
一.Java集合框架概述 集合可以看作是一种容器,用来存储对象信息.所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下. 数组与集合的区别如下 ...
- Java集合框架体系JCF
Java 集合框架体系作为Java 中十分重要的一环, 在我们的日常开发中扮演者十分重要的角色, 那么什么是Java集合框架体系呢? 在Java语言中,Java语言的设计者对常用的数据结构和算法做了一 ...
- java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类
本文关键词: java集合框架 框架设计理念 容器 继承层级结构 继承图 集合框架中的抽象类 主要的实现类 实现类特性 集合框架分类 集合框架并发包 并发实现类 什么是容器? 由一个或多个确 ...
- java集合框架综述
一.集合框架图 简化图: 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和 ...
随机推荐
- Java代理模式之动态代理
动态代理类的源码是程序在运行期间由JVM根据反射等机制动态生成的,所以不存在代理类的字节码文件.代理角色和真实角色的联系在程序运行时确定! Java中有两种动态代理,一种是JDK自带的,另一种的CGL ...
- ELK+filebeat、kafka、zookeeper搭建文档
系统:centos 6.5 JDK:1.8 Elasticsearch-6.0.0Logstash-6.0.0kibana-6.0.0zookeeper-3.5.3kafka_2.12-1.0.0fi ...
- 设计模式 --> (14)中介者模式
中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了 ...
- Matlab绘图基础——图形修饰处理(入门)
引入--标题.色条.坐标轴.图例等 例一: set(groot,'defaultAxesLineStyleOrder','remove','defaultAxesColorOrder','remove ...
- scrapy---callback 传递自定义参数
在scrapy提交一个链接请求是用 Request(url,callback=func) 这种形式的,而parse只有一个response参数,如果自定义一个有多参数的parse可以考虑用下面的方法实 ...
- js浮点数运算的坑,多少同学有碰到过?
javascript中的数字都是双精度的浮点数. JavaScript中的整数并不是一个独立的数据类型,而是浮点数的一个子集. 浮点数的坑我们看下面的例子 在浏览器的console 控制台上我们分别进 ...
- Hibernate学习笔记三 多表
一对多|多对一 表中的表达 实体中的表达 实体代码: package com.yyb.domain; import java.util.HashSet; import java.util.Set; p ...
- web服务器学习4---httpd-2.4.29优化
实验环境: 环境:CentOS 7.4 软件版本:httpd-2.4.29 一.网页压缩 1.检查是否安装压缩模块 apachectl -D DUMP_MODULES | grep deflate 如 ...
- Alpha冲刺No.10
一.站立式会议 我们的阿尔法冲刺也基本宣告血崩,虽然很多功能已经实现,但是并没有串联在一起,好在这周不需要上课,我们也能好好睡一觉 实现手机的定位系统 细化界面设计 解决数据库和软件交互的一些问题 二 ...
- C作业--数据类型
一.PTA实验作业 题目1:7-3 倒顺数字串 1. 本题PTA提交列表 2. 设计思路(伪代码) (1)本题是要求输入倒顺序数串,首先看到这种题肯定是需要用到循环,那就先定一个整形i来进行循环,n是 ...