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是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
随机推荐
- Ionic3实现选项卡切换可以重新加载echarts
要求 选项卡每切换一次,就加载对应的一个echarts 图,要有一开始的动画效果效果如下: 注意点 1.echarts要想每次都能重新加载,需要移除"_echarts_instance_&q ...
- 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$两点,$ ...
- 【题解】 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)
题面戳我 Solution 二分图是显然的,用二分图匹配显然在这个范围会炸的很惨,我们考虑用霍尔定理. 我们任意选取穿\(l,r\)的号码鞋子的人,那么这些人可以穿的鞋子的范围是\(l,r+d\),这 ...
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- CodeForces 97 E. Leaders(点双连通分量 + 倍增)
题意 给你一个有 \(n\) 个点 \(m\) 条边的无向图,有 \(q\) 次询问,每次询问两个点 \(u, v\) 之间是否存在长度为奇数的简单路径. \(1 \le n, m, q \le 10 ...
- 小程序-camera
camera 使用这个组件使用手机的拍摄功能.实现如下操作 打开拍摄画面,在手机上半屏显示拍摄取景,下面有一个拍摄按钮.点击后,取景器位置显示拍摄画面,下面显示确定取消按钮. 确定后,下方的预览图片列 ...
- Windows下安装flask虚拟环境
前提 已经安装好python2.x或者pyhton3.x的条件下,使用pip包管理工具 flask框架就不作介绍直接安装 开始安装 1. 命令窗口下: 进入windows的命令窗口有三种方式: 第一种 ...
- 【P2303】Longge的问题
题目大意:求\[\sum\limits_{i=1}^ngcd(n,i)\] 题解:发现 gcd 中有很多是重复的,因此考虑枚举 gcd. \[\sum\limits_{i=1}^ngcd(n,i)=\ ...
- C# http请求带请求头部分
直接上代码 前台调用: <script type="text/javascript"> function zLoginCheck() { var Account = ' ...
- Flask 键盘事件
<div class="container" style="margin-top: 300px; "> <div class="ro ...