java集合Collection实现类解析ArrayList LinkedList及Vector
作者:kl 发布时间:2022-05-01 05:44:12
前言
平时开发经常会用到List等集合操作,在这里做一个小结
java集合Collection
java里面集合分为两大类:List和Set,下面是类图信息
List实现类
List的实现类ArrayList,LinkedList,Vector的特性
有序集合List接口的实现类LinkedLIst,ArrayList,Vector,Stack
(1)ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问,
当数组大小不满足时会增加存储能力,将已有数组数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,
需要对数组进行拷贝,移动,代价比较高。因此,它适合随即查找和遍历,不适合频繁插入和删除财操作。
(2)Vector与ArrayList一样,也是通过数组实现的。不同的是它支持线程的同步,即一时刻只有一个线程能够写Vector,
避免多线程同时写引起的不一致性。但实现同步需要很高的花费, 因此,访问它比访问ArrayList慢。
2.1 Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求其大小的双倍空间,而ArrayList每次对size增长50%.
2.2 Vector和ArrayList都是用数组实现的,所以,在添加和插入时,最好从表尾操作,而不要从中间或者表头开始,以避免数组移动引起的开销!
(3)LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随即访问和遍历速度比较慢。另外,由于它实现了接口Deque,它还提供了List没有定义的方法,专门用于操作表头和表尾元素。
(4)可以为每个List生成ListIterator,支持双向遍历List,而且能够在ListIterator位置插入和删除元素。
(5)Stack堆栈类继承Vector,它总是对列表的尾部数据进行操作,采用了先进后出的策略,自定义了push(),peek(),pop(),empty(),search()几个方法。
Set实现类
Set的实现类HashSet,LinkedHashSet,TreeSet的特性
无序集合Set的实现类HashSet,LinkedHashSet,TreeSet
(1)Set不允许存放相同的元素,判断的依据是根据存放元素的equals方法和hashCode来判断的,如有需要可以重写这两个方法
(2) HashSet:基于HashMap实现,哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放
(3)LinkedHashSet:基于LinkedHashMap实现,以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet
(4)TreeSet:基于TreeMap实现,Set里唯一现实了SortedSet接口的实现类,默认按元素的实现接口Comparable的方法CompareTo(Object obj)升序,
如有需要,元素可实现Comparable
代码实例
/**
* @author kl by 2016/4/5
* @boke www.kailing.pub
*/
public class CollectionTest {
public void initCollection(Collection collection){
collection.add(1);
collection.add(2);
collection.add(3);
collection.add(4);
collection.add(5);
collection.add(6);
}
@Test
public void linkListTest(){
LinkedList list = new LinkedList();
//初始化数据
initCollection(list);
//迭代方式一
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i).toString());
}
System.out.println("-------------------------迭代方式一华丽分割线----------------------------");
//迭代方式二
for (Object o : list) {
System.out.println(o.toString());
//list.add(3);//这样写直接抛异常,有这种业务需要的直接用ListIterator迭代
}
System.out.println("-------------------------迭代方式二华丽分割线----------------------------");
//迭代方式三 封装了Iterator
ListIterator listIterator = list.listIterator();
while (listIterator.hasNext()) {
/**
* 在迭代的同时可以操作当前的listIterator,对集合做增删改的操作,其他的迭代方式在迭代的时候不能直接操作集合
* ListIterator没有直接更新的方法,通过删除和添加来达到更新的目的
*/
Object value=listIterator.next().toString();//
if (value.equals("3")){
listIterator.remove();//删除某个元素
listIterator.add(0);//添加某个元素
}else{
System.out.println(value);
}
}
System.out.println("-------------------------迭代方式三华丽分割线----------------------------");
//迭代方式四 ps:java.util.Iterator
Iterator iterable = list.iterator();
while (iterable.hasNext()) {
System.out.println(iterable.next());
}
System.out.println("-------------------------迭代方式四华丽分割线----------------------------");
System.out.println("是否存在 " + list.contains(9)); //使用indexOf函数现实
System.out.println("在集合的哪个位置 " + list.indexOf(3)); //不存在返回-1
System.out.println("在集合的哪个位置 " + list.lastIndexOf(3));//从集合的最后索引往前找
list.remove(0);//移除指定下标元素
Object str[] =list.toArray();//转换成数组,感觉一般不会有这个操作
List list1=list.subList(2,6);//分割一个集合
for (Object o : list1) {
System.out.println("list1 "+o.toString());
//list.add(3);//这样写直接抛异常,有这种业务需要的直接用ListIterator迭代
}
list.removeFirst();
list1= (List) list.clone();//复制一份list,和直接list1=list的不同之处在于对list操作不影响list1
/*以上操作迭代LinkedList,ArrayList,Vector都可用*/
/*以下操作方式是LinkedList特有的,是实现Deque中的方法*/
list.addFirst(10);
list.addLast(10);
System.out.println("链表头数据 "+list.getFirst().toString());
System.out.println("链表尾数据 "+list.getLast().toString());
list.removeFirst();//移除第一个元素
list.offer(11);//方法内部使用了add方法
list.removeLast();//移除最后一个元素
}
@Test
public void StackTest(){
Stack list=new Stack();
initCollection(list);
System.out.println("pop :"+list.pop());// pop() 移除栈顶的值,并返回移除的Obj
System.out.println("push :"+list.push(5));// push() 压栈,并返回Obj
System.out.println("peek :"+list.peek());// 取栈顶的值
System.out.println("empty :"+list.empty());// 判空方法,是否为空栈
System.out.println("search :"+list.search(99));//查找元素的位置,不存在返回-1,可以用来判断是否存在某个值
Enumeration en= list.elements(); //Vector特有的迭代方式
while (en.hasMoreElements()){
if(list.empty()){
}else
System.out.println(en.nextElement());
}
}
@Test
public void arrayListTest(){
ArrayList list=new ArrayList();
initCollection(list);
for(Object o:list){
System.out.println(o.toString());
}
}
@Test
public void VectorTest(){
Vector v=new Vector();
Enumeration en= v.elements(); //Vector特有的迭代方式
while (en.hasMoreElements()){
System.out.println(en.nextElement());
}
}
@Test
public void SetTest(){
HashSet hs = new HashSet();
initSet(hs);
System.out.println("HashSet 顺序:"+hs);
LinkedHashSet lhs = new LinkedHashSet();
initSet(lhs);
System.out.println("LinkedHashSet 顺序:"+lhs);
TreeSet ts = new TreeSet();
initSet(ts);
System.out.println("TreeSet 顺序:"+ts);
for(Object s:hs){
System.out.println("value:"+s);
}
}
public void initSet(Set set){
set.add("G");
set.add("B");
set.add("A");
set.add("E");
set.add("D");
set.add("C");
set.add("F");
}
来源:http://www.kailing.pub/article/index/arcid/89.html


