Java实用小技能之快速创建List常用几种方式

 更新时间:2022年12月13日 09:26:06   作者:公众号iOS技能  
java集合可以说无论是面试、刷题还是工作中都是非常常用的,下面这篇文章主要给大家介绍了关于Java实用小技能之快速创建List常用的几种方式,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

引言

集合的概念:

  • 在数学意义上的概念是: 对个数据放置在一起而建立起来的模型,这些数据类型可以不同;
  • 在软件中的定义,一堆数据放置在一个空间中存储,将整个存储空间称为集合。

本文主要介绍collection接口下的List接口和Set接口,以及迭代器Iterator。

Collection是层次结构 中的根接口,JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和List)实现。

I Collection接口

1.1 collection的主要子接口和实现类

1.2 Collection的常用API

II List接口

list接口的实现类:ArrayList和LinkedList

2.1 ArrayList

原理:变长的数组 特性:

  • 是顺序表,方便查找
  • 每次扩容,集合的长度在原来长度上增加一半。
  • 集合默认的空间为10.
  • ArrayList 是非线程安全的
  • 在集合的遍历过程中,不能使用ArrayList本身的方法删除和添加元素。

除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出ConcurrentModificationException

ArrayList 的常用API:

2.2 LinkedList

LinkedList的特点

  • 底层使用List 接口的链接列表实现。方便删除和插入。
  • 默认长度为0.
  • LinkedList是非线程安全的。
  • 在集合的遍历过程中,不能使用ArrayList本身的方法删除和添加元素。

除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出ConcurrentModificationException

2.3 补充:List的实现类 Vector

Vector 类可以实现可增长的对象数组,Vector的特性如下:

  • 顺序表,方便查找
  • 每次扩容在原长度上增加一倍。
  • 默认大小为10
  • Vector是线程安全。

2.4 快速创建List常用几种方式

  • 常规操作: new ArrayList<>()创建
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
  • Arrays工具类创建

构造静态不变的 List:

List<String> excludeFields = Arrays.asList("secretKey","privateKey","publicKey");
//这种方式构造的 List 是固定长度的,如果调用 add 方法增加新的元素时会报异常 java.lang.UnsupportedOperationException。

如果想要改变可以通过 ArrayLis t进行包装成动态。

List<Integer> list = Arrays.asList(1, 2, 3);
list = new ArrayList<>(list);
list.add(4);
  • Stream创建
List<Integer> list = Stream.of(1, 2, 3).collect(Collectors.toList());
  • 匿名内部类创建
List<Integer> list= new ArrayList() {{
    add(1);
    add(2);
    add(3);
}};
  • Hutool工具类创建
List<Integer> list = CollectionUtil.newArrayList(1, 2, 3);
  • guava工具类创建
import com.google.common.collect.Lists;
 
List<Integer> list = Lists.newArrayList(1, 2, 3);
  • JDK9 引入的Lists创建
List<Integer> list = Lists.newArrayList(1, 2, 3);
  • JDK9引入 List.of (不可变)
List<Integer> list = List.of(1,2,3);

III 迭代器

3.1 迭代器的特点

  • Iterator接口,本身是一种快速遍历集合的算法。
  • 集合可以调用iterator方法获取迭代器。
  • 迭代器是一个带有游标的线性表,用来记录集合的元素地址。

3.2 迭代器与集合的关系

关系草图

相关代码片

public class IteratorDemo{
    public static void main(String[] args){
        List l=new ArrayList();
        l.add("abc");
        l.add("123");
        l.add("中国");
        Iterator it=L.iterator();
    }
}

3.3 Iterator的常用API

IV Set接口

特点类似于数学集合,无顺序,不可重复,与List的特点相反,他只能有一个null值。 在这里讲讲他的实现类:HashSet,和TreeSet。

4.1 HashSet

