java基础之集合框架

本文详细介绍了Java集合框架的体系结构,包括Collection与Map接口,List与Set接口的区别,重点讲解了ArrayList、LinkedList、HashSet和LinkedHashSet的特点及用法,并对比了HashMap、Hashtable、TreeMap与ConcurrentHashMap的不同之处。
摘要由CSDN通过智能技术生成

集合框架

1.集合框架的体系结构
答: 集合框架–jdk提供的对集中合并数据进行统一管理/处理的开发类库。
交由集合统一管理/处理的数据有两种表现形式:单例数据与键值对数据。
在这里插入图片描述
2. Conllection与Map
答: 在这里插入图片描述
在这里插入图片描述
3. List与Set
答:list接口处理有顺序的单列数据。
List接口可以有重复的数据元素,按照顺序区分。
List接口下有ArrayList类和LinkedList类。
Set接口处理没有顺序的单列数据。
Set接口不能有重复的数据元素(重复的数据元素被视为同一个)。
Set接口下有HashSet类和LinkedHashSet类。

4.ArrayList与LinkedList
答:ArrayList处理有顺序的单列数据、保存数据的存储空间会自动扩展(注意与数组区别)、可以保存任意数据类型数据(注意与数组区别)、数据存储结构是动态数组结构(优:查询快,缺:添加和删除慢)。
ArrayList() 构造一个初始容量为10的空列表。
ArrayList(Collection c) 将实现Collection接口的集合类转换成ArrayList
ArrayList(int initialCapacity) 构造具有指定初始容量的空列表。

package com.click369.jihe;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class TestList {
	public static void main(String[] args) {
		// ArrayList() 构造一个初始容量为10的空列表。
		ArrayList al1 = new ArrayList();
		// ArrayList(Collection c) 将实现Collection接口的集合类转换成ArrayList
		ArrayList al2 = new ArrayList(al1);
		// ArrayList(int initialCapacity) 构造具有指定初始容量的空列表。
		ArrayList al3 = new ArrayList(30);

		List lt1 = new ArrayList();
		List lt2 = new ArrayList(lt1);
		List lt3 = new ArrayList(40);

		Collection cl1 = new ArrayList();
		Collection cl2 = new ArrayList(cl1);
		Collection cl3 = new ArrayList(50);
	}
}

实例方法
add(E e) 将指定的元素追加到此列表的末尾。
clear() 从列表中删除所有元素。
contains(Object o) 如果此列表包含指定的元素,则返回 true 。
get(int index) 返回此列表中指定位置的元素。
indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1
lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
isEmpty() 如果此列表不包含元素,则返回 true 。
remove(int index) 删除该列表中指定位置的元素。
remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。
set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
size() 返回此列表中的元素数。
toArray()以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
例如:

package com.click369.test;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class TestMain {
	public static void main(String[] args) {
		//ArrayList中的实例方法
		ArrayList list1=new ArrayList();
		//1.add(E e) 将指定的元素追加到此列表的末尾。
		list1.add("hello");
		list1.add(true);
		list1.add(12.5);
		list1.add("hello");
		//2.size() 返回此列表中的元素数。
		System.out.println("list1的元素数="+list1.size());
		//3.clear() 从列表中删除所有元素。[清空]
		//list1.clear();
		//System.out.println("list1的元素数="+list1.size());
		//4.contains(Object o) 如果此列表包含指定的元素,则返回 true 。
		System.out.println("判断hello元素是否在list1这个集合中=="+list1.contains("hello1"));
		//5.get(int index) 返回此列表中指定位置的元素。
		//System.out.println("get(5)=="+list1.get(5));
		//6.indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1
		System.out.println("hello元素在list1中第一次出现的位置=="+list1.indexOf("hello"));
		//7.lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
		System.out.println("hello元素在list1中最后一次出现的位置=="+list1.lastIndexOf("hello"));
		//8.isEmpty() 如果此列表不包含元素,则返回 true 。
		//list1.clear();
		//System.out.println("list1集合是否为空="+list1.isEmpty());
		//9.remove(int index) 删除该列表中指定位置的元素。 
		//list1.remove(2);
		//System.out.println("list1的元素数="+list1.size());
		//10.remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。 
		//list1.remove("hello");
		//System.out.println("list1的元素数="+list1.size());
		//System.out.println("get(0)=="+list1.get(0));
		//11.set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
		list1.set(0,"world");
		System.out.println("get(0)=="+list1.get(0));
		//12.toArray()以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的[Object]数组
		Object[] objs=list1.toArray();
	}
}

