集合类
0.数组与集合
数组
- 元素类型必须相同,包括基本数据类型和对象引用。
- 数组长度固定。
- 数组地址连续
- 可使用下标访问
- 易抛出null指针异常和索引越界异常
集合
- 只能存储对象
- 容器
- 长度可变
- 元素类型可以不同
- 元素个数size
- 位于 java.util.*;
- 判断集合有效性:先判断集合是否存在,在判断集合不为空。顺序相反时,会发生逻辑短路。
== 和 equals
- ==
- 判断对象是否是一个。地址是否相同
- equals
- 判断对象内容是否相同,默认调用Object的equals()方法,而该方法判断地址是否相同
1.List
特点
- 可重复
- 只与equals()方法有关
- 有序
ArrayList 线程不安全
——–class java.util.ArrayList
1. 内部封装数组,扩容机制是数组复制
2. 内存连续
2. 查快,删、增慢
Vector
- 线程安全版ArrayList
- 不推荐使用
LinkedList 线程不安全
- 链表结构的集合
- 双指针节点,双向链表,无环
- 增删快,查慢
2.Set
- 不可重复,可用于去重
- 依赖于equals()方法
- 一般需要重写该方法实现对象内容的判断。
- 依赖于equals()方法
- Set是特殊的Map,其value是一个占位的垃圾对象。
- 只可通过迭代器迭代访问元素
HashSet 线程不安全
- 内部实现调用HashMap
- 与HashMap完全相同
- 存取速度快
TreeSet 线程不安全
- 线程不安全,可以对Set进行排序
- 通过compareTo或compare方法来保证元素的唯一性,元素以二叉树形式存放。
- 排序实现方式(两种法则):
Comparable
接口,实现compareTo()
方法。
- 数据类实现Comparable接口,实现compareTo()方法
Comparator
,对比器。
- 定义数据特有的Comparator对比器类,实现Comparator对比器,实现compare()方法。定义集合时,把对比器对象作为参数传递。
3.Map
–interface java.util.Map
1. 映射 key-value
2. Entry集合。一个Entry对应一个key-value对
3. key不重复,无序,同set
4. Map.size是Entry个数
5. Map接口是单独接口,没有继承任何接口,与之前版本不同,但引用了collection接口
6. put()
1. 将key和value关联,如果key存在,则value被覆盖
6. Map集合没有直接取出元素方法,先转成set集合,再通过迭代获取
7. get(key)
8. entrySet
9. keySet;
HashMap 线程不安全
–class java.util.AbstractMap
—class java.util.HashMap
* 数组+链表
* 存取速度块
1. hash()实现原理,为什么:
1. 获取key的hashcode,然后^
右移16位后值得到一个Newhash,移位目的与更多特征值相关,异或为了使对象更加分散(与运算积聚在低位,或运算积聚在高位)
2. Newhash与数组长度减一与运算得到在数组下标范围内的值。桶的概念
2. clear 清空桶
2. 元素重复判断标准 : p.hash == hash && ((k = p.key ) == key || (key != null && key.equals(k)))
1. new hash不同,对象不同
2. new hash相同,对象是同一对象,则对象相同。
3. new hash相同,对象不是同一对象,在判断equals方法,则对象相同性判定和equals一致。
* hash不相等 > hash相等
3. 数据类型:Node
TreeMap
- 对key进行排序,排序原理与TreeSet相同
- key - value
HashTable 线程安全
4.collections
- 集合工具类
- binarySearch
- copy
- synchronizedList
List<String> names = Collections.synchroizedList(new ArrayList<String>());
- max
- sort
- 指定对比器对象
arraycopy
- 数组拷贝,类型不限制
- 基本类型拷贝内容数据副本
- 对象拷贝内容是对象地址(引用),对象具有一致性
5.Arrays 数组工具类
- asList()将参数转换成Array$ArrayList集合对象
- sort 数组排序
- binarySearch 二分查找
6.foreach()
- 增强for()循环
- 数组可以、集合可以、Iterable
变长参数
java
public void adTel (String... str){
for( String s : str){
tels.add(s);
for( int i=0; i<str.length; i++){
tels.add(str[i]);
}
* 三点表示变长参数,使用增强for循环遍历变长参数的值,相当于数组
* 没有空值异常,即参数可零个或多个
* 变长参数必须位于方法最后一个参数,一个方法不能有多个变长参数