前言

List是java重要的数据结构之一,我们经常接触到的有ArrayList、Vector和LinkedList三种,他们都继承来自java.util.Collection接口,类图如下:

1.构造 List 后使用 List.add 初始化

//方式1-1

List linkedList = new LinkedList<>();

linkedList.add("a");

linkedList.add("b");

linkedList.add("c");

for (String s : linkedList){

System.out.print(s+" ");

}

System.out.println();

//方式1-3

List linkedList3 = new ArrayList<>();

linkedList3.add("a");

linkedList3.add("b");

linkedList3.add("c");

for (String s : linkedList3){

System.out.print(s+" ");

}

2.使用 {{}} 双括号语法

//方式2

List linkedList4 = new LinkedList(){{

add("1");

add("3");

add("2");

}};

for (String s : linkedList4){

System.out.print(s+" ");

}

外层的{}定义了一个 LinkedList 的匿名内部类。内层的{}的定义了一个实例初始化代码块。 这个代码块在初始化内部类时执行。所以这里相当于定义了一个匿名内部类,并使用add添加元素来初始化。

这种方式有几个缺点:

使用匿名内部类,会有效率上的损失。当然在大多数情况下,这点效率都是可接受的。

静态内部类持有所在外部类的引用。如果需要将 List 返回给到其他地方使用,可能造成内存泄漏。

3.使用 Arrays.asList

//方式3

List ArraysasList = Arrays.asList("a","b","c");

for (String s : ArraysasList){

System.out.print(s+" ");

}

这种方式使用了 java.util.Arrays 的静态方法。写法上比之前的两种都更简洁,也没有构造匿名内部类的效率问题。

但也有几点需要注意:

Arrays.asList 返回的是 Arrays 的静态内部类(静态内部类不持有所在外部类的引用)。

这个内部类继承自 AbstractList,实现了 RandomAccess,内部使用了一个数组来存储元素。但是不支持增删元素。这点需要注意。如果只是使用 Arrays.asList 来初始化常量,那么这点就不算什么问题了。

4. 使用 Stream (JDK8)

List list = Stream.of("a","b","c").collect(Collectors.toList());

使用了 JDK8 的 Stream 来初始化。 单纯初始化 List,使用 Stream 有点大材小用了。

使用 Lists (JDK9)

//方式5

List list1 = Lists.newArrayList("a","b","c");

List的2种去重方式

我们大家都知道,set集合的特点就是没有重复的元素。如果集合中的数据类型是基本数据类型,可以直接将list集合转换成set,就会自动去除重复的元素,这个就相对比较简单。

当list集合中存储的类型是对象类型的时候,我们就不能简单的只把list集合转换成set集合。

当list集合中存储的是对象时,我们需要在对象的实体类中去重写equals()方法和hashCode()方法,如下:

@Override

public boolean equals(Object arg0) {

People p = (People) arg0;

return name.equals(p.name) && phoneNumber.equals(p.phoneNumber);

}

@Override

public int hashCode() {

String str = name + phoneNumber;

return str.hashCode();

}

equals()

比较两个对象时,首先先去判断两个对象是否具有相同的地址,如果是同一个对象的引用,则直接放回true;如果地址不一样,则证明不是引用同一个对象,接下来就是挨个去比较两个字符串对象的内容是否一致,完全相等返回true,否则false。

hashCode()官方定义:

hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。

hashCode 的常规协定是:

在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。

如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。

以下情况不是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。

实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)

当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

List去重的方法很多,可以用for循环或者使用java8新特性stream

