• 单列集合:Collection

    • Set:无序,不可重复

    • List:

      • 有序,可以重复。速度快,因为底层维护的是数组,数组的内存地址是连续的,所以查询的时候快,但是移动的效率低,因为增删的时候需要判断原数组长度是否够用,如果不够,需要将旧的数组拷贝到新的数组中!
      • 适合于查询多余增删的情况
  • 双列集合:Map


1.Set

1.2HashSet

  • HashSet的内部是维护一个Object数组

  • 当每次添加的时候,先调用HashCode获取道哈希值,通过这个值进行位运算,获得在哈希表中位置:

    • 如果没有元素在这个位置,那么直接存储

    • 如果有元素存在这个位置,那么调用equals方法,,返回false才添加

  • 哈希表每个元素位置维护一个哈希桶,所以在同一个哈希表元素位置可以添加多个存储对象

TreeSet

TreeSet内部是一个红黑树,所以TreeSet可以实现自动排序,分为两种情况:

  • 自然元素:自动实现排序,不需要特别调整。但是需要注意的是对字符串的排序

    • 如果找到相同的字符串,那么从不同位置的字符串开始比较

    • 如果找不到相同的字符串,那么以长度来比较

  • 非自然元素:

    • 实现Comparable 接口,并且重写这个接口的Comparable To方法。
package per.liyue.code.treeset;
public class User implements Comparable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
} @Override
public String toString() {
// TODO Auto-generated method stub
return "{id:" + this.id + " name:" + this.name + "}";
} @Override
public int compareTo(Object o) {
// TODO Auto-generated method stub
User com = (User)o;
return this.id - com.id;
}
}
package per.liyue.code.treeset;
import java.util.TreeSet;
public class MainPrint {
public static void main(String[] args){
//实现Comparable接口
TreeSet<User> mytreeSet = new TreeSet<>();
User u1 = new User();
u1.setId(3);
u1.setName("z"); User u2 = new User();
u2.setId(1);
u2.setName("f"); User u3 = new User();
u3.setId(2);
u3.setName("b"); mytreeSet.add(u1);
mytreeSet.add(u2);
mytreeSet.add(u3); System.out.println(mytreeSet);
}
}
*实现Comparator 接口实现比较器,并且在创建TreeSet时候传入这个比较器

   比较器格式为:
public class 类名 implements Comparator {
//..... }
package per.liyue.code.treeset;
import java.util.Comparator;
public class MyComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
if ((o1 instanceof User) && (o2 instanceof User)) {
User u1 = (User)o1;
User u2 = (User)o2;
return u1.getId() - u2.getId();
}
return 0;
} }
package per.liyue.code.treeset;
import java.util.TreeSet;
public class MainPrint {
public static void main(String[] args){
//实现Comparator接口
MyComparator c = new MyComparator();
//带参构造
TreeSet<User> mytreeSet2 = new TreeSet<>(c);
User u11 = new User();
u11.setId(3);
u11.setName("z"); User u22 = new User();
u22.setId(1);
u22.setName("f"); User u33 = new User();
u33.setId(2);
u33.setName("b"); mytreeSet2.add(u1);
mytreeSet2.add(u2);
mytreeSet2.add(u3); System.out.println(mytreeSet2);
}
}

推荐使用比较器,并且在一个类即实现比较接口又实现比较器的时候,以比较器为准!

比较器和比较接口中如果返回0表示重复,不能添加成功,负整数为小元素,正整数位大元素


2.List

2.1ArrayList

  • 底层维护了一个Object数组

    *它的无参构造创建一个对象时候,其底层维护的Object数组默认10,长度不够时候自动增加0.5倍

2.1.1ArrayList和Vector的区别

  • 二者内部都是维护一个Object数组来实现
  • ArrayList是线程不安全,Vector线程安全。但是后者版本从JDK1.0开始,已经被淘汰。

2.2LinkedList

  • 链表实现

3.Queue


4.各种线性表的性能


5.Map概念


6.各类Map的性能


7.线程安全的集合工具类:Collections



public static void main(String[] args) {
Collection c = Collections.synchronizedCollection(new ArrayList());
List l = Collections.synchronizedList(new ArrayList());
Set s = Collections.synchronizedSet(new HashSet());
Map m = Collections.synchronizedMap(new HashMap());
}

