Set 集合

一、HashSet按照Hash算法存储集合元素(hashCode方法获取hashCode值,根据hashCode值获取元素位置,通过equals判断对象是否相等并且hashCode值是否相等),因此具有很好的查找和存取的性能。排列顺序不固定,非线程安全,集合元素可以为空,不允许重复。

二、LinkedHashSet(HashSet子类)链表维护元素次序(因此插入,删除性能低于HashMap),迭代访问Set里的全部元素性能较好,不允许重复。

三、iterator(foreach)迭代某个集合时,迭代内集合不可以remove操作集合本身,但是可以通过iterator的remove方法移除集合元素。

四、TreeSet(SortedSet) 按照自然排序和定制排序排序。默认采用自然排序(升序)。对象添加到TreeSet时,该对象必须实现Comparable接口,否则ClassCastException异常。

五、TreeSet结合判断两个对象是否相等的唯一标准是:两个对象通过compareTo方法比较是否返回0。、

六、TreeSet自然排序,元素必须实现Comparable接口  TreeSet ts = new TreeSet();  ts.add(new Student());  Student 类必须实现Comparable;

//对象类
public class Father implements Comparable<Father> {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Father() {
System.out.println("父类无参构造");
}
public Father(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Father [name=" + name + ", age=" + age + "]";
} @Override
public int compareTo(Father o) {
Father father = o;
return this.name.compareTo(father.getName());
} } //验证排序
@Test
public void method2(){
TreeSet<Father> fathers = new TreeSet<>();
fathers.add(new Father("a",10));
fathers.add(new Father("c",10));
fathers.add(new Father("b",10));
for (Father father : fathers) {
System.out.println(father);
}
}
输出结果为
Father [name=a, age=10]
Father [name=b, age=10]
Father [name=c, age=10]

