1. 集合
一方面,面向对象语言对事务的体现都是以对象的形式,为了方便多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象具有一些弊端,而Java集合就像一种容器,可以动态的把多个对象的引用存入集合中
Java集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组
1.1 Java集合的组织结构
Java集合的组织结构

集合工具类
CollectionsArrays
排序接口
ComparableComparator
1.2 Collection接口
主要API:
size()返回集合长度add(Object object)添加 返回booleanaddAll(Collection collection)把集合中的所有元素添加到另一个集合里isEmpty()返回boolea是否为空clear()清空集合contains(Object obj)集合是否包含某对象containsALL(Collection coll)是否包含集合中的所有元素retainAll(Collection coll)保留两个集合共同的元素,交集remove(Object obj)移除一个元素equals()hashcode()toArray()将集合转化为数组iterator()返回Iterator接口实现类的对象,遍历集合对象
1.3 List接口
List也是接口,继承自Collection接口,Collection的15个方法皆可用
- 元素有序可重复
ArrayList(动态数组):List的主要实现类- 基于数组实现,增删慢,查询快,线程不安全
LinkedList(链表):对于频繁的插入和删除建议选择- 基于双向链表实现,增删快,查询慢,线程不安全
Vector: 古老的实现类,线程安全- 基于数组实现,增删慢,查询快,线程安全
- 为了线程安全损失了性能,总体上性能不如ArrayList
List集合里添加了一些根据索引来操作集合元素的方法
void add(int index,Object ele)在指定的位置添加boolean addALL(int index,Collection eles)在指定位置加上好多元素,以集合的方式传入Object get(int index)根据下标获得一个元素int indexOf(Object obj)获得一个元素的下标
int lastIndexOf(Object obj)返回最后一个元素的下标Object remove(int index)删除指定位置的元素Object set(int index,Object ele)设定指定位置的元素变成一个新值List subList(int fromIndex,int toIndex)返回从fromIndex到 toIndex之间的子list !左闭右开
List常用方法
- 增
addor 插入add(index,Object obj) - 删
remove元素/下标 - 改
set - 查
get(index)
1.4 Set接口
Set
- 无序不可重复
HashSet(主要实现类)LinkedHashSetTreeSet
1.无序 != 随机 真正的无序性指的是元素在顶层存储的位置是无序的,位置根据哈希值来确定
2.不可重复性: 当向Set中提娜佳相同的元素时,后面的这个不能添加进去
Set中的元素是如何存储的呢?
使用了哈希算法,先算Hash值,不重复就直接存,重复了就和原值对比。
在Hash值不同的情况下,即使不对值进行对比,也可以默认两个值不同
而Hash值是在值本地计算的不需要牵扯其他值,因此效率高
1.调用
HashCode()计算哈希值,决定了对象在Set中的存储位置2.若Hash值对应内存已有值,则调用equals进行对比,如果相同则后一个对象不能再添加进来
3.如果值不相同
-> 正常情况下相同的值一定产生相同的HashCode,这是HashCode方法的事
1.4.1 HashSet——HashMap实现,无序
- 进去就new了个HashMap
- 自己的添加方法,调的是HashMap的put方法。为了得到那个Key
- 至于Value,用PRESENT表示,通过查看其定义,得知就是一个写死的常量
1.4.2 LinkedHashSet——继承HashSet、HashMap实现数据存储、双向链表记录顺序
1.4.1 TreeSet——二叉树实现
1.向TreeSet中添加的元素必须是同一个类,(自动初始化泛型)
2.可以按照添加进集合中的元素的指定的顺序遍历。 String,包装类默认按照从小到大
3.自定类没有实现
Comparable接口时,当向TreeSet中添加自定义对象时,报ClassCastException
自然排序:
要求自定义类实现
java.lang.Comparable接口并重写compareTo(Object obj)在此方法中指定按照自定义类的哪个属性进行排序向
TreeSet中添加元素时首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的age属性值相同,但TreeSet会认为两个对象都是相同的,进而后一个对象添加不进去TreeSet对于
TreeSet:compareTo()->hashCode()->equals()三者保持一致在
compareTo()中,先按一个属性排序,如果相同再按另一个属性排序定制排序:
1.创建一个实现了
Comparator接口的匿名类对象 2.将此对象作为形参传递给TreeSet的构造方法 3.向TreeSet中添加Comparator接口中compareTo方法涉及到的Object object
- 自然排序
- 定制排序
1.5 Map接口
Map接口与Collection并列存在,用于保存具有映射关系的数据 Key-ValueMap中的Key和Value都可以是任何引用类型的数据Map中的Key用Set来存放,不允许重复- 常用String类作为
Map的"键"- key和value之间存在单向一一映射,即通过指定的key总能找到唯一的,确定的value
Map->[ Set : Collection ]->Entry一条记录 当HashMap的值都为null,则HashMap退化为HashSet
实现类:
HashMapLinkedHashMapTreeMapHashTableProperties
添加、删除操作:
Object put(Object key, Object value)Object remove(Object key)按照指定Key删除Entry,返回值是valuevoid putAll(Map t)void clear()
遍历
Set keySet()返回key的集合Collection values()返回value的集合Set<Map.Entry<K, V>> entrySet()返回键值对的集合
元素查询的操作
Object get(Object key)boolean containsKey(Object key)boolean containsValue(Object value)int size()boolean isEmpty()boolean equals(Object obj)
1.5.1 Properties类
- jdbc.properties文件
- 使用
Properties加载properties文件
1.5.2 TreeMap类——基于二叉树
- 定制排序
- 按key排序
1.5.3 LinkedHashMap类
- 遍历结果与存放顺序一致
- 基于链表实现
1.5.4 HashMap类
- 遍历
- Key是Set类型不可重复;Value是Collection类型,可重复;Entry键值对,用Set存放,不可重复
添加元素时,调用Key的
equals方法; 键重复时,value会被新值覆盖
1.5.5 HashTable类
HashTable是遗留类,很多功能都与HashMap类似,不同的是它继承自Dictionary类,并且是线程安全的买同一时刻只能有一个线程写HashTable,并发性不如CuncurrentHashMap
1.6 Iterator
用来遍历集合
1.7 Collections与Arrays工具类
1.7.1 Collections工具类
Collections工具类 static方法 , 不需要创建对象
reverse(List):反转List中元素的顺序shuffle(List): 对List集合元素进行随机排序sort(List): 根据元素的自然顺序对指定List集合元素进行升序排序swap(List,i,j)及那个指定list集合中的i处元素和j处元素进行交换Object max(Collection)Object max(Collection, Comparator)定制排序规则下的最大int frequency(Collection, Object)指定元素在集合中出现的次数void copy(List destination, List source)将source中的内容复制到destination中boolean repalceAll(List list, Object oldValue, Object newValue)将旧值替换为新值reverseOrder()提供一个降序Comparator实现类
Collections类中提供了多个
synchronizedXxx()方法,该方法可使将指定集合包装成线程同步集合,从而可以解决多线程并发访问集合时的线程安全问题
1.7.2 Arrays工具类
Arrays工具类 static方法 , 不需要创建对象
常用API:
toString将数组转换为可输出的字符串asList将参数包装为一个Listsort默认将数组升序排序
1.8 Comparator与Comparable排序接口
1.8.1 Comparator
案例: 先按id升序排序,如果id相等,按name升序排序
- 重写
compare方法
1.8.2 Comparable
Comparable接口可以实现对象数组排序,也就可以对整型数组进行直接排序
- 重写
compareTo方法