Java中的集合框架(JCF)

Posted SSimeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的集合框架(JCF)相关的知识,希望对你有一定的参考价值。

一、容器框图

在这里插入图片描述

二、集合的的基本概念

Java中集合类被定义在Java.util包中,可以存储数据和对象,因此也被称为“容器”。
常见的有四种集合:List、Queue、Set、Map。

三、集合

1、List集合(有序、可重复)

(1) ArrayList类

(1)ArrayList是使用最广泛的List实现类,内部数据结构是基于数组实现的,提供了对List的增加(add)、删除(remove)和访问(get)操作。
(2)由于ArrayList是基于数组实现的,因此元素必须连续存储,当需要在中间位置插入或删除远古三时,需要将待插入的位置后面的元素全部移动。
(3)因此ArrayList不适合随机插入和删除的操作更适合随机查找和遍历。

特点:基于数组实现,增删慢,查询快,线程不安全。

ArrayList源码细节:
(1)初始集合大小为0,第一次添加数据时变成10。
(2)当即将超过容量时(size+1>length)就扩容当前容量的1.5倍。
(3)最大长度(size): Integer.Max_Value-8。

代码示例:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;//List集合是在util工具包下

public class ArrayListDemo {
	public static void main(String[] args) {
		List<Integer> list=new ArrayList<Integer>();//创建ArrayList对象
		List<Integer> list2=new LinkedList<Integer>();//创建LinkedList对象
		//测试ArrayList的常用API:
		//往集合1中添加元素
		list.add(1);
		list.add(2);
		//往集合2中添加元素
		list2.add(3);
		list2.add(4);
		//arraylist中addAll方法可以添加其他类型的对象,在这里我添加了LinkedList对象
		list.addAll(list2);
		System.out.println(list.contains(1));//list1中是否包含这个对象
		list.set(0, 99);//将list中第一个元素的值改成99
		list.remove(0);//删除list中的第0个元素
		list.get(0);//通过下标来返回集合中的元素
		list.isEmpty();//判断list是否为空
		list.clear();//清空list中的元素
	}
}

(2) LinkedList类

(1)LinkedList采用双向链表结构存储元素。
(2)在插入和删除操作时,对数据的修改较小,因此随机插入和删除效率高。
(3)但在对其遍历时,需要从链表的头部遍历到该链表尾部,因此随机访问速度很慢。
(4)因此LinkedList不适合遍历和访问的操作更适合随机插入和删除的操作。

特点:基于双向链表实现,增删快,查询慢,线程不安全。

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;//List集合是在util工具包下

public class ArrayListDemo {
	public static void main(String[] args) {
		List<Integer> list=new ArrayList<Integer>();//创建ArrayList对象
		List<Integer> list2=new LinkedList<Integer>();//创建LinkedList对象
		list.add(1); 
	    list.add(2); 
		list2.add(1);
		list2.add(2);//添加元素
		list2.addAll(list);//将list容器添加到list2 中
		Iterator<Integer> iterator=list2.iterator();//得到lsit2的迭代器,指向list2
		while(iterator.hasNext()) {
			System.out.print(iterator.next()+" ");//遍历输出list2中的元素          
			//结果:1,2,1,2
		}
	
		list2.get(0);//得到下标为0的元素
		list2.remove(0);//移除0这个元素
		list2.set(1, 99);//修改元素,1,为下标
		list2.clear();//清除
	}
}

(3) Vector类

(1)Vector和ArrayList一样,基于数组实现。
(2)Vector支持线程同步(即同一时刻只允许一个线程对Vector进行操作),以保证多线程环境下的安全性。
(3)因为需要不停的对Vector进行加锁和释放锁操作,因此Vector的读写效率在整体上比ArrayList低。

特点:基于数组实现,增删慢,查询快,线程安全。

(4) Stack(栈)后进先出

import java.util.Stack;

public class StackDemo{
	public static void main(String[] args) {
		Stack<Integer> stack=new Stack<Integer>();
		stack.push(1);
		stack.push(2);//入栈
		stack.peek();//返回栈顶元素
		stack.pop();//返回栈顶元素并出栈
		stack.isEmpty();
		stack.size();//栈顶元素个数
	}

}

2、Queue集合

队列(先进先出):是一种特殊的线性表,只允许在其一端进行插入操作(队尾)在其另一端进行删除操作(队头)。

import java.util.LinkedList;
import java.util.Queue;

public class QueueDemo {
	public static void main(String[] args) {
		Queue<Integer> q= new LinkedList<Integer>() ;
		q.offer(1);
		q.offer(2);//入队列
		q.isEmpty();//为空?
		q.peek();//返回队头的元素
		q.poll();//返回队头元素并出队列
		q.size();//队列的长度
	}
}

3、Set集合(无序且不重复

(1)Set适用于存储无序且值不相等的元素。对象的相等本质上试对象的hashCode是否相等。
(2)有三种实现:HashSet(HashMap实现)、TreeSet(二叉树实现)、LinkHashSet(继承HashSet,HashMap实现数据存储,双向链表记录顺序)
注意:判断两个对象是否相等,要判断hashCode相等,并且equals()方法返回值为true才能证明两个对象相等。

import java.util.HashSet;
import java.util.Set;

public class SetDemo {
	public static void main(String[] args) {
		Set<Integer> set = new HashSet<Integer>();// 实例化set集合
		set.add(1);
		set.add(2);//[1,2]
		System.out.println(set.contains(1));//true
		System.out.println(set.isEmpty());//set为空?false
		set.remove(1);//删除这个值的元素
		System.out.println(set);//[2]
	}
}

4、Map集合

1. HashMap:数组+链表存储数据,线程不安全。
key和value均可以为null。
HashMap的常用参数:
(1)capacity:当前数组的容量,默认为16。每次扩容2倍。
(2)loadFactor:负载因子,默认为0.75.当超过当前容量的0.75时,map就会自动扩容。
(2)threshold:扩容的阈值。等于capacity*loadFactor。
注意:HashMap的内部是一个数组,数组中的每个元素都是一个单向链表。为了减少链表遍历的次数,Java8进行了优化,将数组结构修改Wie数组+链表或红黑树。当链表中的元素超过8个之后,HashMap会将链表结构转换\\成红黑树来提高查询效率。

import java.util.HashMap;
import java.util.Map;

public class HashMapDemo {
	public static void main(String[] args) {
		Map<Integer, String> map=new HashMap<Integer,String>();
		map.put(1, "red");
		map.put(2, "green");
		map.put(null, "color");
		map.put(3,null);
		System.out.println(map);
		map.containsKey(1);//包括这个键吗
		map.get(2);//返回key为2的value
		map.isEmpty();
		map.remove(1);//移除key为1的元素
	}
}

以上是关于Java中的集合框架(JCF)的主要内容,如果未能解决你的问题,请参考以下文章

Java 之 集合框架(JCF)

Java集合框架(JCF)之collention

JCF框架(集合)

《深入理解Java集合框架》系列文章

java集合框架

Java修炼之道--集合框架