文章目录
Java类集
1.Java类集产生及Collection接口
——JDK1.2——java.util.
1.1Java类集
类集实际上就是一组动态数组(解决数组的定长问题)
1.2Collection接口
(单个对象保存的最顶层父接口)
Collection接口以及其子接口,在每次进行数据操作时只能对单个对象进行处理。
publilc interface Collection<E> extends Iterable<E>
Iterable<E>:
迭代器接口,就是为了遍历集合
Collection接口中提供的核心方法:
iterator():
取得类集的迭代器,JDK1.5之前直接写在Collection接口中。
add(T t):
向类集中添加数据
Collection接口只定义了存储数据的标准,但无法区分存储类型,因此在实际中我们往往使用两个子接口List(允许数据重复)和Set(不允许数据重复),一般不直接使用Collection接口。
2.List接口
再进行单个集合处理时,优先考虑List接口,在List接口中,拓展了两个重要方法(List接口独有):
public E get(int index)//根据索引下标取得数据
public E set(int index,E element)//根据索引更新数据,返回修改前数据
List接口有三个重要子类:ArrayList、Vector、LinkedList(使用时无区别),List接口要想保存自定义类的对象,该类必须覆写equals()来使用contains()和remove()等方法。
重要:ArrayList、Vector、LinkedList的区别??
ArrayList和Vector的区别
1.出现版本
ArrayList:JDK1.2
Vector:JDK1.0
2.初始化策略
ArrayList采用懒加载策略,在构造方法阶段并不初始化对象数组,在第一次添加元素时才初始化对象数组大小为10.
Vector在无参构造执行后将对象数组初始化为10.
3.扩容策略
ArrayList扩容时,新数组大小变为原数组的1.5倍
Vector扩容时,新数组大小变为原数组的2倍
4.线程安全性
ArrayList采用异步处理,线程不安全,效率较高
Vector采用在方法上加锁,线程安全,效率较低
5.遍历
Vector支持较老的迭代器Enumeration,而ArrayList不支持。
–
ArrayList、LinkedList区别:
LinkedList底层采用双向链表实现,ArrayList底层采用数组实现。
3.Set接口
(不允许数据重复,没有扩充方法)
Set接口常用子类:HashSet、TreeSet
HashSet
1.底层使用哈希表+红黑树
2.允许存放null,无序存储
TreeSet
1.底层使用红黑树
2.不允许出现空值,有序存储
3.自定义类要想保存到TreeSet中,要么实现Comparable接口,要么向TreeSet传入比较器Compartor接口。
在Java中,若想实现自定义类的比较,提供了以下两个接口:
(1)java.lang.Comparable
1.若一个类实现了Comparable接口,就意味着该类支持排序。存放该类的Collection或数组。可以直接通过Collection.sort()或Arrays.sort()排序。
2.实现了Comparable接口的类可以直接存放在TreeSet或TreeMap中。
核心方法:public int compareTo(T o)
返回值的三种情况:
返回正数:当前对象大于目标对象
返回0:当前对象等于目标对象
返回负数:当前对象小于目标对象
(2)Comparator(外部排序接口)
若要控制某个自定义类的顺序,而该类本身不支持排序(类本身没有实现Comparable接口),我们可以建立一个该类的“比较器”来进行排序,比较器实现Comparator接口即可。
核心方法:public int compare(T o1,T o2)
(3)二者关系
Comparable 是排序接口,若一个类实现了Comparable接口,意味着该类支持排序,是一个内部比较器(自己去和别人比);
Comparator接口是比较器接口,类本身不支持排序,专门有若干个第三方的比较器(实现了Comparator接口的类)来进行类的排序,是一个外部比较器(策略模式)
重复元素判断
TreeSet与TreeMap依靠Comparator或Comparable接口来区分重复元素。自定义类要想保存在TreeSet或TreeMap中:
(1)要么该类实现Comparable接口,覆写compareTo();
(2)要么实现一个比较器传入TreeSet或TreeMap来进行外部比较。
而HashSet与HashMap并不依赖比较接口,此时要想区分自定义元素是否重复,要同时覆写equals和hashCode方法。
先调用hashCode()计算出对象哈希码决定存放的数据桶,而后使用equals()来比较元素是否相等,若相等,则不再放置元素;若equals()返回false,则在相同桶之后使用链表将若干元素连起来。(Object提供的hashCode()默认使用对象的地址进行哈希)。
若两个对象equals()返回true,那么他们的哈希码必然相等,但是两个对象的hashCode相等,equals不一定true,当且仅当equals()与hashCode()均返回true,才认为两个对象真正相等。
4.集合输出(迭代器输出)
4.1迭代输出—terator接口
两个核心方法:
boolean hasNext():判断是否还有元素
E next():取得下一个元素
只能从前向后输出,调用Collection集合子类的iterator()取得内置迭代器,使用以下输出格式:
while(iterator.hasNext()){
System.out.println(iterator.next());
}
4.2双向迭代接口—ListIterator
List接口提供,Set不支持,除了hasNext()和next()以外,还有两个方法:
boolean hasPrevious():判断是否有上一个元素
E previous():取得上一个元素
要想使用从后向前遍历集合,至少要先从前向后遍历一次才可使用。
4.3Enumeration枚举输出
Vector类支持,两个核心方法:
boolean hanMoreElements():判断是否有下一个元素
E nextElements():取得下一个元素
4.4for-each输出
所有子类都满足,能使用foreach输出的本质在于各个集合类都内置了迭代器。
fail-fast机制
ConcurrentModificationException发生在Collection集合使用迭代器遍历时,使用了集合类提供的修改集合内容方法报错。而如果使用Iterator迭代器的remove()不会出现此错误。
final void checkForComodification(){ if(modCount != exceptesModCount) throw new ConcurrentModificationException(); }
Collection集合中的modCount表示当前集合修改的次数;
expectedModCount是迭代器中记录当前集合的修改次数,当取得集合迭代器时,expectedModCount = modCount,换言之,迭代器就是当前集合的一个副本,fail-fast策略保证了所有用户在进行迭代遍历时,拿到的数据一定是最新的数据。
fail-safe
不会产生ConcurrentModificationEception异常,
juc包下的所有线程安全集合(CopyOnWriteArrayList)
5.Map集合
Map接口是java中保存二元偶对象(键值对)的最顶层接口。
public interface Map <K,V>
5.1核心方法
public V put(K key,V value)//向Map中添加数据
public V get(K key)//根据指定的key值取得相应的value值,若没有key值,返回null
public Set< k> keySet()//返回所有key值集合,key不能重复
public Set<Map.Entry<K,V>> entrySet()//将map集合变为set集合
public Collection<V> values()//返回所有value值,value可以重复
Map接口有以下四个子类:HashMap,TreeMap,HashTable,ConcurrentHashMmap
HashaMap类比HashTable!
1.HashMap允许key和value值为null,且key值有且只有一个为null,value值可以有任意多个为null;HashTable:key与value都不能为null,否则出现NullPointerException。
2.HashaMap:JDK1.2;HashTable:JDK1.0
3.HashMap异步处理,效率高,线程不安全;HashTable使用方法上加锁,效率低,线程安全。
4.HashMap底层使用哈希表+红黑树;HashTable底层使用哈希表。
6.poperties属性文件操作
<K,V>格式,且无论key,value都是String类型。
setProperty(String key,String value):Object//设置属性
getProperty(String key):String//若没有指定key,返回null
getProperty(String key,String defaultvalue)//若未指定key,返回默认值
// 将资源文件输入输出到目标终端:
store(OutputStream out,String comment)//输出到目标终端
load(InputSyream in)//从目标终端中读取数据
7.Collections工具类
7.1将线程不安全集合包装为线程安全集合
在add、remove等修改方法中使用同步代码块保证线程安全,效率较低。要使用线程安全集合,推荐使用juc包下的并发集合类(ConcurrentHashMap、CopyOnWriteArrayList)
7.2集合排序
Collection.sort(集合名称)
7.3集合反转
Collection.reverse(集合名称)
8.Stream数据流
核心方法:Stream<E> stream()//取得Stream流
常用方法:
//1.forEach集合输出
list.forEach(System.out::println);
//2.filter数据过滤
stream.filter(e->e%2==0).count();
//3.取得最大、最小值:max、min
stream.max(Interger::compareTo).get();