java list初始化数据_Java中初始化List的5种方法 /List的2种去重方式相关推荐

  1. java初始化集合_Java 中初始化 List 集合的 6 种方式!

    List 是 Java 开发中经常会使用的集合,你们知道有哪些方式可以初始化一个 List 吗?这其中不缺乏一些坑,今天栈长我给大家一一普及一下. 如果想学习Java工程化.高性能及分布式.深入浅出. ...

  2. java 8位随机数_JAVA中生成指定位数随机数的方法总结

    JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 1 public static String getRandom1(intlen) {2 int rs = ...

  3. java 文件目录是否存在_java中判断文件目录是否存在的方法

    java中判断文件目录是否存在的方法 发布时间:2020-06-23 09:34:47 来源:亿速云 阅读:72 作者:Leah 本篇文章展示了java中判断文件目录是否存在的方法具体操作,代码简明扼 ...

  4. java 可变参数列表_java中可变参数列表的实现方法

    我们在对可变参数有一定的认识后,可以引申一下它的使用范围.在数组中也会需要参数的传入,那么结合参数的数量不固定,我们在参数类型上也得到了增加,这就是本篇所要讲的可变参数列表.下面我们就java可变参数 ...

  5. java声明和初始化数组_Java 中初始化数组

    数组是一种有用的数据类型,用于管理在连续内存位置中建模最好的集合元素.下面是如何有效地使用它们. -- Chris Hermansen(作者) 有使用 C 或者 FORTRAN 语言编程经验的人会对数 ...

  6. java 如何初始化数组_java中初始化数组的三种方式分别是什么

    三种初始化方式: 1.静态初始化:创建+赋值 2.动态初始化:先创建再赋值 3.默认初始化:创建之后若不赋值则会被赋对应数据类型的默认值 (视频教程推荐:java视频) 我们来看一下具体代码:publ ...

  7. java获取response数据_Java中实现Http请求并获取响应数据

    前言 在演示的功能代码中使用的请求http地址为:http://timor.tech/api/holiday/year/ 接口说明:获取指定年份或年月份的所有节假日信息.默认返回当前年份的所有信息. ...

  8. java 游标 查数据_Java中的大量数据查询

    问题描述:在通常的三层构架下,客户通过Browser请求Web服务器查询数据库,而查询结果是上千条甚至是上百万条记录,要求查询结果传送到客户端浏览器并分页显示. 考虑因素: 1. Web服务器的资源消 ...

  9. java sqlserver 插入数据_java中怎样向SQLserver中插入数据

    1. 通过Microsoft的JDBC驱动连接.此JDBC驱动共有三个文件,分别是mssqlserver.jar.msutil.jar和 msbase.jar,可以到微软的网站去下载(://www.m ...

最新文章

  1. Oracle分页(limit方式的运用)
  2. 她不理我了,怎么办?
  3. Linux vi常用指令使用案例汇总
  4. mysql 关键词相关度排序方法详细示例分析
  5. eclipse使用maven tomcat插件部署无法关联源代码
  6. 怎么在表格中转换html格式,图解Excel与Html格式之间的互相转换
  7. 非模态对话框的销毁及消息的发送顺序
  8. 吃掉那只青蛙_每日可交付成果–吃青蛙的艺术
  9. 在Ubuntu上安装Drone持续集成环境
  10. webbrowser 访问iframe拒绝访问_获取文件夹拒绝访问权限
  11. TP5模型修改器和读取器
  12. Fragment事务管理源码分析
  13. 一、64位windows 安装mysql
  14. 前端工作中碰到的一些小问题总结
  15. 粒子滤波 python,粒子滤波器基本原理.ppt.ppt
  16. html语言中alt,html中alt是什么意思?
  17. 统计|如何建立单总体方差的置信区间
  18. 【蓝桥杯每日一练:蹩脚两轮车】
  19. 苹果认怂了!iPhone 将改用 USB-C 接口
  20. 泰裤辣!五一烧烤倒计时,还有人没做好攻略吗?

热门文章

  1. 显示建立服务器,服务器的搭建
  2. 更新生产任务单工时和BOM描述
  3. 学习网站项目学习 - Django - 优惠券系统、结算系统
  4. 动力节点crm项目中登录无响应记录
  5. 【测试】Solis BIODYNE 品牌简介以及相关产品报告
  6. JAVA三大支柱之多态
  7. css 最后一行文字对齐,如何在CSS中居中对齐最后一行文本?
  8. djano 字段不重复_硬不硬你说了算!近 40 张图解被问千百遍的 TCP 三次握手和四次挥手面试题...
  9. 跳伞兵(本人自出题)
  10. 如何用PLSQL连接服务器的Oracle数据库