Iterator iterator() 以正确的顺序返回该列表中的元素的迭代器接口。【遍历ArrayList中的数据元素】
ArrayList集合的遍历
例如:

package com.click369.test;
import java.util.ArrayList;
import java.util.Iterator;
public class TestMain {
	public static void main(String[] args) {
		//ArrayList集合的遍历
		ArrayList  list=new ArrayList();
		list.add("hello");
		list.add(1001);
		list.add("world");
		list.add(true);
		list.add(12.5);
		//1.通过普通的for循环遍历ArrayList集合
		for(int i=0;i<list.size();i++){
			System.out.println("list---"+list.get(i));
		}
		//2、使用增强的for循环
		for(Object obj:list){
			System.out.println("obj---"+obj);
		}
		//3.使用Iterator  iterator()迭代器
		Iterator it=list.iterator();
		while(it.hasNext()){
			Object obj=it.next();
			System.out.println("Iterator---"+obj);
		}
	}
}

LinkedList类
1.处理有顺序的单列数据
2.保存数据的存储空间,会自动扩展(注意与数组的区别)
3.可以保存任意数据类型的数据(注意与数组的区别)
4.数据存储结构是链表(火车)结构(优势:添加/删除速度快 缺点:查询速度慢)
构造方法:
LinkedList() 构造一个空列表。
LinkedList(Collection c) 将实现Collection接口的集合类转换成LinkedList
例如:

package com.click369.test1;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
public class TestMain {
	public static void main(String[] args) {
		//测试LinkedList的构造方法--创建对象
		//LinkedList() 构造一个空列表。
		LinkedList  list1=new LinkedList();
		//LinkedList(Collection c) 将实现Collection接口的集合类转换成LinkedList
		ArrayList  alist=new ArrayList();
		LinkedList  list2=new LinkedList(alist);
		//可以利用List接口
		List  list11=new LinkedList();
		List  list22=new LinkedList(list11);
		//可以利用Collection接口
		Collection  list111=new LinkedList();
		Collection  list222=new LinkedList(list111);
	}
}

实例方法与ArrayList一样:
add(E e) 将指定的元素追加到此列表的末尾。
clear() 从列表中删除所有元素。
contains(Object o) 如果此列表包含指定的元素,则返回 true 。
get(int index) 返回此列表中指定位置的元素。
indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1
lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
isEmpty() 如果此列表不包含元素,则返回 true 。
remove(int index) 删除该列表中指定位置的元素。
remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。
set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
size() 返回此列表中的元素数。
toArray()以正确的顺序从第一个到最后一个元素,返回一个包含此列表中所有元素的数组。

LinkedList类提供了一组针对第一个元素和最后一个元素的操作方法:
addFirst(E e) 在该列表开头插入指定的元素。
addLast(E e) 将指定的元素追加到此列表的末尾
getFirst() 返回此列表中的第一个元素。
getLast() 返回此列表中的最后一个元素。
removeFirst() 从此列表中删除并返回第一个元素。
removeLast() 从此列表中删除并返回最后一个元素。
因为LinkedList类的数据存储结构是链表(火车)结构。
例如:

