一:集合了解

(一)确定性,互异性,无序性

确定性:对任意对象都能判定其是否属于某一个集合
互异性:集合内每个元素都是无差异的,注意是内容差异
无序性:集合内的顺序无关

(二)集合接口HashSet,TreeSet,LinkedHashSet

–HashSet (基于散列函数的集合,无序,不支持同步)
–TreeSet (基于树结构的集合,可排序的,不支持同步)
–LinkedHashSet(基于散列函数和双向链表的集合,可排序的,不支持同步

二:HashSet

(一)基础方法

–基于HashMap实现的,可以容纳null元素, 不支持同步
Set s = Collections.synchronizedSet(new HashSet(...));
–add 添加一个元素
–clear 清除整个HashSet
–contains 判定是否包含一个元素
–remove 删除一个元素 size 大小
–retainAll 计算两个集合交集

(二)HashSet实现

        HashSet<Integer> hs = new HashSet<Integer>();    //<>是泛型编程,类似于C++模板

        hs.add(null);
hs.add();
hs.add();
hs.add();
hs.add();
hs.add();
hs.add(); System.out.println(hs.size());
if(!hs.contains()) {
hs.add();
} System.out.println(hs.size());
hs.remove(4);  //存在,则删除,不存在,则不操作 for(Integer item : hs) {
System.out.println(item);
}

null  //无序性
10000
1010
3
22
6

(三)性能测试:因为无序性,无索引操作。for效率高

    public static void trverseByIterator(HashSet<Integer> hs) {
//使用迭代器遍历
System.out.println("==========迭代器遍历===========");
long startTime = System.nanoTime(); //获取开始时间,以纳秒为单位返回正在运行的Java虚拟机的高分辨率时间源的当前值。
Iterator<Integer> iter = hs.iterator(); //获取迭代指针
while(iter.hasNext()) {
iter.next();
}
long endTime = System.nanoTime();
long duration = endTime-startTime;
System.out.println("iterator使用纳秒:"+duration);
} public static void trverseByFor(HashSet<Integer> hs) {
//使用迭代器遍历
System.out.println("==========for索引遍历===========");
long startTime = System.nanoTime(); //获取开始时间,以纳秒为单位返回正在运行的Java虚拟机的高分辨率时间源的当前值。
for(Integer item : hs) {
;
}
long endTime = System.nanoTime(); //获取开始时间,以纳秒为单位返回正在运行的Java虚拟机的高分辨率时间源的当前值。
long duration = endTime-startTime;
System.out.println("for使用纳秒:"+duration);
}
==========迭代器遍历===========
iterator使用纳秒:
==========for索引遍历===========
for使用纳秒:

(四)retainAll交集测试

        //测试交集
HashSet<String> hs1 = new HashSet<String>();
HashSet<String> hs2 = new HashSet<String>(); hs1.add("a");
hs1.add("b");
hs1.add("c"); hs2.add("c");
hs2.add("d");
hs2.add("e"); hs1.retainAll(hs2); //将交集保存在hs1中
for(String item : hs1) {
System.out.println(item);
}
c

三:LinkedHashSet(与HashSet一致)

–继承HashSet,也是基于HashMap实现的,可以容纳null元素,按照插入顺序有序
–不支持同步
Set s = Collections.synchronizedSet(new LinkedHashSet(...));
–方法和HashSet基本一致
add, clear, contains, remove, size
–通过一个双向链表维护插入顺序

四:TreeSet

(一)基本方法

–基于TreeMap实现的,不可以容纳null元素,不支持同步
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
–add 添加一个元素
–clear 清除整个TreeSe
–contains 判定是否包含一个元素
–remove 删除一个元素 size 大小
–根据compareTo方法或指定Comparator排序

(二)实现(有序,会自动排序,红黑树)

        TreeSet<Integer> ts = new TreeSet<Integer>();    //<>是泛型编程,类似于C++模板

        ts.add();
ts.add();
ts.add();
ts.add();
ts.add(); if(!ts.contains()) {
ts.add();
}
        for(Integer item : ts) {
System.out.println(item);;
}

(三)性能测试:for更加高效

==========迭代器遍历===========
iterator使用纳秒:
==========for索引遍历===========
for使用纳秒:

五:HashSet, LinkedHashSet, TreeSet对象比较(元素重复)《重点》

(一)HashSet和LinkedHashSet判定元素重复的原则

–判定两个元素的hashCode返回值是否相同,若不同,返回false
–若两者hashCode相同,判定equals方法,若不同,返回false;否则返回true。
–hashCode和equals方法是所有类都有的,因为Object类有
比较之前会先调用hashCode,之后是equals方法

1.正常执行,含重复

class Dog{
int age; public Dog(int a) {
this.age=a;
} }
public class CompareTest {
public static void main(String[] args) {
Dog d1=new Dog();
Dog d2=new Dog();
HashSet<Dog> hs=new HashSet<Dog>();
hs.add(new Dog());
hs.add(new Dog());
hs.add(new Dog());
hs.add(new Dog());
hs.add(new Dog()); System.out.println(hs.size());
}
}

Dog类本身没有hashCode方法,继承于Object,而Object类的hashCOde会返回对象信息和内存地址经过运算后的一个值。两个不同对象,其值必然不一致

2.实现对象的hashCode方法和equals方法实现去重

import java.util.*;