猜你喜欢
- 一般我们在java中运行其它类中的方法时,无论是静态调用,还是动态调用,都是在当前的进程中执行的,也就是说,只有一个java虚拟机实例在运行
- Javaweb开发环境的配置也是比较繁琐的一件事情,虽然理论上使用记事本,完全可以写出一个Javaweb工程,但是在团队大型开发的Javaw
- 1.常见字符串编码常见的字符串编码有:LATIN1 只能保存ASCII字符,又称ISO-8859-1。UTF-8 变长字节编码,一个字符需要
- 异步futureFuture 表示异步操作的结果 他有两种状态未完成状态 :当调用异步函数时,他返回未完成的Future 并持续到异步函数操
- Java8Stream流操作List去重根据属性去重整体去重使用distinctArrayList<LabelInfoDTO>
- 一、线程的生命周期1.五种状态:新建状态、就绪状态、运行状态、阻塞状态、消亡状态2.就绪状态的线程表示有权利去获取CPU的时间片,CPU时间
- 前言惰性计算(尽可能延迟表达式求值)是许多函数式编程语言的特性。惰性集合在需要时提供其元素,无需预先计算它们,这带来了一些好处。首先,您可以
- Android Handler的使用,在讲Handler之前,我们先提个小问题,就是如何让程序5秒钟更新一下Title.首先我们看一下习惯了
- 需要用到 java 写一个 ftp 的工具,因为只有一点点 java 基础,但是由于好几年不用,几乎算是不会了,只好一点点来搞,还好能捡起来
- android欢迎页自动跳转及手机网络检测,具体实现代码如下所示:在1.2s后从欢迎页(welcome)跳转到登陆页(Login_Activ
- 注:图片来源于网络SpringBoot作为业内公认的优秀开源框架,它的 * 是如何实现呢?在这里首先对一些基础组件进行分析;1、事件Appl
- 首先看一下泛型的基本语法访问修饰符 返回类型 泛型方法名 <T>(T 参数)1):无法在泛型方法内部给任何 T 类型创建实例的对
- Android 解决ScrollView嵌套CridView显示问题由于GridView是可滑动的控件,嵌套在ScrollView下时需要重
- @Scheduled不执行的原因1. 今天用@Schedule做了一个定时任务希望凌晨1点执行,代码如下@Servicepublic cla
- Eclipse的Servers视图中无法添加Tomcat6/Tomcat7的方法引言: 在基于Eclipse的开发过程中,出现了无法在Ecl
- 本文将反射的东西整理了一下 , 提供了最全面的东西 , 当然也是基础的东西 ,在学好了这一切的基础上 , 大家可以学习反射的具体插件等应用
- 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”。异常通常由错误的代码引发,并由能够更正错误的代码进行
- android系统提供了Environment.getExternalStorageDirectory()接口获得存储器的路径,但是这个接口
- 引言 在c#中,可能大多数人针对于多线程之间的通讯,是熟能生巧,对于AsyncLocal 和Thre
- 前言Java17将是一个长期支持的LTS版本。Java采用了6个月的发布周期。也就是说,它将每6个月发布一个新版本的Java。每隔3年,LT