前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java小技能:快速创建List常用几种方式

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

作者头像
公众号iOS逆向
发布于 2022-12-19 09:45:02
发布于 2022-12-19 09:45:02
4.1K00
代码可运行
举报
文章被收录于专栏:iOS逆向与安全iOS逆向与安全
运行总次数:0
代码可运行

引言

集合的概念:

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

本文主要介绍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

原理:变长的数组 特性:

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

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

ArrayList 的常用API

2.2 LinkedList

LinkedList的特点

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

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

2.3 补充:List的实现类 Vector

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

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

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

  1. 常规操作: new ArrayList<>()创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
  1. Arrays工具类创建

构造静态不变的 List:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<String> excludeFields = Arrays.asList("secretKey","privateKey","publicKey");
//这种方式构造的 List 是固定长度的,如果调用 add 方法增加新的元素时会报异常 java.lang.UnsupportedOperationException。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Integer> list = Arrays.asList(1, 2, 3);
list = new ArrayList<>(list);
list.add(4);

  1. Stream创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Integer> list = Stream.of(1, 2, 3).collect(Collectors.toList());

  1. 匿名内部类创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Integer> list= new ArrayList() {{
    add(1);
    add(2);
    add(3);
}};

  1. Hutool工具类创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Integer> list = CollectionUtil.newArrayList(1, 2, 3);
  1. guava工具类创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.google.common.collect.Lists;
 
List<Integer> list = Lists.newArrayList(1, 2, 3);
  1. JDK9 引入的Lists创建
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Integer> list = Lists.newArrayList(1, 2, 3);
  1. JDK9引入 List.of (不可变)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Integer> list = List.of(1,2,3);

III 迭代器

3.1 迭代器的特点

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

3.2 迭代器与集合的关系

关系草图

在这里插入图片描述

相关代码片

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 接口的实现,特点如下:

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

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

4.2 TreeSet

特点:

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

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

  1. 按照自然排序存放元素

V 面试题

5.1 说出ArrayList和LinkedList的区别

  1. ArrayList和LinkedList都实现了List接口,但ArrayList采用动态数组的方式,而LinkedList采用双向链表的方式。对于通过下标来访问元素时ArrayList效率较高而对于删除和插入操作LinkedList效率较高。
  2. LinkedList还实现了Queue和Deque接口,可以用作队列或栈,例如:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 使用内部类来解决接口方法被替换的问题

解决方案:回调模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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方法。体现了回调功能。
 }
 
}
  1. Teacher接口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package zx.callback;
 
public interface Teacher {
   void work();//定义工作
}
  1. Programmer类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。");
 }
}
  1. TeacherPro2类

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
 
 }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
