Java Collection Framework – JCF
本遍文章, 是抄了一遍他人博客的内容.下面是原链接的跳转按钮.
点击此处跳转
容器就是可以容纳其他Java对象的事物(或者说对象), Java Collection Framework(JCF)为Java开发者提供了通用的容器.
Java集合主要划分为四个部分:
- Collection(List列表, Set集合)
- Map映射
- 迭代器(Iterator, Enumeration)
- 工具类(Arrays, Collections)
背景
数组的优势: 是一种简单的线性序列, 可以快速地访问数组元素, 效率高,如果从效率和类型检查的角度讲, 数组是最好的.
数组的劣势: 不灵活. 容量需要实现定义好, 不能随着需求的变化而扩容.
由于数组的这些烈士,我们需要一种更加强大, 更加灵活, 容量可以随时扩大的容器来保存对象.
基本类型
Java容器里只能存放对象, 对于基本类型(int, float, double等), 需要将其包装成对象类型(Integer, Float, Double)之后才能存放到容器中. 很多时候拆包装和解包装能够自动完成. 这虽然会导致额外的星河和空间开销, 但是简化了设计和编程.
泛型
所有容器的内部存放的都是Object对象, 泛型机制只是简化了编程, 由编译器自动帮我们完成了强制类型转化而已. JDK1.4以及之前的版本不支持泛型, 类型转换需要程序员显示完成.
ArrayList<String> list = new ArrayList<String>(); // 泛型, 参数化类型
泛型的通配符 " ? ":
上限限定: public void getFunc(List<? extends Animal> an)
, 那么表示这里的参数可以传入Animal, 或者Animal的子类.
下限限定: public void getFunc(List<? super Animal> an)
, 那么比哦啊是这里的参数可以传入Animal, 或者Animal的父类.
使用泛型的注意点:
- 泛型不支持基本数据类型(int, double, float等)
- 泛型不支持集成, 必须保持前后一致, (下面的例子是错误的):
List<Object> list = new ArrayList<String>()
内存
由于Java里对象都在堆上, 且对象只能通过引用访问, 容器里放的其实是对象的引用而不是对象本身.
Java集合框架图
List链表
是Collection的子接口, 里面的内容允许重复
List的特点: 线性, 即有序. 元素放入的顺序和元素的存储顺序保持一致
表象上: List最大的特点就是有下标.
ArrayList: 就是作为一个数组的封装出现的, 底层就是数组.
LinkedList: 底层封装的是一个双向链表.
- 查找, 修改用的多的时候用ArrayList.
- 增加, 删除用的最多的时候用LinkedList
- 线程安全, 数据量大的时候考虑用Vector
泛型<>: 用来控制集合智能操作某一种数据类型.
遍历:
- 普通的for循环遍历
- 使用迭代器Iterator完成遍历. --没有下标从头到尾走一遍, 不能操作数组.
- for-each循环语句, 底层封装的就是迭代器, 语法简单, 还可以操作数组, 推荐使用.
Set集
是Collection的子接口, 里面的内容不允许重复.
特点: 不能放置重复元素, 无序存放元素.
表像上: Set没有下标.
HashSet判断两个元素不重复:
- 调用equals方法比较两个对象
- .两个元素的hashcode值保持一致
只有这两个条件同时满足时, Java才认为是同一对象.
所有重写了equals方法一般都要重写hashcode方法,让equals返回true 的时候, hashcode返回的值应该是一样的.
hashset只有增, 删, 求长度和遍历等操作.
遍历:
- 迭代器
- for-each
Map映射
是存放一对值的最大接口, 所有的元素都以键和值的方式存储.
特点: 键值对–键要求唯一, 值可以重复
键在遍历的时候用Set类型来接.
值在遍历的时候用Collection来接.
hashMap与hashTable比较:
- hashMap非线程安全, hashTable是线程安全的.
- hashMap允许null来做键/值, hashTable不允许.
Properties
常用操作: 增, 删. 改, 查, 容, 存, 取.
存的时候: 调用的是.store方法存文件
取的时候, 调用.load方法取文件.
文件类型: .properties–固定格式的文本文件, 将是工作中使用率第二的配置文件.
Map.Entry
Map.Entry的内部接口, 每个Map.Entry对象都保存着一个key-value的内容,每个map接口中都保存有多个Map.Entry接口实例.
Iterator
集合的输出接口, 从前到后输出指定集合中的内容. 不能遍历Map, 只用来遍历Collection.
ListIterator是Iterator的子接口, 可以进行双向输出. 专门用来遍历List.
Enumeration是最早的输出接口, 用于输出指定集合中的内容.
Collections
集合操作的算法类.
包括排序, 求最大, 最小, 翻转, 随机混排等操作.
排序的时候, 因为是对对象排序, 所以应该按一定的业务逻辑的自然顺序排序.
比较器
comparable接口: 内部比较器
可以对任意数组排序, java泛型技术, 二叉树排序原理.
- 类实现Comparable接口
- 重写compareTo方法
compareTo方法返回的是int类型数据: 1表示大于, -1表示小于, 0表示相等.
comparator接口: 外部比较器.
补救的做法. 此接口一样需要重写方法, 但方法接收哦豁两个对象, 返回值依然是1, -1, 0
SortedSet: 单值的排序接口, 实现此接口的集合类, 里面的内容可以使用比较器排序.
SortedMap: 存放一对值的排序接口, 里面内容按照key排序, 使用比较器排序.
Queue
队列接口, 此接口的子类可以实现队列操作.