再看Java集合
来源:互联网 发布:杭州锐智软件 编辑:程序博客网 时间:2024/06/06 19:05
1. 遍历集合
1.1. 使用Iterator接口提供的默认方法forEach(Consumer action),该方法的参数是一个参数式接口
参见: 使用Iterator接口提供的forEachRemaining(Consumer action)类似与上面讲的forEach()方法 (都是consumer)
1.1.1. 用集合对象本身调用
1.2. 使用Iterator接口提供的方法访问集合
1.2.1. booleanhasNext()
1.2.2. Object next()
1.2.3. void remove()
参见: Iterator迭代器使用的是快速失败机制,一旦在迭代过程中发现集合元素被改变(比如在其他线程中修改该集合)就会立即报错,而不是输出更改后的结果。
使用这些函数遍历集合的时候,集合不能有修改,否则报错。例如:books.remove(book)(用集合元素本身修改,而不是修改由next拿到的值);
当修改由next方法得到的值时并不会影响到集合本身,这是值传递的;(booleanhasNext(),Object next(), void remove())
参见: 使用forEach()循环,就是用冒号访问,和访问数组类似(也具有这个特点)
1.3. 使用Iterator接口提供的forEachRemaining(Consumer action)类似与上面讲的forEach()方法
参见: 使用Iterator接口提供的默认方法forEach(Consumer action),该方法的参数是一个参数式接口 (都是consumer)
1.3.1. 用iterator对象调用
1.4. 使用forEach()循环,就是用冒号访问,和访问数组类似
参见: 使用这些函数遍历集合的时候,集合不能有修改,否则报错。例如:books.remove(book)(用集合元素本身修改,而不是修改由next拿到的值);
当修改由next方法得到的值时并不会影响到集合本身,这是值传递的; (也具有这个特点)
1.5. 使用Predicate操作集合
1.6. 使用Stream操作集合
1.7. 需要注意的地方
1.7.1. Iterator
概念
Iterator接口是collection接口的父接口
1.7.2. Iterator迭代器使用的是快速失败机制,一旦在迭代过程中发现集合元素被改变(比如在其他线程中修改该集合)就会立即报错,而不是输出更改后的结果。
参见: void remove()
1.7.3. 通过集合对象的.iterator()方法获取iterator对象
2. Set集合
2.1. HashSet类
2.1.1. 判断集合中俩个元素相等的规则
俩个对象的HashCode()方法返回值不同
equals()方法返回false
同时满足(俩个对象的HashCode()方法返回值不同,equals()方法返回false)
2.1.2. HashSet集合中的对象是可以被修改的即使修改之后其hash值和equals方法发生变化只是这样做可能使程序变得非常混乱
2.2. LinkedHashSet
2.2.1. 是HashSet的子类
2.2.2. 使用链表来维护元素的次序,所以会以元素的添加顺序来访问集合里的元素
2.3. TreeSet类
2.3.1. 概念
StreeSet是SortedSet接口的实现类,可以确保集合中的元素处于排序状态
TreeSet判断两个对象是否相同的唯一方法就是调用compareTo方法,如果这个方法返回是0,即这两个对象是相同的,那么无法将相同的对象放到集合中
使用红黑树来实现存储结构
2.3.2. 相比HashSet额外添加的方法
Object first()返回集合中的第一个元素
Object last()返回集合中的最后一个元素
Object lower(Object e)返回集合中小于e的最大元素
Object higher(Object e)和上面相反
SortedSet subSet(ObjectfromElement ,Object toElement)返回中间的子集
SortedSet headSet(Objecte)返回小于e的子集
SortedSet tailSet(Object e)和上面相反
2.3.3. TreeSet支持的排序方式
自然排序
使用集合元素的compareTo(Object e)方法,也就是说添加到该集合中的元素必须实现Comparable接口。CompareTo(Object e)方法决定了元素排序的位置
系统会调用新插入元素的compareTo(Object e)方法和已经存在的元素进行比较,以此来决定排序顺序,也就是说第一个不实现Comparable接口也是可以被成功添加的,但是如果这样第二个元素添加进来的时候调用compareTo方法就会报错
如果修改了集合中的元素,并且使得集合中两个元素相同(compareTo),那么这两个元素都不能被成功删除
只要是被修改了就不能被删除
定制排序
在实现TreeSet时可以将一个Comparator函数式接口放到TreeSet的构造器中使用lambda表达式实现排序,即可实现定制排序
3. Set实现类的性能分析
3.1. HashSet的性能要比TreeSet高,因为TreeSet要使用红黑树来维护顺序。
4. LIST集合
4.1. Java8为List接口新添加的默认方法
4.1.1. voidreplace(UnaryOperator operator)根据operator制定的计算规则重新设计List中的元素
4.1.2. voidsort(Comparator c)根据Compartorc 参数对List集合元素排序
都是函数式接口,可以直接用lambda表达式(voidreplace(UnaryOperator operator)根据operator制定的计算规则重新设计List中的元素, voidsort(Comparator c)根据Compartor c 参数对List集合元素排序)
4.2. List集合判断集合中元素是否相同是通过equals方法来的,比如说删除一个元素时系统从头开始调用equals方法,删除返回值为true的第一个元素
4.3. ListIterator
4.3.1. ListIterator是Iterator接口的子接口,在Iterator的基础上添加了一些方法,例如可以使集合向前迭代,在迭代的时候添加一个元素
4.4. ArrayList
4.4.1. List的典型实现类,完美继承List的所有方法。性能高,内部是用数组实现的。线程不安全
4.5. Vector
4.5.1. Vector非常古老的类,不推荐使用。它的子类Stack实现了栈的功能,但是古老依旧,不推荐使用依旧
4.5.2. 子类Stack
4.6. 固定长度的List
4.6.1. Arrays类提供的asList方法可以把一个数组或指定个数的对象转换为一个List集合,这个list集合不是Arraylist的实现类也不是vector的实现类,而是Arrays的内部类,是一个固定长度的类,不可以增删。
5. Queue集合
5.1. Queue接口
5.1.1. Deuqe接口
ArrayDeque实现类
参见: ArrayDeque
LinkedList实现类
参见: LinkedList
5.1.2. PriorityQueue实现类
自然排序,每个要装入集合中的元素都要实现Comparable接口
定制排序,在创建PriorityQueue对象时在构造器中传入Compartor接口对象
类似TresSet集合(自然排序,每个要装入集合中的元素都要实现Comparable接口,定制排序,在创建PriorityQueue对象时在构造器中传入Compartor接口对象)
5.1.3. ArrayDeque
参见: ArrayDeque实现类
ArrayList和ArrayDequeue实现机制类似,底层都是采用了一个动态的、可重新分配的数组,这个数组默认容量是16,容量也可以在创建是指定。集合元素超出底层数组容量时系统会重新分配一个数组
5.1.4. LinkedList
参见: LinkedList实现类
既实现了List接口也实现了Deque接口
可以根据索引随机访问
可以当成双端队列,可以当成栈
6. MAP集合
6.1. Map集合需要注意的地方
6.1.1. Map集合有相应的方法来拿到key集合和value集合
6.1.2. 可以通过拿到key可以集合,然后遍历这个集合来遍历Map
6.1.3. 类似于HashSet HashMap判断key相同的方法也是hashCode+equals方法
6.1.4. HashMap判断value是否相同仅通过equasl方法就可以了
6.1.5. 类似于HashSet程序修改了已经装入集合的对象,并导致key发生了变化,那么程序将无法正常的访问到这些被修改了的对象
6.1.6. Java8为Map集合新增了forEach方法可以通过lambda表达式来方便的遍历Map集合
6.2. LinkHashMap
6.2.1. 使用双向链表来维护集合的插入顺序,也是因此,LinkedHashMap性能低于HashMap
6.3. Properties
6.3.1. Hash Map的子类
6.3.2. 实现了将Map集合和属性文件联系起来,可以读取可以写入
6.4. TreeMap
6.4.1. 类似于TreeSet,TreeMap也是实现了SortedMap接口
6.4.2. 类似于TreeSet,TreeMap就是一个红黑书数据结构
6.4.3. 定制排序
6.4.4. 自然排序
6.5. WeakHashMap
6.5.1. 用法和HashMap差不多,不同之处在于,WeakHashMap只保留key对象的强引用,比如说直接在放入集合时才new出来的对象,没有外界引用,这就是个弱引用,在下一波垃圾回收的时候就被回收了
6.6. IdentityHashMap
6.6.1. 用法类似HashMap,但是在比较key对象是否相等时,只看== ,无视包括hashCode和equals在内的其他所有方法
0 0
- 再看Java集合
- Java集合-08之 再看 List
- 再看Java泛型
- 再看Java泛型
- 再看Java平台无关性
- java巩固再看回调函数
- 再看Java--imooc三季Java视频笔记
- 技术无好坏,关键在人,再看Java和.Net
- Java 枚举:覆写 toString,再看 equals、hashCode
- “不忘初衷”,7张图帮你再看Java基础
- Java枚举:覆写toString,再看equals、hashCode
- 朝花夕拾——再看java类变量的初始化内幕
- (10)Java多线程之再看生产者/消费者模式
- 递归—北大POJ 1664 放苹果(集合划分系列,还需再看)
- 迭代Iterator结合ArrayList集合的使用及基本使用,再看迭代Iterator原理
- Java集合:集合框架
- java集合---set集合
- JAVA 集合 的 集合
- uva12169(同余模运算+暴搜)
- Hungarian Algorithm Summary
- 面向对象_长方形案例练习
- 前端生涯即将开始
- 去掉UIButton状态改变时的动画
- 再看Java集合
- 指南 第三章 例题5 UVALive 3644 X-Plosives(并查集)
- 华为面试 手写代码 判断int类型的数是否是回文
- VS2010/MFC编程入门之二十(常用控件:静态文本框)
- 对ViewPagerIndicator的认识
- Redis 如何处理客户端连接
- Android大图片裁剪终极解决方案(上:原理分析)
- Docker入门篇(简介、特性、安装)
- Javascript-正则简单验证身份证号