基于哈希表的 Map 接口的实现,特点如下:

  • 采用hash算法的Set,相当于hashMap的Key。
  • 默认的容量为16,加载因子75%。
  • HashSet非线程安全。
  • 此实现不是同步的。
  • 在集合的遍历过程中,不能使用ArrayList本身的方法删除和添加元素。

除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出ConcurrentModificationException

4.2 TreeSet

特点:

  • 默认的空间为0
  • 采用二叉树算法实现的
  • 原理为TreeMap的Key
  • 在集合的遍历过程中,不能使用ArrayList本身的方法删除和添加元素。

除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出ConcurrentModificationException

  • 按照自然排序存放元素

V 面试题

5.1 说出ArrayList和LinkedList的区别

  • ArrayList和LinkedList都实现了List接口,但ArrayList采用动态数组的方式,而LinkedList采用双向链表的方式。 对于通过下标来访问元素时ArrayList效率较高而对于删除和插入操作LinkedList效率较高。
  • LinkedList还实现了Queue和Deque接口,可以用作队列或栈,例如:
package com.csuinfosoft.grammer.ListDemo;
 
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
 
/**
 * 
 * @author iOS逆向
 * @date 上午8:32:37
 * ArrayList和LinedList都实现了List接口,但LinkedList还实现了Queue和Deque接口,
 * 可以用作队列和栈。(其中在jdk6.0,LinkedList才实现Deque接口)
 */
public class LinkedListOfqueue {
	public static void main(String[] args) {
		Queue queue=new LinkedList();
		//入队
		queue.offer("A");// boolean offer(E o) 如果可能,将指定的元素插入此队列 
		queue.offer("B");
		queue.offer("C");
		//出队
		System.out.println(queue.poll());// E poll() 检索并移除此队列的头,如果此队列为空,则返回 null。
		System.out.println(queue.poll());
		Deque stack=new LinkedList();
		//入栈
		stack.push("A");//void push(E e)将一个元素推入此双端队列所表示的堆栈(换句话说,此双端队列的头部),如果可以直接这样做而不违反容量限制的话;
		//如果成功,则返回 true,如果当前没有可用空间,则抛出 IllegalStateException。 
		stack.push("B");
		stack.push("C");
		//出栈
		System.out.println(stack.pop());// E pop() 从此双端队列所表示的堆栈中弹出一个元素。
		System.out.println(stack.pop());
	}
}
 queue=new LinkedList();
		//入队
		queue.offer("A");// boolean offer(E o) 如果可能,将指定的元素插入此队列 
		queue.offer("B");
		queue.offer("C");
		//出队
		System.out.println(queue.poll());// E poll() 检索并移除此队列的头,如果此队列为空,则返回 null。
		System.out.println(queue.poll());
		Deque stack=new LinkedList();
		//入栈
		stack.push("A");//void push(E e)将一个元素推入此双端队列所表示的堆栈(换句话说,此双端队列的头部),如果可以直接这样做而不违反容量限制的话;
		//如果成功,则返回 true,如果当前没有可用空间,则抛出 IllegalStateException。 
		stack.push("B");
		stack.push("C");
		//出栈
		System.out.println(stack.pop());// E pop() 从此双端队列所表示的堆栈中弹出一个元素。
		System.out.println(stack.pop());
	}
}

5.2 使用内部类来解决接口方法被替换的问题

解决方案:回调模式

package zx.callback;
public class Test {
 
	/**
	 * @param args
	 * @return void
	 */
	public static void main(String[] args) {
		  //实例化一个讲师
		TeacherPro2 pro=new TeacherPro2("kunnan");
		//作为程序员工作
		pro.work(); //调用继承的方法
		//作为老师工作
		pro.asTeacher().work();//使用内部类来解决接口方法被替换的问题
		//pro.asTeacher()由pro创建,pro.asTeacher()的work()方法调用了pro的teach方法。体现了回调功能。
	}
}
  • Teacher接口
package zx.callback;
 
