一:集合了解

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

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

(二)集合接口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. Ionic3实现选项卡切换可以重新加载echarts

    要求 选项卡每切换一次,就加载对应的一个echarts 图,要有一开始的动画效果效果如下: 注意点 1.echarts要想每次都能重新加载,需要移除"_echarts_instance_&q ...

  2. MT【251】椭圆中的好题

    已知直线$l:x+y-\sqrt{3}=0$过椭圆$E:\dfrac{x^2}{a^2}+\dfrac{y^2}{b^2}=1,(a>b>0)$的右焦点且与椭圆$E$交于$A,B$两点,$ ...

  3. 【题解】 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)

    题面戳我 Solution 二分图是显然的,用二分图匹配显然在这个范围会炸的很惨,我们考虑用霍尔定理. 我们任意选取穿\(l,r\)的号码鞋子的人,那么这些人可以穿的鞋子的范围是\(l,r+d\),这 ...

  4. 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)

    题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...

  5. CodeForces 97 E. Leaders(点双连通分量 + 倍增)

    题意 给你一个有 \(n\) 个点 \(m\) 条边的无向图,有 \(q\) 次询问,每次询问两个点 \(u, v\) 之间是否存在长度为奇数的简单路径. \(1 \le n, m, q \le 10 ...

  6. 小程序-camera

    camera 使用这个组件使用手机的拍摄功能.实现如下操作 打开拍摄画面,在手机上半屏显示拍摄取景,下面有一个拍摄按钮.点击后,取景器位置显示拍摄画面,下面显示确定取消按钮. 确定后,下方的预览图片列 ...

  7. Windows下安装flask虚拟环境

    前提 已经安装好python2.x或者pyhton3.x的条件下,使用pip包管理工具 flask框架就不作介绍直接安装 开始安装 1. 命令窗口下: 进入windows的命令窗口有三种方式: 第一种 ...

  8. 【P2303】Longge的问题

    题目大意:求\[\sum\limits_{i=1}^ngcd(n,i)\] 题解:发现 gcd 中有很多是重复的,因此考虑枚举 gcd. \[\sum\limits_{i=1}^ngcd(n,i)=\ ...

  9. C# http请求带请求头部分

    直接上代码 前台调用: <script type="text/javascript"> function zLoginCheck() { var Account = ' ...

  10. Flask 键盘事件

    <div class="container" style="margin-top: 300px; "> <div class="ro ...