Java集合的相关知识
一.单列集合的跟接口 Colletion
Collection用于存储一系列符合某种规则的元素。其有两个子接口List和Set。
List接口的特点是元素有序,可重复,其主要实现类是ArrayList和LinkedList
Set接口的特点是元素无序,不可重复,其主要实现类是HashSet和TreeSet
Collection核心结构:
常用方法:
方法声名 | 功能描述 |
---|---|
boolean add(Object o) | 向添加中添加一个元素 |
boolean addAll(Collection c) | 将一个集合中的全部元素添加到该集合中 |
void clear(Collection c) | 删除集合中所有元素 |
boolean removeAll(Collection c) | 删除包含于集合c中的所有元素 |
boolean isEmpty() | 判断集合中是否有元素 |
boolean contains(Obejct o) | 判断集合中有没有该元素 |
boolean containsAll(Collection c) | 判断集合中有没有集合c中的所有元素 |
Iterator iterator() | 返回一个迭代类型的对象 |
int size() | 获取元素个数 |
Stream stream() | 将集合源转为有序的流对象 |
1.List接口
List是以一种线性方式进行存储,可以通过索引(数组下标)进行查询,
并且元素排列有序。
常用方法:
方法声名 | 功能描述 |
---|---|
void add(int index , Object o) | 在指定索引位置中插入一个元素 |
boolean addAll(int index, Collection c) | 在指定索引位置中插入一个集合 |
Obejct get(int index) | 返回指定索引位置的元素 |
Obejct remove(int index) | 删除指定索引位置的元素 |
Object set(int index , Object o) | 将指定索引位置的元素替换成 元素 o |
Obejct indexOf(Object o) | 元素 o 第一次出现的索引号 |
int lastIndexOf(Object o) | 元素 o 最后一次出现的索引号 |
List subList(int FirstIdex , int LastIdex) | 返回从索引FirstIdex(包括)到索引LastIndex(不包括)所组成的子集合 |
Object[] toArray() | 将集合转为数组 |
default void sort(Comparator<? super E> c) | 根据指定的比较器规则将元素进行排序 |
实例操作:
①ArrayList类
ArrayList是List的一个实现类,在ArrayList内部封装了一个变长数组对象,
当需要存储的素过多时,会自动分配一个更大的数组进行存储。
因为ArrayList本质上是数组所以,进行增加或删除元素时,效率低下,
不适合频繁改动元素,但是在进行查询操作时,效率高。
②LinkedList类
LinkedList也是List一个实现类,
其包含了两个Node类型first和last属性维护成的一个双向链表,
所以其特点是元素处理效率高,但是查询效率低下
LinkeList类除了继承List接口的方法以外还有自己定义的方法:
方法声明 | 功能描述 |
---|---|
void add(int index , E element) | 在此列表中指定位置插入数据 |
void addFirst(Object o) | 将指定元素添加到集合的开头 |
void addLast(Object o) | 将指定元素添加到集合的结尾 |
Object getFirst() | 返回集合的第一个元素 |
Obejct getLast() | 返回集合的最后一个元素 |
Object removeFirst( ) | 移除并返回集合的第一个元素 |
Object removeLast() | 移除并返回集合的最后一个元素 |
boolean offer(Object o) | 将指定元素添加到集合的结尾 |
boolean offerFirst(Object o) | 将指定元素添加到集合的开头 |
boolean offerLast(Object o) | 将指定元素添加到集合的结尾 |
Object peek() | 获取集合的第一个元素 |
Object peekFirst() | 获取集合的第一个元素 |
Object peekLast() | 获取集合的最后一个元素 |
Object poll() | 移除并返回集合的第一-个元素 |
Object pollFirst() | 移除并返回集合的第一个元素 |
Object pollLast() | 移除并返回集合的最后一个元素 |
void push(Object o) | 将指定元素添加到集合的开头 |
Object pop() | 移除并返回集合的第一.个元素 |
1.Set接口
Set接口和List接口一样继承Collection接口,基本方法和Collection接口没有差别
Set接口中的元素是无序的,并且都会以某种规则保证存入的元素不会出现重复。
其主要实现类是HashSet和TreeSet。HashSet是根据对象的哈希值来确定元素在集合中的存储的位置,因此存取和查询操作效率高。
TreeSet接口中的元素是以二叉树的方式存储元素,可以实现对元素排序操作。
①HashSet类
每一次将元素添加到HashSet中时,HashSet都会计算对象的哈希值判断元素在集合中存不存在,
若存在,则会继续调用对象中equals()方法依次对比集合中的元素,若返回为false则存入,否则就舍去。
流程图如下:
**如果要将自定义的类型对象存入HashSet中,就必须重写对象中的hashCode()方法和equals()方法,否则HashSe会默认两个对象为不同对象**
②TreeSet类
TreeSet采用平衡二叉树进行数据存储,其特点:同层的节点,左节点始终比右节点小,可以对元素进行排序,但是没有重复。
TreeSetl类除了继承Set接口方法外还有自己独有的方法:
方法声明 | 功能描述 |
---|---|
Object first() | 返回集合中第一个元素 |
Object last() | 返回集合中最后一个元素 |
Object lower(Object o) | 返回集合中小于给定的元素的最大元素,没有则返回null |
Object floor(Object o) | 返回集合中小于或等于给定元素的最大元素,没有则返回null(个人感觉没啥用) |
Object higher(Object o) | 返回集合中大于给定的元素的最大元素,没有则返回null |
Object ceiling(Object o) | 返回集合中大于或等于给定元素的最大元素,没有则返回null(个人感觉没啥用) |
Object pollFirst() | 删除并返回集合第一个元素 |
Object pollLast() | 删除并返回集合最后一个元素 |
3.Collection集合的遍历
①迭代器遍历
通过Collection的iterator()方法获取单个Oject类的对象进行遍历。
public class practice{
public static void main(String args[]){
//Collection集合都可使用iterator方法,这里以ArrayList类为例
ArrayList list = new ArrayList();
list.add("s1");
list.add("s2");
list.add("s3");
Iterator it = list.iterator();
while(it.hasNext()){
Object ob = it.next(); //取出集合中的元素,自动迭代
System.out.println(ob);
}
}
}
当进行遍历需要删除集合中的数据时,不能直接对集合进行删除操作,必须使用Iterator对象中的remove()方法进行处理,否则编译器会报错。
②foreach遍历
public class practice{
public static void main(String args[]){
//Collection集合都可使用iterator方法,这里以ArrayList类为例
ArrayList list = new ArrayList();
list.add("s1");
list.add("s2");
list.add("s3");
Iterator it = list.iterator();
//普通foreach遍历
for(Object ob:list){
System.out.println(ob);
}
//使用Lamnda表达式的forEach遍历
list.forEach(obj -> System.out.println(obj));
}
}
使用foreach时,无法对集合中的元素进行增加和删除
二.双列集合的跟接口 Map
Map接口是保存具有相互关系对象的元素的数据存储结构,
每个元素中都包含一个键Key和一个值Value,二者时一一对应,
键Key不可以重复,当添加已存在键值时,后面的键值映射会替换掉前面的键值映射
值可以value可以重复
Map常用方法:
方法声明 | 功能描述 |
---|---|
void put(Object key , Object value) | 向集合中添加一组键值 |
int size() | 返回集合包含元素的个数 |
Object get(Object key) | 返回给定键对应的值 |
boolean containsKey(Object key) | 判断集合是否包含键Key |
boolean containsValue(Object value) | 判断集合是否包含值value |
Object remove(Object key) | 删除集合中key键 |
void clear() | 删除Map集合中所有键值映射的元素 |
Set keySet() | 将Map集合中的key以Set集合存储 |
Collection values() | 以Collection集合保存Map集合中所有映射值 |
Set<Map.Entry<Key,Value>> entrySet() | 将Map集合转换为存储元素类型为Map的Set集合 |
void forEach(BiConsumer action) | 通过传入一个函数式接口对Mao集合进行遍历 |
Object putIfAbsent(Object key , Object value) | 添加元素,若集合中存在,则返回已存在的对象 |
boolean remove(Object key ,Object value) | 删除对应的键值映射的元素 |
boolean replace(Object key,Object value) | 修改给定键对应的值 |
①HashMap类
HashMap是Map的一个实现类,用于存储键值映射关系,
集合中的元素可以为空,无序且不重复。
其底层数据结构是“数组+链表”,所以进行增、删、改、查操作时都很高效
底层实现结构图:
->HashMap底层实现原理详解
②TreeMap类
TreeMap也是Map接口的一个实现类,内部通过二叉树保证键值不重复,
原理和TreeSet一样,所以集合中的元素是按照某一规则有序排列,
使用该集合时可以通过自定义的比较器进行排序
例如:
import java.util.*;
class CustomComputer implements Comparator{
//覆写compare()方法
public int compare(Object obj1,Object obj2){ //obj1为后添加的元素,obj2为先添加的元素
String key1 = (String) obj1;
String key2 = (String) obj2;
return key1.compareTo(key2);
}
}
public class Example{
public static void main(String args[]){
Map map = new TreeMap(new CustomComputer());
map.put("2","Rose");
map.put("1","Jack");
map.put("3","Lucy");
System.out.println(map);
//输出结果:{1=Jack,2=Rose,3=Lucy}
}
}
③Hashtable的子类——properties类
Hashtable类和HashMap类相似也有不同,Hashtable类是线程安全的,
但是效率比后者低,所以实际开发经常使用HashMap类。
HashTable类的一个子类Properties类主要用来存储字符串型键值的,
在实际开发中,经常使用Properties集合类来存储应用的配置项。
以上是鄙人学到的浅薄知识,大部分知识摘抄于书本上,若有瑕疵还请大佬指点, 谢谢!