JAVA集合框架(二)-List和Set
List的常用实现类
list集合是有序的,顺序即添加的顺序,元素是可重复的。
- ArrayList
- LinkedList
- Vector
ArrayList
底层基于数组实现。在add元素的过程中,如果超过了数组容量,会自动扩容。
主要特点:随机访问快(数组的特性),但是在中间插入和移除元素时较慢(涉及数组拷贝动作)。
LinkedList
底层基于链表数据结构设计。
主要特点:在中间插入和删除操作快。但是随机访问较慢(需要遍历node指针)。
LinkedList的一些专有方法:
- void addFirst(E e) 将指定元素添加到此集合的开头
- void addLast(E e) 将指定元素添加到此集合的末尾
- E getFirst() 返回此集合的第一个元素
- E getLast() 返回此集合的最后一个元素
- E removeFirst() 删除此集合中的第一个元素
- E removeLast() 删除此集合中的最后一个元素
Vector的实现类似ArrayList。只是Vector是线程安全的。它的大部分方法都加了同步锁synchronized
Set的常用实现类
set集合不保存重复的元素。
- HashSet
- TreeSet
- LinkedHashSet
HashSet
HashSet按照Hash算法存储集合中的元素,具有很好的存取和查找性能。
通过元素的hash()和equals()方法来判断元素是否重复。因此,HashSet中元素的存储顺序是和元素的添加顺序不一样的。
LinkedHashSet
LinkedHashSet是HashSet的子类。使用链表来维护元素的添加次序,因此存储顺序就是元素的添加顺序。
TreeSet
底层元素存储基于红黑树数据结构实现。TreeSet保证了存入集合中的元素处于有序状态。这种有序可以是自然排序和定制排序。
自然排序:
TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后让集合按照升序排列。
加入集合中的元素需要实现Comparable接口,重写compareTo()。
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public void setAge(int age) {
this.age = age;
}
// 按年龄排序
public int compareTo(Person person) {
int ret = (this.age - person.age);
return ret;
}
}
测试类:
public class setMain {
public static void main(String[] args) {
Set<Person> personSet = new TreeSet<Person>();
personSet.add(new Person("张三",10));
personSet.add(new Person("王五",23));
personSet.add(new Person("李四",15));
System.out.println(personSet);
}
}
输出:
[Person [name=张三, age=10], Person [name=李四, age=15], Person [name=王五, age=23]]
定制排序:
如果要定制排序,需要在TreeSet构造器中传入Comparator比较器。
public class NameComparator implements Comparator<Person>{
public int compare(Person person1, Person person2) {
return person1.compareTo(person2);
}
}
测试类:
public class setMain {
public static void main(String[] args) {
Set<Person> set = new TreeSet<Person>(new NameComparator());
set.add(new Person("张三",10));
set.add(new Person("王五",23));
set.add(new Person("李四",15));
System.out.println(set);
}
}
输出:
[Person [name=张三, age=10], Person [name=李四, age=15], Person [name=王五, age=23]]
JAVA集合框架(二)-List和Set的更多相关文章
- (Set, Map, Collections工具类)JAVA集合框架二
Java集合框架部分细节总结二 Set 实现类:HashSet,TreeSet HashSet 基于HashCode计算元素存放位置,当计算得出哈希码相同时,会调用equals判断是否相同,相同则拒绝 ...
- java 集合框架(二)Iterable接口
Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...
- Java集合框架(二)
Set Set:无序,不可以重复元素. |--------HashSet:数据结构是哈希表. 线程是非同步的.保证元素唯一性的原理是:判断元素的hashCode值是否相同,如果相同,还会继续判断元素的 ...
- (二)java集合框架综述
一集合框架图 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Ja ...
- Java集合框架源码(二)——hashSet
注:本人的源码基于JDK1.8.0,JDK的版本可以在命令行模式下通过java -version命令查看. 在前面的博文(Java集合框架源码(一)——hashMap)中我们详细讲了HashMap的原 ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Java集合框架的总结
本篇文章先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析.当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进 ...
- 浅谈JAVA集合框架
浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...
- 【JAVA集合框架之工具类】
一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...
- 【JAVA集合框架之Map】
一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...
随机推荐
- JSP注册登录页教程
转载请标明原文地址:http://www.cnblogs.com/zhangyukof/p/6785258.html 一.准备工作 已搭建好的SSH框架工程一个,如果没有,请参考我的上一篇文章< ...
- 【Java必修课】好用的Arrays.asList也有这三个坑
好用的asList 在开发或写测试用例的过程中,经常会用到Arrays.asList()这个方法,可以快速方便地将数组转化成一个List.例如: List<String> list = A ...
- Linux 的目录结构
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/cbbf47b0-f ...
- 在Windows10中安装与配置Nginx
一.使用环境: Windows 10 1909 nginx 1.16.1 二.安装与配置: 1. 打开链接,http://nginx.org/en/download.html 下载稳定版本nginx ...
- impala-shell导出数据存在中文异常问题
由于查询在impala-shell 中没有问题,在导出数据的时候才有问题,这是impala-shell的客户端是由python编写的,而Python无法自动将unicode对象写入没有设置默认编码的输 ...
- Python--合并2个字典成1个新字典的9种方法
d1 = {'name': 'revotu', 'age': 99} d2 = {'age': 24, 'sex': 'male'} 输出: {'name': 'revotu', 'age': 24, ...
- JS---DOM/BOM---学习road map---7 parts
JS---DOM/BOM---学习road map---6 parts Part 1-2: Part 3-4 part 5-7:
- JS---案例:美女时钟
案例:美女时钟 思路: 打开页面就有图片按每秒1张的顺序轮换,用到了日期对象,获取小时和秒. 封装到一个命名函数后,为了使页面打卡就有图片的轮换,先调用下f1,再设置setInterval <! ...
- Yii2中多表关联查询
准备条件: 1.首先准备两张表: customer(用户表)(id, name) order(订单表)(id, customer_id, price) customer 表和 order 表之间是一对 ...
- C# Parallel 多线程并发
Parallel并发执行多个任务 多线程的,主线程会参与计算---阻塞界面等于TaskWaitAll+主线程计算 常用方法 1.Invoke 尽可能并行执行提供的每个操作 Console.Write ...