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 ...
随机推荐
- Django 之day02,必会知识点
静态文件配置******* 为什么用户在浏览器中输入的网址能够访问到对应的资源, 前提是后端提前开设该资源的访问,在urls.py文件中进行配置该路由, 如果我的后端没有开设相关的资源,用户是无法访问 ...
- 清晰明了的javascript版动态规划
算法是一种艺术,给人感觉很不好接近,但是一旦你和ta熟络了,你就能发现这门艺术的内在是多么美妙且多变. 对于前端来说,算法也许不是最重要的,在日常工作中,几乎很少用到.所以很多人也不是很感冒. 不过呢 ...
- gorm操练记录
这个数据库的定义蛮全的,先作个记录. package main import ( "time" "github.com/jinzhu/gorm" _ " ...
- Ansible-playbook之定义变量
1.引用变量 # 变量引用方式 "{{ }}" 2.定义变量 (vars) - hosts: web # 定义变量 vars: - play_var: This_is_play_v ...
- VisualStudio编译不生成xml、pdb文件的方法
我们为了减少发布/Release时项目的体积,希望在编译时不生成xml注释文档(包括引用的其他类库),和pdb调试文件 用你喜欢的文本编辑器打开项目.csproj文件,找到PropertyGroup节 ...
- python基础(36):pymysql模块
1. pymysql模块 在使用pymysql模块前需要学习数据库MySQL:<MySQL基础>. 1.1 pymysql的下载和使用 看完MySQL基础,我们都是通过MySQL自带的命令 ...
- Flask 特殊装饰器
请求进入函数之前 before_request # -*- coding: utf-8 -*- from flask import Flask, session, redirect, reques ...
- AssemblyBuilder以及Activator双剑合璧
AssemblyBuilder和Activator两个类是DispatchProxy类实现动态代理以及AOP的根本,示例demo可参考 DispatchProxy实现动态代理及AOP .Assembl ...
- Java异常及异常处理
如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下会抛出一个封装了错误信息的对象.此时,这个方法会立刻退出同时不返回任何值.另外,调用这个方法的其他代码也无法继续执行, ...
- C lang:character input and output (I/O)
Xx_Introduction Character input and output is by more line character conpose of the text flow Defin ...