短信中的链接为什么那么短?
短网址服务是用于缩短网址,方便用户记忆和访问的一种服务。它通常通过将长网址与短网址服务提供的接口进行匹配,从而实现缩短网址的目的。短网址服务可以降低用户输入长网址时的错误率,提高用户体验,同时也可以减轻服务器的压力,提高网站的访问速度。目前市面上有许多短网址服务,如google的goo.gl、新浪的sina.lt等。
IMWeb前端团队
2018/01/08
6K2
短信中的链接为什么那么短?
字节二面:100Wqps短链系统,如何设计?
这段时间,在整理知识星球中面试专栏时看到这么一个字节跳动的二面真题:100Wqps短链系统,怎么设计?
码猿技术专栏
2023/05/01
4.5K1
字节二面:100Wqps短链系统,如何设计?
永久短网址生成 可以永久使用的短链接推荐
微博、短信、微信在推送信息的时候都有字符的数量限制,如果分享一个长网址,很容易就超出限制,发不出去。短网址服务可以把一个长网址变成短网址,方便在社交网络上传播。
全栈程序员站长
2022/09/02
6.8K0
永久短网址生成 可以永久使用的短链接推荐
记一次在买书过程中发现的短链接安全
本篇文章作者YanXia,本文属i春秋原创奖励计划https://bbs.ichunqiu.com/thread-63288-1-1.html,未经许可禁止转载。
YanXia
2023/04/28
3010
记一次在买书过程中发现的短链接安全
面试必备:如何将一个长URL转换为一个短URL?
前几天整理面试题的时候,有一道试题是《如何将一个很长的URL转换为一个短的URL,并实现他们之间的相互转换?》,现在想起来这是一个绝对不简单的问题,需要考虑很多方面,今天和大家一起学习研究一下!
Java后端技术
2018/08/09
7.7K0
面试必备:如何将一个长URL转换为一个短URL?
如何设计一个短链接系统
短链接是一种将长URL地址转换为较短、易于记忆的链接的技术。它通过使用特定的算法或服务将长链接压缩成更短的形式,以便在限制字符长度或需要更简洁的场景下使用。
柯柏技术笔记
2024/01/10
8710
如何设计一个短链接系统
短网址(short URL)系统的原理及其实现
作者: 小猿大圣 https://segmentfault.com/a/1190000012088345 背景 提供一个短址服务。 你有没有发现,我们的任务中出现长 URL 就会比较麻烦?
前端教程
2018/03/05
5.3K0
短网址(short URL)系统的原理及其实现
如何实现一个短链接服务 | 短链接生成原理
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。
梦溪
2021/08/09
19.4K3
最近学到的「短链接」知识
最近接了一个需求,涉及到了短链接的相关的知识,于是去查阅了相关的资料,在这里给大家整理分享一下。
Java3y
2019/10/15
1.7K0
最近学到的「短链接」知识
短网址安全浅谈
何谓短网址(Short URL)?顾名思义,就是形式上比较短的网址,当前主要是借助短网址来替代原先冗长的网址,方便传输和分享。短网址服务也就是将长网址转换为短网址的服务,这种服务在方便了广大网民的同时也带来了一定的安全风险。
腾讯安全应急响应中心
2018/10/16
1.9K0
短网址安全浅谈
用cloudflare搭建免费的个人短链接平台
短链接又称短网址、短码,意思就是形式上比较短的网址。短链接服务,可以通过将一个普通的冗长的网址缩短生成一个新的较短的网址,便于分享传播。
六月河
2022/09/26
4.7K0
用cloudflare搭建免费的个人短链接平台
【愚公系列】2022年03月 .NET CORE工具案例-短链接服务
短链接,通俗来说,就是将长的URL网址,通过程序计算等方式,转换为简短的网址字符串。
愚公搬代码
2022/03/04
4270
东半球最接地气的短链接系统设计
今天下午,烟哥和同事在厕所里排队等坑的时候(人多坑少)。想象一下一个场景,我正在一边排队,一边拿着手机撩妹。前面一个同事,拿着手机短信转过头来和我聊天。
Java3y
2019/11/12
6610
东半球最接地气的短链接系统设计
如何利用H5短网址快速缩短长网址
你是否曾经需要共享一个链接,但是URL这么长,它看起来更像是一个乱码的鸡肋?没有必要担心,因为在线上有非常聪明的服务叫网址缩短器。这些服务将为您创建一个新的短链接,然后引导那些用户通过短连接访问您的很长的乱码的鸡肋URL。现在,你可以与任何你感兴趣的人分享这个链接,而不用担心干扰你的电子邮件、短信或微信朋友圈。
赵小磊
2018/11/08
4.1K0
如何利用H5短网址快速缩短长网址
新浪短网址生成器等短链接工具的原理(第二章)
短网址顾名思义就是一个很短的链接和网址,常用于将一个长连接缩短成一个短链接,方便利于推广。  url.cn短网址,可能很多朋友都已经不再陌生,特别是在微博、微信、朋友圈、QQ群、短信息等应用中十分普遍,短网址的前身是在企鹅微博发微博时有时发很长的网址连接,但由于微博只限制140个字,所以微博就自动把您发的长网址给转换成短网址了。  企鹅短链接(url.cn/xxx)属于企鹅微博旗下的短网址,原先是微博在使用。短网址生成可以有效的避免链接过长,推广不便等因素 生成t.cn短连接后更有利于在微信推广和QQ群中推广 !目前过国内使用最多的短网址有三家。其中t.cn 属于新浪短链接,url.cn属于腾讯短链接,dwz.cn属于百度!今天我们要说的就是url.cn短网址!
南昌谢大脚
2020/04/23
2.5K0
短链接原理及其算法实现
短网址在目前来说是一个非常流行的东西,提供短网址服务的网站也是相当多的,短网址在微博上应用的比较广泛 ,因为微博对于url的长度有一个限制,所以将一个很长的网址转换成一个很短的网址,是一个非常棒的想法,其好处有很多,比如字符少,美观,便于发布和传播等。
OECOM
2020/07/01
5.3K0
Python竟然能把“长的”变成“短的”?
最近我遇到了一些问题:需要将几百条长链接转成短链接。经过一番学习,发现Python可以轻松解决这个问题,不仅可以实现缩短【长链接→短链接】,也可以实现还原【短链接→长链接】。
快学Python
2022/06/10
8150
Python竟然能把“长的”变成“短的”?
URL短网址生成算法原理
短网址(Short URL),是在形式上比较短的网址,通过映射关系跳转到原有的长网址。
阳光岛主
2019/02/18
4.6K2
URL短链接实现方法
最近项目开发中,需要实现URL长链接转短链接的需求,于是在网上找了一些资料,顺便整理了下,欢迎有想法的童鞋踊跃留言,我们共同探讨。
wangxl
2018/02/25
7.6K1
URL短链接实现方法
搭建短链接平台详细分析及具体代码实现
短链接,又称缩略网址服务、缩址、短址、短网址、缩略网址、网址缩短、缩短网址、URL缩短等,指的是一种互联网上的技术与服务。此服务可以提供短URL以代替原来可能较长的URL,将长的URL地址缩短。
Mintimate
2021/08/12
3.9K0
搭建短链接平台详细分析及具体代码实现
推荐阅读
相关推荐
短信中的链接为什么那么短?
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 引言
  • I Collection接口
    • 1.1 collection的主要子接口和实现类
    • 1.2 Collection的常用API
  • II List接口
    • 2.1 ArrayList
    • 2.2 LinkedList
    • 2.3 补充:List的实现类 Vector
    • 2.4 快速创建List常用几种方式
  • III 迭代器
    • 3.1 迭代器的特点
    • 3.2 迭代器与集合的关系
    • 3.3 Iterator的常用API
  • IV Set接口
    • 4.1 HashSet
    • 4.2 TreeSet
  • V 面试题
    • 5.1 说出ArrayList和LinkedList的区别
    • 5.2 使用内部类来解决接口方法被替换的问题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档