怎么定义list_常用的List接口下集合
List接口
1. List接口介绍
java.util.List
接口继承自Collection接口, 是==单列集合==的一个重要分支, 习惯性的会将实现了List
接口的对象称为List
集合. 在List
集合中允许出现重复的元素, 所有的元素是以一种线性方式进行储存的, 在程序中可以通过索引来访问集合中的指定元素. 另外, List
集合还有一个特点就是==元素有序==, 即元素的存入顺序和取出顺序一致.
所以, List
接口的特点 :
- 有序, 他是一个元素存取有序的集合, 例如, 存元素的顺序是11, 22, 33.那么集合中, 元素的储存就是按照11, 22, 33的顺序完成的.
- 有索引, 他是一个带有索引的集合, 通过索引就可以精确的操作集合中的元素 (与数组的索引是一个道理)
- 可重复, 集合中可以有重复的元素, 通过元素的equals方法, 来比较是否为重复的元素.
ArrayList
类是List接口的实现类, 该类中的方法都来自与List中定义
2. List接口常用的方法
List作为Collection集合的子接口, 不但继承了Collection接口中的全部方法, 还增加了一些根据元素索引来操作集合的特有方法. 如下 :
public void add(int index, E element)
: 将指定的元素, 添加到该集合中的指定位置上.- E element代表 泛型元素, 即任何数据类型的元素
public E get(int index)
: 返回集合中指定位置的元素public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素public E set(int index, E element)
: 将指定的元素替换集合中指定位置的元素, 返回值是更新前的元素
List集合的特有的方法都是跟索引有关.
我们之前学习Collection体系的时候, 发现List集合下有很多的集合, 他们储存结构不同, 这样就导致了这些集合他们有各自的特点, 供我们在不同环境下使用.
3. ArrayList
集合
java.util.ArrayList
集合数据存储的结构是数组结构, 元素增删慢, 查找快, 由于日常开发中使用最多的功能为查询数据, 遍历数据, 所以ArrayList
是最常用的集合.
许多程序员开发时非常随意的使用ArrayList
完成任何需求, 并不严谨, 这种用法是不提倡的.
4. LinkedList
集合
java.util.LinkedList
集合数据储存的结构是链表结构, 方便元素添减, 删除的集合
实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList
提供了大量首尾操作的方法。
这些方法我们作为了解即可:
public void addFirst(E e)
:将指定元素插入此列表的开头。public void addLast(E e)
:将指定元素添加到此列表的结尾。public E getFirst()
:返回此列表的第一个元素。public E getLast()
:返回此列表的最后一个元素。public E removeFirst()
:移除并返回此列表的第一个元素。public E removeLast()
:移除并返回此列表的最后一个元素。public E pop()
:从此列表所表示的堆栈处弹出一个元素。public void push(E e)
:将元素推入此列表所表示的堆栈。public boolean isEmpty()
:如果列表不包含元素,则返回true。LinkedList
是List的子类,List中的方法LinkedList
都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList
的特有方法即可。在开发时,LinkedList
集合也可以作为堆栈,队列的结构使用。
Set 接口
Set是Collection下面的另一个子接口。Set接口有以下特点:
- 无序。(按照什么顺序存,不一定按照什么顺序取)
- 无索引。(不能根据索引获取元素)
- 不可重复(不能存放重复元素)Set是一个接口,如果要用,需要使用实现类,最常用的实现类是
HashSet
。
哈希(Hash)值就是一个int数字, 我么你可以把哈希值看成对象的一个标识, 一个特征码.
在Object中有一个方法叫做hashCode
, 可以获取对象的哈希值
int hashCode()
: 获取对象的哈希值, 是Object类中的, 任意对象都可调用.
public class Student {private String name;private int age;//get set 方法
}public class StudentTest {public static void main(String[] args) {Student stu = new Student("张三丰", 100);System.out.println(stu.hashCode());//1163157884//不new新对象, 改变stu的内容, hashCode怎么变?//hashCode不变Student stu2 = new Student("张三丰", 100);System.out.println(stu.hashCode());//1965725890}
}
Object类中的哈希值计算规则是根据地址值计算的, stu
和stu2
地址值不一样, 所以他们的哈希值是不相同的. 哈希值如果通过地址值计算的话, 意义不大.
我们大多数是希望根据对象的属性计算对象的哈希值, 如果两个对象的属性完全相同, 那么对象的哈希值也应该相同.
对象的哈希值是允许重复的.
如果要自己定义哈希值的计算规则, 比如根据对象的属性计算哈希值, 我们需要重写hashCode
方法.
//重新对应哈希值的计算规则, 如果两个对象的属性值一样, 哈希值也相同.
@Override
public int hashCode() {return name.hashCode() + age;
}
小结:
- 哈希值是一个int数字
- 我们可以将哈希值看成对象的标识,特征码。
- 对象的哈希值允许重复。
- 调用
hashCode
方法可以获取对象的哈希值。 - 如果要自定义哈希值的计算规则,可以重写
hashCode
方法。
可以用快捷键alt + insert
重写hashCode
和equals
方法
hashSet
判断唯一性的过程
- 先比较两个对象的哈希值(调用
hashCode
方法)
如果哈希值不同, 肯定是不同的对象
如果哈希值相同, 不一定是同一个对象 - 如果哈希值相同, 那么还需要使用equals方法
如果equals方法的结果是true, 那么两个对象相同
如果equals方法的结果是false, 那么两个对象不同
java.util.Set
接口和java.util.List
接口一样, 同样继承自Collection
接口, 他与Collection
接口中的方法基本一致, 并没有功能上的扩充, 只是比Collection
接口更加严格了. Set
接口都会以某种规则保证存入的元素不出现重复.
Set
集合有多个子类, 这里我们介绍其中的java.util.HashSet
, java.util.LinkedHashSet
这两个集合.
因为Set接口的无序性, 所以遍历的方式可以采用迭代器, 增强for
HashSet
是根据对象的哈希值来确定元素在集合中的储存位置, 因此具有良好的储存和查找性能, 保证元素唯一性的方式依赖于: hashCode
和equals
方法.
先来一段使用案例:
public class HashSetTest {public static void main(String[] argsr) {HashSet <String> set = new HashSet<>();set.add(new String ("cba"));set.add("abc");set.add("bac");set.add("cba");for (String name : set) {System.out.println(name);} }
}//输出结果
//cba
//abc
//bac
//cba字符串只储存了一个, 说明重复的元素set集合不储存
1. HashSet
集合存储数据的结构
首先要来了解一下什么是哈希表
在JDK8
之前, 哈希表底层采用数组加链表实现, 即使用数组处理冲突, 同一hash值的链表都储存在同一个数组里, 但是位于一个桶中的元素较多, 即hash值相等的元素较多时, 通过key值依次查找的效率较低.
而在JDK8
中, 哈希表存储采用数组加链表加红黑树实现的,
总而言之, JDK8
引入红黑树大程度优化了HashMap
的性能, 那么对于我们来讲, HashSet
集合元素的唯一, 其实是根据对象的hashCode
和equals方法来决定的. 如果我们往集合中存放自定义的对象, 那么保证其唯一, 就必须重写hashCode
和equals
方法建立属于当前对象的比较方式.
2. HashSet
储存自定义类型元素
给HashSet
中存放自定义类型的元素时, 需要重写对象中的hashCode
和equals方法, 建立自己的比较方式, 才能保证HashSet
集合中的对象唯一
代码演示 :
//自定义Student类
public class Student {private String name ;private int age;//get / set 方法@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age &&Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}
创建测试类 :
public class HashSetTest {public static void main(String[] args) {HashSet<Student> stuSet = new HashSet<Student>();Student stu = new Student("于谦", 43);stuSet.add(stu);stuSet.add(new Student("郭德纲", 44);stuSet.add(new Student("于谦", 43));stuSet.add(new Student("郭麒麟", 23));stuSet.add(stu);for(Student stu2 : stuSet) {System.out.println(stu2);}}
}//执行结果:
Student [name=郭德纲, age=44]
Student [name=于谦, age=43]
Student [name=郭麒麟, age=23]
3. LinkedHashSet
我们知道HashSet
保证元素唯一, 可是元素存放进去是没有顺序的, 那么我们要保证有序, 怎么办呢~
在HashSet
下面有一个子类java.util.LinkedHashSet
, 它是链表和哈希值组合的一个数据储存结构
演示代码如下 :
package drafts.drafts2;import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;public class LinkedHashSetTest {public static void main(String[] args) {Set<String> set = new LinkedHashSet<>();set.add("bbb");set.add("aaa");set.add("abc");set.add("bbc");Iterator<String> it = set.iterator();while (it.hasNext()) {System.out.println(it.next());}}
}
怎么定义list_常用的List接口下集合相关推荐
- DateUtil,时区,常用的日期接口
DateUtil,时区,常用的日期接口 背景 这期总结了Java中常用的关于日期和时间的接口,代码在后面的 DateUtil 类中.顺便讨论了一下时区.文章尽量做到精简 表示时间的形式 在 Java ...
- java socket接口文档_Java进阶 - 网络编程、Socket、函数式接口、常用的函数式接口...
1.网络通信协议 网络通信协议:通信协议是对计算机必须遵守的规则,只有遵守这些规则,计算机之间才能进行通信.这就好比在道路中行驶的汽车一定要遵守交通规则一样,协议中对数据的传输格式.传输速率.传输步骤 ...
- SPI接口下的OLED显示
SPI接口下的OLED显示 一.SPI简介: 1.spi: 2.IIC与SPI的区别: 二.程序实现 1.下载文件 2.查看文件以及文件解析 3.显示自己想要的字符 3.1 看看别人如何实现的 3.2 ...
- 常用的函数式接口_Supplier接口
常用函数式接口 JDK提供了大量常用的函数式接口以丰富Lambda的典型使用场景,它们主要在java.util.function 包中被提供. 下面是最简单的几个接口及使用示例. Supplier接口 ...
- java定义list_我的Java Web之路59 - Java中的泛型
本系列文章旨在记录和总结自己在Java Web开发之路上的知识点.经验.问题和思考,希望能帮助更多(Java)码农和想成为(Java)码农的人. 目录 介绍 再谈Java中的类型 为什么需要泛型? J ...
- Android开发:4-3、Activity常用其他API接口、屏幕旋转
Activity常用其他API接口 API 屏幕方向改变的一般实现方法: API 1.onSaveInstanceState方法:在onPause之前调用,调用情形 1.在Activity被覆盖或者退 ...
- 基于JavaWeb平台的常用物联网硬件接口对接代码总结文档_田超凡
基于JavaWeb平台的常用物联网硬件接口对接代码总结文档 ...
- 三分钟了解常用的音频接口
日常生活中,我们每个人都用耳机或者音箱听过不少的歌,大家了解上面的接口都是什么以及不同接口之间的区别吗? 今天给大家介绍一些常用的音频接口,希望大家对音频设备上的接口会有新的认识~ PS:文末可直接查 ...
- mysql schema 保存数据_在MySQL中,所有触发器的定义都保存在information_schema数据库下的()表中。_学小易找答案...
[单选题]如何将英制 的零件转为公制的零件 ( ). [判断题]连续选择边线创建倒角时,不能单独修改某一边线的倒角大小 [判断题]创建筋特征时截面必须是闭和的 [填空题]Hibernate 的会话接口 ...
最新文章
- 七、redis的安装(linux)
- 理解 Delphi 的类(十一) - 深入类中的方法[8] - 抽象方法与抽象类
- Android jdbc连接mysql报错解决方案 (Communications link failure)
- 转发与重定向的使用详解
- 抽象类可用于创建对象吗_野芝麻,见过吗?可用于肺热咳血、血淋、跌打损伤...
- android 中文api 在线测试,android webview测试方法
- asp.net动态加载css
- Snabbdom(虚拟dom-5-patch函数)
- linux的odbc数据库连接失败,在Linux上通过ODBC进行Delphi SQLConnection无法连接到SQL
- C++之实现优先队列
- 以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机...
- VUE中使用CLodop获取打印机列表并打印表格、图片等
- 数字/模拟信号中带宽的含义
- java 幸运大转盘_幸运大转盘抽奖 抽奖算法 程序实现逻辑
- [渝粤教育] 扬州市职业大学 液压与气动技术 参考 资料
- 从水处理速度梯度的公式,复习一下物理学常用公式,擦边爱因斯坦质能方程
- 阿里云视觉智能API,核心技术一站共享!
- (转贴) 《超越自己》
- 汇文系统和一卡通项目的结合
- 通过游戏策划阶段防治游戏外挂(超长)
热门文章
- python布尔测试对象_面试题十九期-测试开发面试题之python系列-这个中~
- 风投报告:2017下半年VR/AR娱乐领域投资额同比上升79% 【52翻译】
- Khronos 在GDC上的信息汇总:Vulkan,OpenXR,WebGL,glTF
- php根据循环条件切换图片,thinkphp 循环显示图片问题!!!~~~~
- 像“毒液”一样的粘液机器人火了,能取出体内异物,穿过1.5mm细缝无压力 | 哈工大港中大...
- 百度Apollo:CTO级无人车大牛不稀缺,我们这也就百八十个吧
- 中国队刷新知识图谱“世界杯”,但点开冠军团队一看,我愣住了
- 贝叶斯神书《统计反思》推出第二版,视频课程同步上线,作者亲自在线答疑...
- 稚晖君自制机械臂,能给葡萄缝针的那种,成本1万块,网友:能把脑子开源一下?...
- 不吹牛,中国车主已经实现了「停车自由」