一:集合了解

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

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

(二)集合接口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. Python小练习

    1.计算x的n次方 2.计算x的阶乘 3.计算1x1 + 2x2 + 3x3 ...+ NxN之和 def fun(n): s=0 while n > 0: s = s + n*n n = n ...

  2. 【XSY2111】Chef and Churus 分块 树状数组

    题目描述 有一个长度为\(n\)的数组\(A\)和\(n\)个区间\([l_i,r_i]\),有\(q\)次操作: \(1~x~y\):把\(a_x\)改成\(y\) \(2~x~y\):求第\(l\ ...

  3. 【XSY1545】直径 虚树 DP

    题目大意 ​ 给你一棵\(n\)个点的树,另外还有\(m\)棵树,第\(i\)棵树与原树的以\(r_i\)为根的子树形态相同.这\(m\)棵树之间也有连边,组成一颗大树.求这棵大树的直径长度. \(n ...

  4. CODEFORCES掉RATING记 #5

    ​ 比赛:Codeforces Round #429 (Div. 2) ​ 时间:2017.8.1晚 这次感觉状态不好,就去打div2了 ​ A:有\(26\)种颜色的气球,每种的数量不一样,你要把这 ...

  5. java使用Rome解析Rss的实例(转)

    Rome简介 Rome是为RSS聚合而开发的开源包,它可以支持0.91.0.92.0.93.0.94.1.0.2.0,可以说rss的版本基本上都支持了. Rss简介 RSS是站点用来和其他站点之间共享 ...

  6. npm 淘宝源

    --------- npm: 淘宝源设置:npm config set registry https://registry.npm.taobao.org

  7. JVM垃圾收集(Java Garbage Collection / Java GC)

    JVM垃圾收集(Java Garbage Collection / Java GC) Java7 Java8 JDK1.8之后将最初的永久代取消了,由元空间取代. 堆内存调优简介 public sta ...

  8. 自学Python3.4-函数分类(匿名函数)

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  9. 【转】top命令输出解释以及load average 详解及排查思路

    https://blog.csdn.net/zhangchenglikecc/article/details/52103737 昨天nagios报警warning,没来得及留下报警截图,nagios值 ...

  10. numpy ndarray求其最值的索引

    import numpy as np a = np.array([1,2,3,4]) np.where(a== np.max(a)) >>>3 但假设其最值不止一个,如下 a = n ...