JavaSE集合基础总览
Java集合
Java集合,也称之为容器。基本上你写所有的Java程序,都必须要用到一个包。该API基本都位于java.util工具类包中,是JavaSE中的重中之重。
简单可以总结为“1136”,分别是一个图,一个类,三个知识点,六个接口。下面逐个剖析。
1.一个图
备注:
- 实现Collection接口的,基本都是按个的方式存入的集合类。
- 实现Map接口的,基本都是按照键值对的方式存入的集合类。
- 这两个接口都定义了该类型集合的基本方法。
- Collectionz中,两个对象互相equalsw为true,即为重复。(或者说,是hashCode中相等)
(1)六个接口:Collection接口
- import java.util.*;
- public class CollectionTest {
- public static void main(String[] args) {
- // 父类引用,指向子类对象
- // 为求方便更换其他子类的实现
- Collection c = new ArrayList<>();
- // 可以放入不同类型的对象
- c.add("hello");
- c.add("f1");
- c.add(new Integer(100));
- System.out.println(c.size()); //
- System.out.println(c); // [hello,f1,100]
- }
- }
(2)六个接口:Iterator接口
大部分容器类,都必须实现Collection接口,而实现该接口必须实现其的iterator方法。
iterator方法的作用就是,所有实现Collection接口方法的容器子类,不管其具体的实现、使用的数据结构,其必须提供一个iterator方法用以进行统一的遍历数据方式。
(举个栗子,我不管你馒头店具体是怎么去做馒头,存储馒头的,反正你做馒头必须要实现卖馒头的方法,我去到按照金钱交易的方式一定能得到馒头)
所以:
- 所有实现了Collection接口的容器类都有一个iterator方法,用以返回一个实现了Iterator接口的对象。
- Iterator对象称为迭代器,用以方便的实现对容器内元素的遍历操作。
- Iterator对象的的remove方法是在迭代中删除元素的唯一的安全方法
- 也可以使用增强的for循环遍历容器数据,但是因为不方便操作,除了简单的遍历读取外,不建议使用。 示例:
- import java.util.*;
- public class IteratorTest {
- public static void main(String[] args) {
- Collection c = new HashSet<>();
- c.add(new Name("f1", "l1"));
- c.add(new Name("f2", "l2"));
- c.add(new Name("f3", "l3"));
- Iterator i = c.iterator();
- while (i.hasNext()) {
- //next()的返回值为Object,需要转换为相应类型
- Name = n = (Name) i.next();
- System.out.println(n.getName());
- // 因为set没有顺序,所以返回[f2,f1,f3,l1,l2,l3]
- }
- }
- }
(3)六个接口:Set接口
- Set接口是Collection的子接口,Set接口没有提供额外的方法,但是实现Set接口的容器类中的元素是没有顺序的,且不可重复。
- Set容器可以与数学中“集合”的概率相对应。
- Java API中所提供的Set容器类有HashSet、TreeSet等。
示例:- import java.util.*;
- /**
- * 求交集 去重
- */
- public class SetTest {
- public static void main(String[] args) {
- Set s1 = new HashSet<>();
- Set s2 = new HashSet<>();
- s1.add("a");s1.add("b");s1.add("c");
- s2.add("d");s2.add("a");s2.add("b");
- //Set和List容器类都具有Constructor(Constructor c)
- //构造方法用以初始化容器类
- Set sn = new HashSet<>(s1);
- sn.retainAll(s2);
- Set su = new HashSet<>(s1);
- su.addAll(s2);
- System.out.println(sn);// [a,b]
- System.out.println(su);// [d,a,c,b]
- }
- }
(4)六个接口:List接口
- List接口是Collection的子接口,实现List接口的容器类中的元素是有序的,且可重复的。
- List容器中的元素都对应一个整数型的序号记载其在容器的位置,可以根据序号存取容器中的元素。
- Java API所提供的List容器类有ArrayList、LinkeList等。
一个类:Collections类
- 该类位于java.util.Collections,提供了一些静态方法实现了基于List容器的一些常用算法。
- sort (对List容器内的元素进行排序)
- shuffle (对List容器内的对象进行随机排序)
- reverse (对List容器内的对象进行逆序排序)
- fill (用一个特定的对象重写整个List容器)
- copy (将src List容器内容拷贝到dest List容器)
- binarySearch (对于顺序的List容器,采用二分法查找的方式查找特定对象)
其余的方法可以具体去看API文档,再给个示例:- import java.util.*;
- /**
- * 举例部分Collections的算法排序,具体看API
- */
- public class Collections {
- public static void main(String[] args) {
- List l1 = new LinkedList<>();
- for (int i = 0; i <= 9; i++) {
- l1.add("a" + i);
- }
- /**
- * 目前l1的值排序为: [a0,a1,a2,a3,a4,a5,a6,a7,a8,a9]
- */
- Collections.reverse(l1);// 逆序排序
- System.out.println(l1);// [a9,a8,a7,a6,a5,a4,a3,a2,a1,a0]
- Collections.shuffle(l1);// 随机排序
- System.out.println(l1);// [a1,a3,a8,a9,a4,a6,a5,a2,a0,a7]
- Collections.sort(l1);// 正序排序
- System.out.println(l1);// [a0,a1,a2,a3,a4,a5,a6,a7,a8,a9]
- System.out.println(Collections.binarySearch(l1, "a5"));//
- }
- }
- import java.util.*;
(5)六个接口:Comparable接口
- 问题:Collections类的方法算法根据什么来确定容器中对象的“大小”顺序?
- 所有可以“排序”的类,都实现了java.lang.Comparable接口,Comparable接口只有一个方法,compareTo,该方法:
- 返回0表示this == obj
- 返回正数表示this > obj
- 返回负数表示this < obj
- 实现了Comparable接口的类通过重写compareTo方法从而确定该类对象的排序的具体方式。
(6)六个接口:Map接口
- 实现Map接口的类用来存储键值对。
- Map接口的实现类有HashMap和TreeMap等。Map类中存储的键值对通过键来标识,所以键值 不能重复。
泛型
- 起因:
- JDK1.4以前类型不明确
- 装入集合的类型都被当作Object对待,从而失去了自己的实际类型。
- 从集合中取出时往往需要转型,效率低,容易发生错误。
- JDK1.4以前类型不明确
- 解决办法:
- 在定义集合的时候同时定义集合中对象的类型。
- :
- 可以在定义Collection的时候指定。
- 也可以在循环时用Iteration指定。
- 好处:
- 增强程序的可读性和稳定性。
总结
- 一个图
- 一个类
- Collections
- 三个知识点
- For - 增强的for循环
- Generic - 泛型
- Auto-boxing/unboxing - 自动打包、解包
- 六个接口(如上)
JavaSE集合基础总览的更多相关文章
- C#集合基础与运用
C#集合基础与运用 C#集合基础与运用 1. 集合接口与集合类型............................................... 1 (1) 集合的命名空间..... ...
- Python 3 集合基础和概念!
Python 3 集合基础和概念! Python 3中,集合是无序的,所以不能进行切片和索引操作. 创建集合有两个方法:set()方法创建的集合是可变的,可被迭代的:frozenset()方法创建的集 ...
- JavaSE语法基础(3)---函数、数组
JavaSE语法基础(3)---函数.数组 函数的概念:实现特定功能的一段代码,可反复使用. 函数的出现减少代码冗余,提高代码的复用性,可读性,可维护性,可以使每个功能模块独立起来,方便分工合作. 函 ...
- List-LinkedList、set集合基础增强底层源码分析
List-LinkedList 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 继上一章继续讲解,上章内容: List-ArreyLlist集合基础增强底层源码分析:https:// ...
- List-ArrayList集合基础增强底层源码分析
List集合基础增强底层源码分析 作者:Stanley 罗昊 [转载请注明出处和署名,谢谢!] 集合分为三个系列,分别为:List.set.map List系列 特点:元素有序可重复 有序指的是元素的 ...
- Java Properties集合基础解析
Java Properties集合基础解析 本期学习的properties集合是项目中经常用到的操作 什么是Properties集合? java.util.Properties集合继承于Hashtab ...
- javase集合 温故而知新
复习javase集合 1.为什么要有集合? 数组长度需要在初始化时确定大小,数据结构单一.因此集合出现了 2.数组和集合的区别 区别一:数组既可以存储基本数据类型,又可以存储引用类型,集合只能存储引用 ...
- 【JAVA集合框架一 】java集合框架官方介绍 Collections Framework Overview 集合框架总览 翻译 javase8 集合官方文档中文版
原文链接: https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html 原文内容也一并附加在本文最 ...
- JavaSE集合(十)之Map
前面给大家介绍了集合家族中的Collection家族,这一篇给大家分享的是集合中的另一个家族就是Map家族.以前的时候学习Map的时候没有很认真的去学习,我觉得很多东西还是不是很清楚. 这次我将总结的 ...
随机推荐
- hdu1845(a^b的因子和%p)
题目链接:http://poj.org/problem?id=1845 思路: 1.整数唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. a=(p1^k1)*(p2^k2)*(p ...
- 区块链中的密码学(二)-RSA算法分析和实现
密码学领域中,加密算法主要分为对称加密和非对称加密,随着信息时代安全性要求越来越高,对称加密因为其易被破解的原因逐渐被舍弃.而RSA算法是目前密码学世界中比较流行的非对称加密算法,命名是根据其发明者R ...
- git 本地分支与远程分支相关操作记录
1.远程分支中有新增分支,但自己的本地分支没有对应同步 git checkout -b [remote-branch-name] origin/[remote-branch-name] 2. 查看本地 ...
- (16)break和continue
#(1)这里顺带说下pass # pass 过 的意思,防止代码报错,就是个占位的, if True: # 不允许代码块里面的内容为空,用pass占位 pass #(2)break (只能用在循环当中 ...
- Git 的简单测试
Git 简介 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开 ...
- C++的一种业务分发方案(另类的工厂模式)
在C++中,传统的业务分发.总要写一大串的switch-case,并且每次添加新业务时.都要在原有的switch-case里加一个分支,这就违反了设计模式中的开放封闭原则. 下面这样的方案,就全然去除 ...
- js 返回 差 集
//接受两个数组,返回差集 function getDiffSet(a,b){ a.sort(charSort); b.sort(charSort); if(a.length>=b.length ...
- ORM模型简介
ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 ...
- Sqlite和mysql的区别及优缺点
小型嵌入式,跟mysql差不多,但更小,功能也少,属于本地数据库多用于读多写少,100W以下的数据压力不大,不支持分布式. 真正开源的小型嵌入式数据库,支持事务.触发器器 性能至少优于mysql ...
- hive distcp数据同步
-- 同步HDFS数据(shell执行) hadoop distcp \ -Dmapred.job.queue.name=queue_name \ -update \ -skipcrccheck hd ...