1. 集合
一方面,面向对象语言对事务的体现都是以对象的形式,为了方便多个对象的操作,就要对对象进行存储。另一方面,使用Array存储对象具有一些弊端,而Java集合就像一种容器,可以动态的把多个对象的引用存入集合中
Java集合类可以用于存储数量不等的多个对象,还可用于保存具有映射关系的关联数组
1.1 Java集合的组织结构
Java集合的组织结构
集合工具类
Collections
Arrays
排序接口
Comparable
Comparator
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
常用方法
- 增
add
or 插入add(index,Object obj)
- 删
remove
元素/下标 - 改
set
- 查
get(index)
1.4 Set接口
Set
- 无序不可重复
HashSet
(主要实现类)LinkedHashSet
TreeSet
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
实现类:
HashMap
LinkedHashMap
TreeMap
HashTable
Properties
添加、删除操作:
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
将参数包装为一个List
sort
默认将数组升序排序
1.8 Comparator与Comparable排序接口
1.8.1 Comparator
案例: 先按id升序排序,如果id相等,按name升序排序
- 重写
compare
方法
1.8.2 Comparable
Comparable接口可以实现对象数组排序,也就可以对整型数组进行直接排序
- 重写
compareTo
方法