package com.click369.test2;
import java.util.LinkedList;
public class TestMain {
	public static void main(String[] args) {
		//LinkedList中的实例方法
		LinkedList list1=new LinkedList();
		//1.add(E e) 将指定的元素追加到此列表的末尾。
		list1.add("hello");
		list1.add(true);
		list1.add(12.5);
		list1.add("hello");
		//2.size() 返回此列表中的元素数。
		//System.out.println("list1的元素数="+list1.size());
		//3.clear() 从列表中删除所有元素。[清空]
		//list1.clear();
		//System.out.println("list1的元素数="+list1.size());
		//4.contains(Object o) 如果此列表包含指定的元素,则返回 true 。
		//System.out.println("判断hello元素是否在list1这个集合中=="+list1.contains("hello"));
		//5.get(int index) 返回此列表中指定位置的元素。
		//System.out.println("get(2)=="+list1.get(2));
		//6.indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1
		//System.out.println("hello元素在list1中第一次出现的位置=="+list1.indexOf("hello"));
		//7.lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
		//System.out.println("hello元素在list1中最后一次出现的位置=="+list1.lastIndexOf("hello"));
		//8.isEmpty() 如果此列表不包含元素,则返回 true 。
		//list1.clear();
		//System.out.println("list1集合是否为空="+list1.isEmpty());
		//9.remove(int index) 删除该列表中指定位置的元素。 
		//list1.remove(2);
		//System.out.println("list1的元素数="+list1.size());
		//10.remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。 
		//list1.remove("hello");
		//System.out.println("list1的元素数="+list1.size());
		//System.out.println("get(0)=="+list1.get(0));
		//11.set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
		//list1.set(0,"world");
		//System.out.println("get(0)=="+list1.get(0));
		//12.toArray()以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的[Object]数组
		//Object[] objs=list1.toArray();
		
		//LinkedList类提供了一组针对第一个元素和最后一个元素的操作方法:
		//addFirst(E e) 在该列表开头插入指定的元素。
		//addLast(E e) 将指定的元素追加到此列表的末尾
		//getFirst() 返回此列表中的第一个元素。 
		//getLast() 返回此列表中的最后一个元素。
		//removeFirst() 从此列表中删除并返回第一个元素。
		//removeLast() 从此列表中删除并返回最后一个元素。
		//因为LinkedList类的数据存储结构是链表【火车】结构
	}
}

LinkedList集合的遍历

package com.click369.test3;
import java.util.Iterator;
import java.util.LinkedList;
public class TestMain {
	public static void main(String[] args) {
		//LinkedList集合的遍历
		LinkedList  list=new LinkedList();
		list.add("hello");
		list.add(1001);
		list.add("world");
		list.add(true);
		list.add(12.5);
		//1.通过普通的for循环遍历ArrayList集合
		for(int i=0;i<list.size();i++){
			System.out.println("list---"+list.get(i));
		}
		//2、使用增强的for循环
		for(Object obj:list){
			System.out.println("obj---"+obj);
		}
		//3.使用Iterator  iterator()迭代器
		Iterator it=list.iterator();
		while(it.hasNext()){
			Object obj=it.next();
			System.out.println("Iterator---"+obj);
		}
	}
}

5.HashSet与LinkedHashSet
HashSet:
1.处理的是没有顺序的单列数据(重复的元素算一个)。
2.保存数据的存储空间,会自动扩展。
3.可以保存任意数据类型的数据。
构造方法:
HashSet() 构造一个新的空集合; 背景HashMap实例具有默认初始容量(16)和负载因子(0.75)。
HashSet(Collection c)将实现Collection 接口的集合类转换成HashSet
HashSet(int initialCapacity) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。
HashSet(int initialCapacity, float loadFactor) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的负载因子
例如:

package com.click369.test1;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
public class TestMain {
	public static void main(String[] args) {
		//测试HashSet的构造方法--创建对象
		//HashSet() 构造一个新的空集合; 背景HashMap实例具有默认初始容量(16)和负载因子(0.75)。
		HashSet set1=new HashSet();
		//HashSet(Collection c)将实现Collection 接口的集合类转换成HashSet
		ArrayList list=new ArrayList();
		HashSet	set2=new HashSet(list);	
		//HashSet(int initialCapacity) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。 
		HashSet set3=new HashSet(10);
		//HashSet(int initialCapacity, float loadFactor) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的负载因子
		HashSet set4=new HashSet(10,0.5f);
		//可以使用Set接口
		Set set11=new  HashSet();
		Set set22=new  HashSet(list);
		Set set33=new  HashSet(30);
		Set set44=new  HashSet(40,0.5f);
		//可以使用Collection接口
		Collection set111=new  HashSet();
		Collection set222=new  HashSet(list);
		Collection set333=new  HashSet(30);
		Collection set444=new  HashSet(40,0.5f);
	}
}

实例方法:
add(E e) 将指定的元素添加到此集合。
clear() 从此集合中删除所有元素。
contains(Object o) 如果此集合包含指定的元素,则返回 true 。
isEmpty() 如果此集合不包含元素,则返回 true 。
remove(Object o) 如果存在,则从该集合中删除指定的元素。
size() 返回此集合中的元素数。
toArray()以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的[Object]数组
例如:

