Set常用子类特点
HashSet: 重写 hashCode和equals方法
特点:无序,唯一
底层结构是:
哈希表:元素为链表的数组。综合了链表和数组的好处
add方法:底层实际是依赖于HashCode()和equals()方法
HashSet实际用的是HashMap
public HashSet() {
map = new HashMap<>();
}
案例-HashSet存储自定义对象
出现问题:
重复的元素也被添加了,不能保证元素唯一性
原因:自定义类没有重写HashCode和equals方法;
分析:
(1) 默认继承Object类的HashCode和equals方法,而Object的HashCode值是通过对象
的内部地址值转换为一个整数得到的,不同的对象的地址值不同,进而可以知道转换后
的HashCode值也不可能相同。HashCode值不同就当作不是重复的元素而添加了。
(2)equals方法默认也是比较地址值,如果不重写equals方法,那么不同的对象
比较的结果也一定就是false;将会当作不是重复元素而添加了
解决:重写自定义类的HashCode和equals方法
思考:重写HashCode(),那么HashCode值跟什么有关系呢?
答: 和对象的成员变量值有关系
重写HashCode方法:
就将对象的成员变量值相加:
基本类型:直接相加
引用类型:就加哈希值
// return name.hashCode()+age;
// 代码优化如下
return name.hashCode()+age*31;
注意:判断是否是重复元素步骤:
1-先比较HashCode值:
1-1:如果HashCode值不同:直接添加
1-2:如果HashCode值相同:
1-2-1:继续判断equals方法:
返回false:添加元素
返回true:放弃添加
对于hashCode和equals方法的理解:(新华字典: 即使是在同一页了,也有可能不是同一个元素)
同一页:hashCode值
同一页中同一个元素:hashCode值相同情况下,还要继续采用equals方法判断
二、LinkedHashSet:
底层数据结构是:链表和哈希表
链表保证元素有序
哈希表保证元素唯一
三、TreeSet:
(1)实现Comparable自然排序接口,重写compareTo方法
(2)实现Comparator比较器排序接口,重写compare方法
排序方式:以构造函数确定排序方式
A 无参构造:自然排序
class Student implements Comparable<Student>{
@Override
public int compareTo(Student s){
//按年龄排序
int num=this.age-s.age;
//隐含条件,年龄相同时,应该继续比较姓名
int num2=num==0?this.name.compareTo(s.name):num;
return num2;
}
}
B 有参构造:比较器排序 将自定义的比较器类对象作为构造方法的参数
class MyComparator implements Comparator<Student>{
@Override
public int compare(Student s1,Student s2){
int num=(int)(stu2.getTotal()-stu1.getTotal());
int num2=num==0?stu1.getName().compareTo(stu2.getName()):num;
return num2;
}
}
TreeSet<Student> ts=new TreeSet<Student>(new MyComparator());
---------------------------------------------
字符串的比较
int compareTo(String str):
Set常用子类特点的更多相关文章
- 集合中Set接口与Collection接口,常用子类TreeSet,HashSet.
Set接口与List接口的不同之处在于: 不允许有重复的数据. 定义如下: public interface Set<E>extends Collection<E> 主要方法与 ...
- Set 接口常用子类及其特点
Set 集合中元素不可重复,是无序的(存入和取出的顺序是不一样的), Set 接口中的方法和 Collection 接口一致. 常用子类: HashSet : 内部数据结构是哈希表, 是不同步的 Li ...
- List 接口常用子类及其特点
List 常用子类: - Vector: 内部是数组数据结构,是同步的. 增删, 查询都很慢 - ArrayList: 内部是数组数据结构,是不同步的,替代了 Vector,不同步的效率较高. 特点: ...
- Map集合,Map常用子类
Map 集合 1,Collection中的集合,元素是孤立的,向季和忠储存的元素采用一个元素方式储存 2,Map中的集合,元素是成对存在的,每个元素中的集合称为双列集合 3,Collection中的集 ...
- Map集合概述和Map常用子类
概述java.util.Map接口 Map<K,V> 有两个泛型 类型参数:K - 此映射所维护的键的类型V - 映射值的类型 特点:1.Map集合是双列集合,一个元素包含两个值,一个是k ...
- Map集合和Map常用子类
Map集合 java.util.Map<K,V>集合 Map集合的特点: 1.Map集合是一个双列集合,一个元素包含两个值(Key,Value) 2.Map集合中的元素,key和value ...
- 系统学习 Java IO (十三)----字符读写 Reader/Writer 及其常用子类
目录:系统学习 Java IO---- 目录,概览 Reader Reader 类是 Java IO API 中所有 Reader 子类的基类. Reader 类似于 InputStream ,除了它 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_2_Map常用子类
常用的实现类HashMap 它的子类.LinkedHaspMap
- 17、Map接口及其常用子类(Hashtable、HashMap、WeakHashMap)
17.Map接口 Map没有继承Collection接口,Map提供key到value的映射.一个Map中不能包含相同的key,每个key只能映射一个value.Map接口提供3种集合的视图,Map的 ...
随机推荐
- HDU 6061 RXD and functions
题目链接:HDU-6061 题意:给定f(x),求f(x-A)各项系数. 思路:推导公式有如下结论: 然后用NTT解决即可. 代码: #include <set> #include < ...
- 读书笔记 effective C++ Item 33 避免隐藏继承而来的名字
1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...
- Python [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed 解决方法
一个搭建在SAE上的Django应用,使用新浪微博提供的Python SDK已经稳定运行一年有余,但最近开始持续出现微博认证失败的状况. 摘录微博python SDK的错误提示如下所示: ERROR: ...
- docker centos:latest 使用 sshd
一.术语 1.容器 很多用户在接触Docker 之初都会认为容器就是一种轻量级的虚拟机,但实际上,容器和虚拟机有非常大的区别.从根本形态上来看,容器其实就是运行在操作系统上的一个进程,只不过加入了对资 ...
- jexus linux x64[标准版] - 未集成mono 配置https
一.找到mono安装位置 sudo find / -name mono 二.首先查看“/lib”或“/usr/lib”等系统库文件夹中是否有SSL库文件的名字,该文件名应该是“libssl.so.版本 ...
- SQLAlchemy-对象关系教程ORM-一对多(外键),一对一,多对多
一:一对多 表示一对多的关系时,在子表类中通过 foreign key (外键)引用父表类,然后,在父表类中通过 relationship() 方法来引用子表的类. 在一对多的关系中建立双向的关系,这 ...
- Python *args **kw
当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. *args def fun_var_args(farg, *args): prin ...
- GitHub正式启用声明
0x00 说明 GitHub账号很早之前就已经注册,几经常识都没有能够好好的将这座宝库应用好,实在是汗颜.今天特地将GitHub重新拾起,以后一定要好好使用这个利器,不要荒废了. 0x01 内容 Gi ...
- CF 248B 前缀和
操作1 l r 是原序列l-r的和操作2 l r 是从小到大排序后的l-r的和 input66 4 2 7 2 732 3 61 3 41 1 6output24928 # include <i ...
- Maven使用—拷贝Maven依赖jar包到指定目录
https://blog.csdn.net/u013514928/article/details/77930183