16.Set、List、Queue集合;Map.md的更多相关文章

  1. Java集合的Stack、Queue、Map的遍历

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  2. HashMap和HashSet的使用,区别。集合,Array、Collection(List/Set/Queue)、Map

    HashMap和HashSet的区别 HashMap和HashSet的区别是Java面试中最常被问到的问题.如果没有涉及到Collection框架以及多线程的面试,可以说是不完整.而Collectio ...

  3. 【由浅入深理解java集合】(五)——集合 Map

    前面已经介绍完了Collection接口下的集合实现类,今天我们来介绍Map接口下的两个重要的集合实现类HashMap,TreeMap.关于Map的一些通用介绍,可以参考第一篇文章.由于Map与Lis ...

  4. 「 深入浅出 」集合Map

    系列文章: 「 深入浅出 」java集合Collection和Map 「 深入浅出 」集合List 「 深入浅出 」集合Set 前面已经介绍完了Collection接口下的集合实现类,今天我们来介绍M ...

  5. 《C#本质论》读书笔记(16)构建自定义集合

    16.1 更多集合接口 集合类(这里指IEnumerable层次结构)实现的接口层次结构 16.1.1 IList<T>与IDictionary<TKey,TValue> 字典 ...

  6. Java——(六)Collection之Queue集合

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Queue集合 Queue集合用于模拟队列这种数据结构,队列通常是指“先进先出‘(FIFO)的容 ...

  7. (7)Java数据结构--集合map,set,list详解

    MAP,SET,LIST,等JAVA中集合解析(了解) - clam_clam的专栏 - CSDN博---有颜色, http://blog.csdn.net/clam_clam/article/det ...

  8. 14.Java集合简述.md

    Java的集合类别,分为两类Collection和Map,Collenction包含了Set: •Set:无序,不可重复的集合 •List:有序,重复的集合 •Map:具有映射关系的集合 •Queue ...

  9. Java集合—Map

    简介 Map用户保存具有映射关系的数据,因此Map集合里保存着两组数,一组值用户保存Map里的key,另一组值用户保存Map里的value,key和value都可以是任何引用类型的数据.Map的key ...

  10. 20_java之集合Map

    01Map集合概述 A:Map集合概述: 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同  a:Collection中的集合,元素是孤立 ...

随机推荐

  1. 常见的web安全及防护原理

    1.0 sql注入 sql注入原理:就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. sql注入防护: 1.永远不要信任用户的输入,要 ...

  2. Javascript函数心得

    Javascript函数 Javascript函数是由事件驱动的或者当他被调用时执行的可重复使用的代码块.所以说我们光创建了函数不调用是没有啥用的,我们必须得调用它才能执行. 1.什么是函数 (1)函 ...

  3. apt-get 常用命令总结

    apt-get  高级包装工具(英语:Advanced Packaging Tools,简称:APT)是Debian及其衍生发行版(如:ubuntu)的软件包管理器.APT可以自动下载,配置,安装二进 ...

  4. sql生成随机不重复字符串 可指定长度

    存储过程: create procedure dbo.GetRandStr () output) AS BEGIN ), ), @ss varchar DECLARE @I INTEGER, @cou ...

  5. 【Git使用】sourcetree跳过注册的方法(转)

    当前只有Win的版本,Mac自行百度(笑) 很多人用git命令行不熟练,那么可以尝试使用sourcetree进行操作. 然鹅~~sourcetree又一个比较严肃的问题就是,很多人不会跳过注册或者操作 ...

  6. mysql之pymsql的使用

    # -*- coding:utf-8 -*- import pymysql user = input('请输入用户名:') pwd = input('请输入密码:') # 1.连接 conn = py ...

  7. ES6,变量,函数-参数,结构赋值

    变量 var 1.可以重复声明. 无法限制修改-, 没有块级作用域 let不能重复声明,变量-可以修改,块级作const不能重复声明,常量-不能修改,块级作 函数——箭头函数function 名字() ...

  8. Ruby学习笔记4: 动态web app的建立

    Ruby学习笔记4: 动态web app的建立 We will first build the Categories page. This page contains topics like Art, ...

  9. 最好的ie版本检测方式

    预备知识:NodeList的实时性 通过 document.getElementsByTagName,document.forms ,document.images  等方法获取到nodelist以后 ...

  10. Java,Hello World,《算法》环境搭建中的问题,用 cmd 和 IntelliJ Idea 分别编译和运行 Java 程序

    ▶ IntelliJ idea 下载和安装(http://www.jetbrains.com/idea/) ▶ 新建项目(如图),注意选择 SDK 类型和位置 ● 在 src 目录中新建一个 Pack ...