Java中的集合框架(JCF)
Posted SSimeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的集合框架(JCF)相关的知识,希望对你有一定的参考价值。
Java中的集合
一、容器框图
二、集合的的基本概念
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)的主要内容,如果未能解决你的问题,请参考以下文章