JAVA核心技术I---JAVA基础知识(集合set)
一:集合了解
(一)确定性,互异性,无序性
确定性:对任意对象都能判定其是否属于某一个集合
互异性:集合内每个元素都是无差异的,注意是内容差异
无序性:集合内的顺序无关
(二)集合接口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)的更多相关文章
- 《Java核心技术·卷Ⅰ:基础知识(原版10》学习笔记 第5章 继承
<Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 目录 <Java核心技术·卷Ⅰ:基础知识(原版10>学习笔记 第5章 继承 5.1 类.超类和子类 5.1 ...
- Java核心技术 卷1 基础知识-第一天
基本数据类型 java是一种强数据类的的语言 共有8种基本数据类型 其中: 整型4种 int(4字节) short(2字节) long(8字节) byte(1字节) java中整型的范围与机器无关 长 ...
- [Java面试三]JavaWeb基础知识总结.
1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供外界访问的Web资源分为: • 静 ...
- Java中浮点数的基础知识
偶然查看Math.round的JDK public static int round(float a) { if (a != 0x1.fffffep-2f) // greatest float val ...
- Java学习之旅基础知识篇:数据类型及流程控制
经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...
- java 程序运行的基础知识【Java bytecode】
聊聊文字,写一篇关于 java 基础知识的博文. JVM 线程栈 到 函数运行 每一个JVM线程来说启动的时候都会创建一个私有的线程栈.一个jvm线程栈用来存储栈帧,jvm线程栈和C语言中的栈很类似, ...
- Java Script 学习笔记 -- 基础知识
Java script 概述 java Script 的简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为 ...
- Java学习1——计算机基础知识
本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.
- JAVA面试题相关基础知识
1.面向对象的特征有哪些方面 ①抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节 ...
- Java学习之旅基础知识篇:面向对象之封装、继承及多态
Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
随机推荐
- 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 ...
- 【XSY2111】Chef and Churus 分块 树状数组
题目描述 有一个长度为\(n\)的数组\(A\)和\(n\)个区间\([l_i,r_i]\),有\(q\)次操作: \(1~x~y\):把\(a_x\)改成\(y\) \(2~x~y\):求第\(l\ ...
- 【XSY1545】直径 虚树 DP
题目大意 给你一棵\(n\)个点的树,另外还有\(m\)棵树,第\(i\)棵树与原树的以\(r_i\)为根的子树形态相同.这\(m\)棵树之间也有连边,组成一颗大树.求这棵大树的直径长度. \(n ...
- CODEFORCES掉RATING记 #5
比赛:Codeforces Round #429 (Div. 2) 时间:2017.8.1晚 这次感觉状态不好,就去打div2了 A:有\(26\)种颜色的气球,每种的数量不一样,你要把这 ...
- java使用Rome解析Rss的实例(转)
Rome简介 Rome是为RSS聚合而开发的开源包,它可以支持0.91.0.92.0.93.0.94.1.0.2.0,可以说rss的版本基本上都支持了. Rss简介 RSS是站点用来和其他站点之间共享 ...
- npm 淘宝源
--------- npm: 淘宝源设置:npm config set registry https://registry.npm.taobao.org
- JVM垃圾收集(Java Garbage Collection / Java GC)
JVM垃圾收集(Java Garbage Collection / Java GC) Java7 Java8 JDK1.8之后将最初的永久代取消了,由元空间取代. 堆内存调优简介 public sta ...
- 自学Python3.4-函数分类(匿名函数)
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- 【转】top命令输出解释以及load average 详解及排查思路
https://blog.csdn.net/zhangchenglikecc/article/details/52103737 昨天nagios报警warning,没来得及留下报警截图,nagios值 ...
- numpy ndarray求其最值的索引
import numpy as np a = np.array([1,2,3,4]) np.where(a== np.max(a)) >>>3 但假设其最值不止一个,如下 a = n ...