package com.click369.test2;
import java.util.HashSet;
public class TestMain {
public static void main(String[] args) {
		//HashSet中的实例方法
		HashSet set1=new HashSet();
		//1.add(E e) 将指定的元素追加到此列表的末尾。
		set1.add("hello");
		set1.add(true);
		set1.add(12.5);
		set1.add("hello");
		//2.size() 返回此列表中的元素数。
		//System.out.println("set1的元素数="+set1.size());
		//3.clear() 从列表中删除所有元素。[清空]
		//set1.clear();
		//System.out.println("set1的元素数="+set1.size());
		//4.contains(Object o) 如果此列表包含指定的元素,则返回 true 。
		System.out.println("判断hello元素是否在set1这个集合中=="+set1.contains("hello"));
		//5.isEmpty() 如果此列表不包含元素,则返回 true 。
		//set1.clear();
		//System.out.println("set1集合是否为空="+set1.isEmpty());
		//6.remove(Object o) 从列表中删除指定元素的第一个出现(如果存在)。 
		set1.remove("hello");
		System.out.println("set1的元素数="+set1.size());
		//7.toArray()以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的[Object]数组
		Object[] objs=set1.toArray();
	}
}

HashSet集合的遍历

package com.click369.test3;
import java.util.HashSet;
import java.util.Iterator;
public class TestMain {
	public static void main(String[] args) {
		//HashSet集合的遍历
		HashSet  set=new HashSet();
		set.add("hello");
		set.add(1001);
		set.add("world");
		set.add(true);
		set.add(12.5);
		//1、使用增强的for循环
		for(Object obj:set){
			System.out.println("obj---"+obj);
		}
		//2.使用Iterator  iterator()迭代器
		Iterator it=set.iterator();
		while(it.hasNext()){
			Object obj=it.next();
			System.out.println("Iterator---"+obj);
		}
	}
}

LinkedHashSet类
定义结构:
public class LinkedHashSet
extends HashSet
implements Set,
LinkedHashSet是HashSet类的子类
只要会使用HashSet,那么就一定会使用LinkedHashSet。
构造方法:
LinkedHashSet() 构造一个新的空集合; 背景HashMap实例具有默认初始容量(16)和负载因子(0.75)。
LinkedHashSet(Collection c)将实现Collection 接口的集合类转换成LinkedHashSet
LinkedHashSet(int initialCapacity) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。
LinkedHashSet(int initialCapacity, float loadFactor) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的
实例方法:
add(E e) 将指定的元素添加到此集合。
clear() 从此集合中删除所有元素。
contains(Object o) 如果此集合包含指定的元素,则返回 true 。
isEmpty() 如果此集合不包含元素,则返回 true 。
remove(Object o) 如果存在,则从该集合中删除指定的元素。
size() 返回此集合中的元素数。
iterator() 返回此集合中元素的迭代器。

6.HashMap与Hashtable与TreeMap与ConcurrentHashMap
答:
HashMap是应用更加广泛的哈希表实现,行为上大致上与Hashtable一致,主要区别在于HashMap不是同步的,支持null键和值等。通常情况下,HashMap进行put或者get操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选,比如,实现一个用户ID和用户信息对应的运行时存储结构。

Hashtable是早期Java类库提供的一个哈希表实现,本身是同步的,不支持null键和值,由于同步导致的性能开销,所以已经很少被推荐使用。Hashtable使用Synchronized同步锁修饰了put、get、remove等方法,因此在高并发场景下,读写操作都会存在大量锁竞争,给系统带来性能开销。

TreeMap则是基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get、put、remove之类操作都是O(log(n))的时间复杂度,具体顺序可以由指定的Comparator来决定,或者根据键的自然顺序来判断。

ConcurrentHashMap在保证线程安全的基础上兼具了更好的并发性能。在JDK1.7中,ConcurrentHashMap就使用了分段锁Segment减小了锁粒度,最终优化了锁的并发操作。在JDK1.8中,ConcurrentHashMap做了大量的改动,摒弃了Segment的概念。由于Synchronized锁在Java6之后的性能已经得到了很大的提升,所以在JDK1.8中,Java重新启用了Synchronized同步锁,通过Synchronized实现HashEntry作为锁粒度。这种改动将数据结构变得更加简单了,操作也更加清晰流畅。与JDK1.7的put方法一样,JDK1.8在添加元素时,在没有哈希冲突的情况下,会使用CAS进行添加元素操作;如果有冲突,则通过Synchronized将链表锁定,再执行接下来的操作。

7.Conllection与Conllections
答: collection是一个接口,collections是一个操作集合的工具类
collection它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。

collections它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各种操作,服务于Java的Collection框架。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值