TreeSet自然排序

  TreeSet定制排序,创建集合时,TreeSet ts = new TreeSet ( (o1,o20 -> {   compareTo自定义  });通过Comparator与TreeSet整合完成自定义排序

    @Test
public void method4(){
TreeSet<Father> fathers = new TreeSet<>((x,y)->{
return x.getAge().compareTo(y.getAge());
});
fathers.add(new Father("a",29));
fathers.add(new Father("b",24));
fathers.add(new Father("c",12));
for (Father father : fathers) {
System.out.println(father);
}
}
//输出结果
Father [name=c, age=12]
Father [name=b, age=24]
Father [name=a, age=29] 可以对比上面的自然排序,虽然Father类已经设置了自然排序,但是我在声明Set集合时,声明了定制排序,所以输出结果并没有按照上面自然排序的name来排序,而是按照age来排序的

TreeSet定制排序

七、EunmSet不允许null值。

八、HashSet性能比TreeSet好(特别是最常用的添加,查询等操作),TreeSet(SortedSet实现类)需要额外的红黑树算法来维护元素的次序。

九、Set的三个实现类都是线程不安全的。TreeSet  HashSet EnumSet

List集合

一、List有序集合,有序,List判断对象是否相等,通过equals返回true判断,通过sort方法实现函数式接口Comparator来实现数组排序

二、ArrayList基于数组实现的List类(动态可分配的,超过数组容量,会在底层重新分配一个新的数组来存储数据),ArrayList非线程安全,Vector线程安全,Vector提供一个Stack的子类。

三、Queue 先进先出,PriorityQueue违背了先进先出原则。ArrayDeque实现了Deque接口,它是基于数组的双端队列

四、数组形式保存集合元素的例如ArrayList ,ArrayDeque, 随机访问元素性能较好。LinkedList这种链式存储数据的在删除,插入较快,随机访问元素性能较差;:LinkedList实现了Deque接口,所以是双端队列。

Map

一、HashMap非线程安全,允许key值重复。Hashtable线程安全,不允许key值为空.。判断元素不重复跟Set一样,key值得equals方法返回true,hashCode方法获取的值相等。

二、LinkedHashMap 迭代输出元素时,会按添加key-value的殊勋输出。

三、Properties类是Hashtable的子类,相当于一个key,value都是String类型的Map。

四、TreeMap存储key-value对时,需要根据key对节点进行排序,TreeMap可以保证所有的key-value对处于有序状态,两种排序方式

  自然排序:所有的key必须实现Comparable接口,而且所有的key应该是同一个类的对象。

public class Father implements Comparable<Father> {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Father() {
System.out.println("父类无参构造");
}
public Father(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Father [name=" + name + ", age=" + age + "]";
} @Override
public int compareTo(Father o) {
Father father = o;
return this.name.compareTo(father.getName());
}
} //测试方法
@Test
public void method5(){
Map<Father, String> map = new TreeMap<>();
map.put(new Father("c",23), "父亲3");
map.put(new Father("b",28), "父亲2");
map.put(new Father("a",54), "父亲1"); Set<Father> sets = map.keySet();
for (Father father : sets) {
System.out.println("father对象"+father+"----------father值"+map.get(father));
}
} //输出结果
father对象Father [name=a, age=54]----------father值父亲1
father对象Father [name=b, age=28]----------father值父亲2
father对象Father [name=c, age=23]----------father值父亲3

TreeMap的自然排序

 定制排序:创建TreeMap时传入一个Comparator对象,该对象负责对TreeMap中所有的key进行排序。采用定制排序不要求Map的key实现Comparable接口

    @Test
public void method6(){
Map<Father, String> map = new TreeMap<>((x,y)->{
return x.getAge().compareTo(y.getAge());
});
map.put(new Father("a",54), "父亲1");
map.put(new Father("b",28), "父亲2");
map.put(new Father("c",23), "父亲3"); Set<Father> sets = map.keySet();
for (Father father : sets) {
System.out.println("father对象"+father+"----------father值"+map.get(father));
}
} //输出结果 区别TreeMap的自然排序 这回按照定制的age来排序了
father对象Father [name=c, age=23]----------father值父亲3
father对象Father [name=b, age=28]----------father值父亲2
father对象Father [name=a, age=54]----------father值父亲1

TreeMap的定制排序

Map的集中遍历方式  转载自https://www.cnblogs.com/homeword/p/7396414.html

public class LambdaMap {

    private Map<String, Object> map = new HashMap<>();

    @Before
public void initData() {
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
map.put("key4", 4);
map.put("key5", 5);
map.put("key5", 'h');
} /**
* 遍历Map的方式一
* 通过Map.keySet遍历key和value
*/
@Test
public void testErgodicWayOne() {
System.out.println("---------------------Before JAVA8 ------------------------------");
for (String key : map.keySet()) {
System.out.println("map.get(" + key + ") = " + map.get(key));
}
System.out.println("---------------------JAVA8 ------------------------------");
map.keySet().forEach(key -> System.out.println("map.get(" + key + ") = " + map.get(key)));
} /**
* 遍历Map第二种
* 通过Map.entrySet使用Iterator遍历key和value
*/
@Test
public void testErgodicWayTwo() {
System.out.println("---------------------Before JAVA8 ------------------------------");
Iterator<Map.Entry<String, Object>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Object> entry = iterator.next();
System.out.println("key:value = " + entry.getKey() + ":" + entry.getValue());
}
System.out.println("---------------------JAVA8 ------------------------------");
map.entrySet().iterator().forEachRemaining(item -> System.out.println("key:value=" + item.getKey() + ":" + item.getValue()));
} /**
* 遍历Map第三种
* 通过Map.entrySet遍历key和value,在大容量时推荐使用
*/
@Test
public void testErgodicWayThree() {
System.out.println("---------------------Before JAVA8 ------------------------------");
for (Map.Entry<String, Object> entry : map.entrySet()) {
System.out.println("key:value = " + entry.getKey() + ":" + entry.getValue());
}
System.out.println("---------------------JAVA8 ------------------------------");
map.entrySet().forEach(entry -> System.out.println("key:value = " + entry.getKey() + ":" + entry.getValue()));
} /**
* 遍历Map第四种
* 通过Map.values()遍历所有的value,但不能遍历key
*/
@Test
public void testErgodicWayFour() {
System.out.println("---------------------Before JAVA8 ------------------------------");
for (Object value : map.values()) {
System.out.println("map.value = " + value);
}
System.out.println("---------------------JAVA8 ------------------------------");
map.values().forEach(System.out::println); // 等价于map.values().forEach(value -> System.out.println(value));
} /**
* 遍历Map第五种
* 通过k,v遍历,Java8独有的
*/
@Test
public void testErgodicWayFive() {
System.out.println("---------------------Only JAVA8 ------------------------------");
map.forEach((k, v) -> System.out.println("key:value = " + k + ":" + v));
}
} //通过查看第五种 java源代码,还是通过KeySet()方法实现遍历的。

Map的集中遍历方式

五、WeekHashMap 中每个key对象支持有对实际对象的弱引用,当垃圾回收了该key值所对应的实际对象后,WeakHashMap会自动删除该key对应的key-value.

六、IdentityHashMap实现机制与HashMap基本相似,但它处理两个key相等时比较必须 key1==key2 才行,不像HashMap只需要保证key1.equals(key2)并且他们的hashCode值相等。

七、各类Map性能分析

  1.HashMap 与Hashtable实现机制几乎一样,但是HashMap要快,LinkedHashMap比HashMap慢一点因为要维护底层链表。

  2.TreeMap比HashMap和Hashtable都要慢,因为底层是红黑树实现的,插入删除操作更慢。但是优势是可以排序

  3.EnumMap速度最快但是它只能使用同一个枚举类的枚举值作为key

八、Collections集合操作工具类

  1.synchronizedXXX解决线程安全问题

  2.java9  List.of() Set.of() Map.of()快速创建集合对象。

