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的更多相关文章

  1. (Set, Map, Collections工具类)JAVA集合框架二

    Java集合框架部分细节总结二 Set 实现类:HashSet,TreeSet HashSet 基于HashCode计算元素存放位置,当计算得出哈希码相同时,会调用equals判断是否相同,相同则拒绝 ...

  2. java 集合框架(二)Iterable接口

    Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...

  3. Java集合框架(二)

    Set Set:无序,不可以重复元素. |--------HashSet:数据结构是哈希表. 线程是非同步的.保证元素唯一性的原理是:判断元素的hashCode值是否相同,如果相同,还会继续判断元素的 ...

  4. (二)java集合框架综述

    一集合框架图 说明:对于以上的框架图有如下几点说明 1.所有集合类都位于java.util包下.Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Ja ...

  5. Java集合框架源码(二)——hashSet

    注:本人的源码基于JDK1.8.0,JDK的版本可以在命令行模式下通过java -version命令查看. 在前面的博文(Java集合框架源码(一)——hashMap)中我们详细讲了HashMap的原 ...

  6. 【集合框架】Java集合框架综述

    一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...

  7. Java集合框架的总结

    本篇文章先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些基本知识和关键点,并结合实例进行简单分析.当我们把一个对象放入集合中后,系统会把所有集合元素都当成Object类的实例进 ...

  8. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  9. 【JAVA集合框架之工具类】

    一.概述 JAVA集合框架中有两个很重要的工具类,一个是Collections,另一个是Arrays.分别封装了对集合的操作方法和对数组的操作方法,这些操作方法使得程序员的开发更加高效. public ...

  10. 【JAVA集合框架之Map】

    一.概述.1.Map是一种接口,在JAVA集合框架中是以一种非常重要的集合.2.Map一次添加一对元素,所以又称为“双列集合”(Collection一次添加一个元素,所以又称为“单列集合”)3.Map ...

随机推荐

  1. Django 之day02,必会知识点

    静态文件配置******* 为什么用户在浏览器中输入的网址能够访问到对应的资源, 前提是后端提前开设该资源的访问,在urls.py文件中进行配置该路由, 如果我的后端没有开设相关的资源,用户是无法访问 ...

  2. 清晰明了的javascript版动态规划

    算法是一种艺术,给人感觉很不好接近,但是一旦你和ta熟络了,你就能发现这门艺术的内在是多么美妙且多变. 对于前端来说,算法也许不是最重要的,在日常工作中,几乎很少用到.所以很多人也不是很感冒. 不过呢 ...

  3. gorm操练记录

    这个数据库的定义蛮全的,先作个记录. package main import ( "time" "github.com/jinzhu/gorm" _ " ...

  4. Ansible-playbook之定义变量

    1.引用变量 # 变量引用方式 "{{ }}" 2.定义变量 (vars) - hosts: web # 定义变量 vars: - play_var: This_is_play_v ...

  5. VisualStudio编译不生成xml、pdb文件的方法

    我们为了减少发布/Release时项目的体积,希望在编译时不生成xml注释文档(包括引用的其他类库),和pdb调试文件 用你喜欢的文本编辑器打开项目.csproj文件,找到PropertyGroup节 ...

  6. python基础(36):pymysql模块

    1. pymysql模块 在使用pymysql模块前需要学习数据库MySQL:<MySQL基础>. 1.1 pymysql的下载和使用 看完MySQL基础,我们都是通过MySQL自带的命令 ...

  7. Flask 特殊装饰器

    请求进入函数之前 before_request # -*- coding: utf-8 -*-   from flask import Flask, session, redirect, reques ...

  8. AssemblyBuilder以及Activator双剑合璧

    AssemblyBuilder和Activator两个类是DispatchProxy类实现动态代理以及AOP的根本,示例demo可参考 DispatchProxy实现动态代理及AOP .Assembl ...

  9. Java异常及异常处理

    如果某个方法不能按照正常的途径完成任务,就可以通过另一种路径退出方法.在这种情况下会抛出一个封装了错误信息的对象.此时,这个方法会立刻退出同时不返回任何值.另外,调用这个方法的其他代码也无法继续执行, ...

  10. 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 ...