class Dog{
int age; public Dog(int a) {
this.age=a;
} public int getAge() {
return this.age;
} public int hashCode() {
System.out.println("hashCode exec...");
return this.age;
} public boolean equals(Object obj2) {
System.out.println("equals exec...");
if(==this.age-((Dog)obj2).getAge())
return true;
else
return false;
}
}
public class CompareTest {
public static void main(String[] args) {
Dog d1=new Dog();
Dog d2=new Dog();
HashSet<Dog> hs=new HashSet<Dog>();
hs.add(new Dog());
hs.add(new Dog());
hs.add(new Dog());
hs.add(new Dog());
hs.add(new Dog()); System.out.println(hs.size());
}
}
hashCode exec...
hashCode exec...
hashCode exec...
hashCode exec...
equals exec...
hashCode exec...
equals exec...
3  //去重实现
先执行hashCode,只有hashCode通过,才会执行equals方法
    public String toString() {
System.out.println("toString exec...");
return age+"";
}
要保持equals,hashCode和toString三位一体。都应该各自相同

(二) TreeSet去重

添加到TreeSet,需要实现Comparable接口,即实现compareTo方法
与hashCode和equals无关,只与compareTo有关
import java.util.*;

class Dog implements Comparable{
int age; public Dog(int a) {
this.age=a;
} public int getAge() {
return this.age;
} public int hashCode() {
System.out.println("hashCode exec...");
return this.age;
} public boolean equals(Object obj2) {
System.out.println("equals exec...");
if(==this.age-((Dog)obj2).getAge())
return true;
else
return false;
} public String toString() {
System.out.println("toString exec...");
return age+"";
} public int compareTo(Object obj2) {
System.out.println("compareTo exec...");
return this.age - ((Dog)obj2).getAge();
}
}
public class CompareTest {
public static void main(String[] args) {
Dog d1=new Dog();
Dog d2=new Dog();
TreeSet<Dog> hs=new TreeSet<Dog>();
hs.add(new Dog());
hs.add(new Dog());
hs.add(new Dog());
hs.add(new Dog());
hs.add(new Dog()); System.out.println(hs.size());
}
}
compareTo exec...
compareTo exec...
compareTo exec...
compareTo exec...
compareTo exec...
compareTo exec...
compareTo exec...
compareTo exec...
可以知道,去重和hashCode与equals无关,不执行。而是直接去找compareTo方法

六:总结

(一)HashSet, LinkedHashSet, TreeSet的元素都只能是对象

会进行自动装箱

(二)HashSet和LinkedHashSet判定元素重复的原则《重点》

–判定两个元素的hashCode返回值是否相同,若不同,返回false
–若两者hashCode相同,判定equals方法,若不同,返回false;否则返回true。
–hashCode和equals方法是所有类都有的,因为Object类有

(三)TreeSet判定元素重复的原则《重点》

–需要元素继承自Comparable接口
–比较两个元素的compareTo方法

(四)注意:对于基本类型的包装类。本来就实现了compareTo接口和其他比较方法,所以HashSet,LinkedHashSet,TreeSet中对于包装类是默认去重的

JAVA核心技术I---JAVA基础知识(集合set)的更多相关文章

  1. 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承

    <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...

  2. Java核心技术 卷1 基础知识-第一天

    基本数据类型 java是一种强数据类的的语言 共有8种基本数据类型 其中: 整型4种 int(4字节) short(2字节) long(8字节) byte(1字节) java中整型的范围与机器无关 长 ...

  3. [Java面试三]JavaWeb基础知识总结.

    1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...

  4. Java中浮点数的基础知识

    偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...

  5. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

  6. java 程序运行的基础知识【Java bytecode】

    聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...

  7. Java Script 学习笔记 -- 基础知识

    Java script 概述 java Script 的简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为 ...

  8. Java学习1——计算机基础知识

    本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.

  9. JAVA面试题相关基础知识

        1.面向对象的特征有哪些方面 ①抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节 ...

  10. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

随机推荐

  1. 基于FPGA的16阶级联型iir带通滤波器实现

    警告 此文章将耗费你成吨的流量,请wifi下阅读,造成的流量浪费本人不承担任何责任.初版源代码获取(请勿用作他用,仅供学习):https://gitee.com/kingstacker/iir.git ...

  2. 【BZOJ5314】[JSOI2018]潜入行动(动态规划)

    [BZOJ5314][JSOI2018]潜入行动(动态规划) 题面 BZOJ 洛谷 题解 不难想到一个沙雕\(dp\),设\(f[i][j][0/1][0/1]\)表示当前点\(i\),子树中一共放了 ...

  3. [luogu4005]小Y和地铁【搜索+树状数组】

    传送门:https://www.luogu.org/problemnew/show/P4005 最简单的暴力拿最高的分,二进制爆搜. #include <bits/stdc++.h> #d ...

  4. [JSOI2008]魔兽地图(树形dp)

    DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Ancients) Allst ...

  5. Redis主从复制与高可用方案

    redis简单介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis与其他key – value缓存产品有以下三个特点: 支持数据的持久化,可以将内存中 ...

  6. LOJ#2722 情报中心

    解:有个暴力是枚举两条链然后O(n)判定,可以得到15分. 还可以优化一下,枚举一条链,然后第二条链直接求两端点树上带权距离.可以做到O(m(n + m)),但是我用的树剖,跟上面那一档没啥区别Orz ...

  7. A1128. N Queens Puzzle

    The "eight queens puzzle" is the problem of placing eight chess queens on an 8×8 chessboar ...

  8. A1087. All Roads Lead to Rome

    Indeed there are many different tourist routes from our city to Rome. You are supposed to find your ...

  9. Nlog 简单的快速攻略

    废话不多说直接进入正题. 1.在项目中加入Nlog的应用 安装后会出现两个文件 2.我们打开Nlog.config配置文件设置日志记录 <?xml version="1.0" ...

  10. 关于dp(背包)

    有关背包,我这几天可是尽受其苦(不得不靠我聪颖的背诵代码的大脑来进行一波操作) Step 1      01背包 关于01背包的主要代码: ;j<=m;j++) { for(int i=n;i& ...