Set本身不保证顺序这是正确的(它无下标,无位置,必须用迭代器取元素,它只能加 减和删 不能查),但是它的
实现类就一定了(因为子类是父接口的扩展啊),例如:HashSet就无序,但TreeSet它的直接父类是SortedSet,它里面的元
素是有序的(你从它们的名字上就可以看出来),它的排序标准是Comparator
或Comparable 里的compare() 或compareTo()方法(如果TreeSet里要添加的元素是你自己定义的类型话Comparator
和Comparable这两个接口你一定要实现一个,顺便重写里面的方法)

同理Map也是。

java 重新学习 (五)的更多相关文章

  1. java web 学习五(servlet开发1)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  2. Java IO学习--(五)字节和字符数组

    内容列表 从InputStream或者Reader中读入数组 从OutputStream或者Writer中写数组 在java中常用字节和字符数组在应用中临时存储数据.而这些数组又是通常的数据读取来源或 ...

  3. Java开发学习(五)----bean的生命周期

    一.什么是生命周期 首先理解下什么是生命周期? 从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期. bean生命周期是什么? bean对象从创建到销毁的整体过程. bean生命周期 ...

  4. Java基础学习(五)—Collection

    一.Collection概述 1.数组和集合的区别 (1)长度区别      数组长度是固定的,集合长度是可变的. (2)存储内容区别      数组只能存放同一种类型的元素(基本类型/引用类型). ...

  5. JAVA多线程学习五:线程范围内共享变量&ThreadLocal

    一.概念 可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据,就可以实现线程范围内共享相同的变量. 二.代码 Runnable中的run( ...

  6. Java NIO 学习笔记(五)----路径、文件和管道 Path/Files/Pipe

    目录: Java NIO 学习笔记(一)----概述,Channel/Buffer Java NIO 学习笔记(二)----聚集和分散,通道到通道 Java NIO 学习笔记(三)----Select ...

  7. Java IO学习笔记五:BIO到NIO

    作者:Grey 原文地址: Java IO学习笔记五:BIO到NIO 准备环境 准备一个CentOS7的Linux实例: 实例的IP: 192.168.205.138 我们这次实验的目的就是直观感受一 ...

  8. Java开发学习(二十五)----使用PostMan完成不同类型参数传递

    一.请求参数 请求路径设置好后,只要确保页面发送请求地址和后台Controller类中配置的路径一致,就可以接收到前端的请求,接收到请求后,如何接收页面传递的参数? 关于请求参数的传递与接收是和请求方 ...

  9. Java多线程学习(五)线程间通信知识点补充

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  10. java基础学习笔记五(抽象类)

    java基础学习总结——抽象类 抽象类介绍

随机推荐

  1. Java总结之Java简介

    一.序言 1.软件的介绍 软件是指一系列按照特定顺序组织的计算机数据和指令的集合. 2.人机交互 实现人与计算机的交互,主要有两种方式: 图形界面方式(Graphical User Interface ...

  2. 一些关于SEO优化的笔记

    高级搜索指令: 双引号:“xxx” 代表完全匹配的搜索 减号:-(减号前面必须是空格,后面必须没有空格)代表搜索不包含减号后面的词的页面 filetype:用于搜索特定文件格式(百度支持的文件类型:P ...

  3. Scrapy框架: 通用爬虫之CrawlSpider

    步骤01: 创建爬虫项目 scrapy startproject quotes 步骤02: 创建爬虫模版 scrapy genspider -t quotes quotes.toscrape.com ...

  4. ubuntu18.04 -- 创建第一个Django项目

    step1: 安装虚拟环境: sudo pip3 install virtualenv # 安装虚拟环境sudo pip3 install virtualenvwrapper # 安装虚拟环境扩展包# ...

  5. const char *转化为char *的方法

    直接将const char *赋值给char *是错误的,编译器不允许这种操作. #include "stdio.h" #include "string.h" ...

  6. CF963E Circles of Waiting

    Circles of Waiting 求一个整点四连通随机游⾛,离原点距离超过R期望步数.R≤50. 带状矩阵法 本质上就是网格图的随机游走. \[ E_x=\sum_y P_{x,y}E_y+1 \ ...

  7. php操作redis常用方法代码示例

     redis 的连接 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返回:FALSE $redis = new Red ...

  8. pipeline语法之environment,dir(),deleteDir()方法,readJSON,writeJSON

    一 environment指令指定一系列键值对,这些对值将被定义为所有步骤的环境变量或阶段特定步骤 environment{…}, 大括号里面写一些键值对,也就是定义一些变量并赋值,这些变量就是环境变 ...

  9. Concurrent - 线程池

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11426981.html ThreadPoolExecutor底层方法参数: @param corePo ...

  10. Vue.js(五)

    前后端交互概述与URL地址格式 JS中常见的异步调用: 定时任务 ajax 事件函数 接口调用方式: 原生ajax 基于jQuery的ajax fetch axios url 地址格式: 传统的url ...