public interface Teacher {
   void work();//定义工作
}
  • Programmer类
package zx.callback;
 
/**
 * 程序员
 * 
 * @author zhang_kn
 *
 */
public class Programmer {
	private String name;
 
	public Programmer() {
 
	}
 
	public Programmer(String name) {
		super();
		this.name = name;
	}
 
	public String getName() {
		return name;
	}
 
	public void setName(String name) {
		this.name = name;
	}
 
	public void work() {
		System.out.println("天天写代码,天天需求被改。。ios。");
	}
}
  • TeacherPro2类

pro.asTeacher()由pro创建,pro.asTeacher()的work()方法调用了pro的teach方法。体现了回调功能。

package zx.callback;
 
public class TeacherPro2 extends Programmer {
	// 定义一个方法作为教师的职责授课,使用private修饰
	private void teach() {
		System.out.println("讲课。。。");
	}
	// 提供内部类,使用private修饰
	private class Coust implements Teacher {
		public void work() {//避免与TeacherPro2 继承的work方法重复
			teach();//执行教师的职责。使用TeacherPro2 的资源teach。体现了回调模式。
		}
	}
	public Teacher asTeacher() {//提供给外界获取包含老师功能的实现类的接口
		return new Coust();
	}
	
	public TeacherPro2() {
		super();
	}
	public TeacherPro2(String name) {
		super(name);
 
	}
}

总结

到此这篇关于Java实用小技能之快速创建List常用几种方式的文章就介绍到这了,更多相关Java快速创建List方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 中synchronize函数的实例详解

    Java 中synchronize函数的实例详解

    这篇文章主要介绍了Java 中synchronize函数的实例详解的相关资料,希望通过本文能帮助到大家理解使用synchronize函数的使用方法,需要的朋友可以参考下
    2017-09-09
  • Netty分布式ByteBuf使用的底层实现方式源码解析

    Netty分布式ByteBuf使用的底层实现方式源码解析

    这篇文章主要为大家介绍了Netty分布式ByteBuf使用底层实现方式源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java结合redis实现接口防重复提交

    Java结合redis实现接口防重复提交

    本文主要介绍了Java结合redis实现接口防重复提交,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • SpringBoot多线程与任务调度总结

    SpringBoot多线程与任务调度总结

    多线程与任务调度是java开发中必须掌握的技能,本文主要介绍了SpringBoot多线程与任务调度总结,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • Spring中的@DependsOn注解使用解析

    Spring中的@DependsOn注解使用解析

    这篇文章主要介绍了Spring中的@DependsOn注解使用解析,@DependsOn注解可以定义在类和方法上,意思是我这个组件要依赖于另一个组件,也就是说被依赖的组件会比该组件先注册到IOC容器中,需要的朋友可以参考下
    2024-01-01
  • Java 反射机制原理与用法详解

    Java 反射机制原理与用法详解

    这篇文章主要介绍了Java 反射机制原理与用法,结合实例形式详细分析了java反射机制的相关概念、原理、使用方法及操作注意事项,需要的朋友可以参考下
    2019-12-12
  • java微信公众号发送消息模板

    java微信公众号发送消息模板

    这篇文章主要为大家详细介绍了java微信公众号发送消息模板,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 详解如何解析pom文件方法示例

    详解如何解析pom文件方法示例

    这篇文章主要为大家介绍了详解如何解析pom文件方法示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Zookeeper Curator使用介绍

    Zookeeper Curator使用介绍

    curator是Netflix公司开源的⼀套Zookeeper客户端框架,和ZKClient⼀样,Curator解决了很多Zookeeper客户端非常底层的细节开发⼯作,包括连接重连,反复注册Watcher和NodeExistsException异常等,是最流行的Zookeeper客户端之⼀
    2022-09-09
  • Maven安装过程图文详解

    Maven安装过程图文详解

    这篇文章主要介绍了Maven安装过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-07-07

最新评论