Java之List和Set
List、Set、数据结构、Collections
初次学习,涉及到List集合,Set集合和数据结构方面的一些知识,有错误还请批评指正
数据结构
数据存储的常用结构有:栈、队列、数组、链表和红黑树。
栈
先进后出(FILO).
队列
先进先出(FIFO).
数组
有序的元素序列,以索引访问.查询快,增删慢.
链表
链式结构,查询慢,增删快.通过地址进行连接.
单向链表:结点包括两个内容,一个是存储元素,一个是下一个元素的地址.
双向链表:结点包括3个部分,前一个元素的存储地址,当前结点存储的元素,后一个元素的存储地址
红黑树
二叉树,查询快.根节点的左边数据小于右边数据.
关于使用java具体实现上面的数据结构以后写,当前只需要了解一下他们的特性就可以.
List集合
java.util.List 接口继承自Collection 接口,是单列集合的一个重要分支,在List集合中允许出现重复的元素,所有的元素是以一种线
性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和
取出顺序一致。(remove(Object obj)只能移除集合中第一个相同的元素)
List集合的特点:
- 元素存储有序.
- 可以存储重复元素
- 有索引,可以通过索引来访问元素
常用的方法有(list的特有方法大都与索引相关):
- public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
- public E get(int index) :返回集合中指定位置的元素。
- public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
- public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
List的子类
- Vector : 线程安全相关
- ArrayList : 底层数组实现
- LinkedList : 链表实现
ArrayList
特有的常用方法:
- int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
LinkedList
java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合。
- 链表结构,查询慢,增删快
- 包含大量操作首尾元素的方法
特有的方法:
public void addFirst(E e) :将指定元素插入此列表的开头。
public void addLast(E e) :将指定元素添加到此列表的结尾。
public void push(E e) :将元素推入此列表所表示的堆栈。等效于addFirst
public E getFirst() :返回此列表的第一个元素。
public E getLast() :返回此列表的最后一个元素。
E get(int index) 返回此列表中指定位置的元素。
public E removeFirst() :移除并返回此列表的第一个元素。
public E removeLast() :移除并返回此列表的最后一个元素。
public E pop() :从此列表所表示的堆栈处弹出一个元素。等效于removeFirst
int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
public boolean isEmpty() :如果列表不包含元素,则返回true。
Vector
这个在使用上和ArrayList基本没有区别,要注意的是二者的区别:
相同点:
- 二者的底层实现都是数组结构.
不同点: - Vector是与线程安全相关的,效率低下.ArrayList是线程不安全的,但是高效.
Set接口
java.util.Set接口特点:
- 不允许存储重复元素
- 无索引(意味着不能用普通for循环遍历)
HashSet
特点:
- 不允许存储重复元素(存储相同的元素在Set中只能保存一个,但程序不会出错)
- 无索引(意味着不能用普通for循环遍历)
- 存储和读取元素无序(顺序可能不一致,在底层Set有他自己的排序规则)
- 底层使用哈希表结构
哈希值:
- int hashCode() 返回对象的哈希码值。
HashSet集合存储数据的结构:
- jdk8之前是:数组 + 链表
- jdk8之后是:数组 + 红黑树(二叉树)
- 数组保存哈希值,存储元素时,哈希值相同的保存在数组的下方.
- 当有多个元素的哈希值相同时(哈希冲突),这个时候保存的时候就会继续向下排列.具体的看下图.
- 当有8个及以上的元素的哈希值相同,链式结构就会转化为红黑树结构.
HashSet如何保证元素唯一?与hashCode()方法与equals()方法相关:
举个例子:
public class HashSet {
public static void main(String[] args) {
Set<String> set = new java.util.HashSet<>();
set.add(new String("abc"));
set.add(new String("abc"));
set.add("abc");
set.add("重地");
set.add("通话");
System.out.println(set); // [重地, 通话, abc]
}
}
重地和通话两个字符串比较特殊,二者的哈希值相同,从这个例子也可以看出String重写了hashCode()和equals()方法.
LinkedHashSet
特点:
- 有序
- 没有索引
- 不可以存储重复元素
哈希表(数组 + 链表/红黑树) + 链表(最后的链表是用来存储存入顺序的)
可变参数
定义格式:
修饰符 返回类型 方法名(参数类型...参数名){}
特点:
- 可变参数底层实现是数组
注意事项:可变参数必须在参数列表的最后一位,一个参数列表只能有一个可变参数.
Collections
工具类特点:
- 构造方法私有.
- 所有的方法和属性静态,直接用类名调用.
常用方法:
public static boolean addAll(Collection c, T... elements) :往集合中添加一些元素。
public static void shuffle(List<?> list) :打乱集合顺序。
public static void sort(List list) :将集合中元素按照默认规则排序。
public static void sort(List list,Comparator<? super T> ) :将集合中元素按照指定规则排
序。
Comparatable与Comparator
Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法
被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现
此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中
的键或有序集合中的元素,无需指定比较器。
Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或
Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或
有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。
二者都存在时,优先使用Comparator.
Comparatable的例子:
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public 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);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
return this.age - o.age;
}
}
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"迪丽热巴","郑爽","李溪芮");
System.out.println(list);
Collections.sort(list);
System.out.println(list);
Comparator的例子:
// 还是上面的实体类
ArrayList<Student> list = new ArrayList<>();
list.add(new Student("Silme",20));
list.add(new Student("Roke",19));
list.add(new Student("Aoke",19));
list.add(new Student("Robin",18));
System.out.println(list);
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// 年龄自然排序
int flag = o1.getAge() - o2.getAge();
// 年龄相同,按照姓名排序
if(flag == 0){
flag = o1.getName().charAt(0)- o2.getName().charAt(0);
}
return flag;
}
});
System.out.println(list);
Java之List和Set的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- Elasticsearch之java的基本操作一
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
- 论:开发者信仰之“天下IT是一家“(Java .NET篇)
比尔盖茨公认的IT界领军人物,打造了辉煌一时的PC时代. 2008年,史蒂夫鲍尔默接替了盖茨的工作,成为微软公司的总裁. 2013年他与微软做了最后的道别. 2013年以后,我才真正看到了微软的变化. ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- Java多线程基础学习(二)
9. 线程安全/共享变量——同步 当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次.这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”. ...
- Java多线程基础学习(一)
1. 创建线程 1.1 通过构造函数:public Thread(Runnable target, String name){} 或:public Thread(Runnable target ...
- c#与java的区别
经常有人问这种问题,用了些时间java之后,发现这俩玩意除了一小部分壳子长的还有能稍微凑合上,基本上没什么相似之处,可以说也就是马甲层面上的相似吧,还是比较短的马甲... 一般C#多用于业务系统的开发 ...
随机推荐
- gulp: Did you forget to signal async completion? 解决方案
背景 学习gulp的前端自动化构建,按照示例代码,跑了一个简单的task,控制台打出如下提示: The following tasks did not complete: testGulp Did y ...
- uptime命令详解
基础命令学习目录首页 users个数和窗口数一致 原文链接:https://www.cnblogs.com/ultranms/p/9253217.html uptime 另外还有一个参数 -V(大写) ...
- partprobe命令详解
基础命令学习目录首页 原文链接:https://www.jb51.net/LINUXjishu/389836.html linux上,在安装系统之后,可否创建分区并且在不重新启动机器的情况下系统能够识 ...
- jenkins配置01--用户添加及权限配置
原文出自:https://www.cnblogs.com/kevingrace/p/6019707.html 下面重点记录下jenkins安装后的一些配置: (1)添加用户权限 jenkins初次登陆 ...
- 通过exp命令对Oracle数据库进行备份操作(提供两种情况的备份:备份本地,备份远程的数据库)
exp 用户名/密码@数据库所在ip地址:数据库端口号/数据库的service-name file=存储到的位置 这个是能成功的 http://www.2cto.com/database/201402 ...
- 10_Java面向对象_第10天(继承、抽象类)_讲义
今日内容介绍 1.继承 2.抽象类 3.综合案例---员工类系列定义 01继承的概述 *A:继承的概念 *a:继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系 *b:在Jav ...
- 深入理解JAVA I/O系列四:RandomAccessFile
一.简述 这个是JDK上的截图,我们可以看到它的父类是Object,没有继承字节流.字符流家族中任何一个类.并且它实现了DataInput.DataOutput这两个接口,也就意味着这个类既可以读也可 ...
- ztree 使用心得
最近项目需要用ztree ,初步研究感觉这个插件写的实在是太好了.现总结遇到的问题 封装一颗树 /** * 按类型分组树 * Id 按类型分组ID * treeId 树ID * treeDivId d ...
- Beta阶段DAY3
一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:尝试改进UI,美化界面. 林庭亦:调整难度设置. 郑子熙:尝试改进UI,美化界面. 陈文俊:调整难度设置. 2 ...
- Beta阶段——3
一.提供当天站立式会议照片一张: 二. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 今天主要是对管理员功能进行改进,解决了Alpha阶段出现的一些问题 (2) 今天计划 ...