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类和HashMap类的详细区别

HashTable类的一个子类Properties类主要用来存储字符串型键值的,
在实际开发中,经常使用Properties集合类来存储应用的配置项。

Properties类的详解

以上是鄙人学到的浅薄知识,大部分知识摘抄于书本上,若有瑕疵还请大佬指点, 谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HalleyCoder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值