Java语法基础学习DayTen(集合续)
一、集合
1.Set:存储的元素是无序的、不可重复的
(1)无序性:无序性不等于随机性,无序指的是元素在底层存储的位置是无序的。
(2)不可重复性:当向Set中添加相同的元素时,后添加的元素不能添加进去;要求添加进Set的元素所在的类,一定要重写equals()方法和hashCode()方法,从而保证Set中元素的不可重复。
(3)Set中的元素如何存储——哈希算法
当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算该对象的哈希值,此哈希值决定了对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此
位置,若已存在对象,在通过equals()方法比较这两个对象是否相同。
注意:hashCode()和equals()方法要保持一致性,即两个对象通过equals比较的结果是不同,它们通过hashCode()方法得到的哈希值也应该不同。
下面是自定义类Person中的hashCode()方法代码:
class Person{
private String name;
private Integer age; @Override
public int hashCode(){
//return age.hashCode()+name.hashCode();这种方法没有下述的方法的健壮性好
final int prime = ;//31是个质数
int result = ;
result = prime * result + ((age == null)? :age.hashCode());
result = prime * result + ((name == null)? :name.hashCode());//使用了迭代的方法,等号右边的result是上面式子得到的结果。
return result;
}
}
2.LinkedHashSet:使用链表维护了元素添加进集合的顺序,使得元素看起来是以插入的顺序保存的(实际存储是无序的)
(1)特点
LinkedHashSet插入性能略低与HashSet,但在迭代访问Set里的所有元素有很好的性能。(有链表作为索引)
3.TreeSet
(1)特点
A:向TreeSet中添加的元素必须是同一个类的。
B:可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历,如String按“ABCD...”的顺序。
Set set = new TreeSet();
set.add(new String("AA"));
set.add(new String("JJ"));
set.add(new String("MM"));
set.add(new String("GG"));
set.add(new String("BB")); for(Object obj: set){
System.out.println(obj);//按英文顺序输出AA,BB,GG,JJ,MM
}
C:当向TreeSet中添加自定义类的对象时,有两种排序方法:自然排序;定制排序
D:自然排序:要求自定义类实现java.lang.Comparable接口并重写其CompareTo(Object obj)的方法,在此方法中指明按自定义类的哪种属性进行排序。
向TreeSet添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然只是进行比较的两个属性值相同,但程序会认为这两个对象相同,后一个对象不能添加进来,所以要保证
compareTo()与hashCode()以及equals()的一致性。
class Person implements Comparable{
private String name;
private Integer age;
@Override
public int compareTo(Object obj){
if(obj instanceof Person){
Person p = (Person)obj;
int i = this.age.compareTo(p.age);
if(i == ){
return this.name.compareTo(p.name);
}else{
return i;//返回值加一个负号则顺序按从大到小排列
}
}
return ;
}
} public void test(){ Set set = new TreeSet();
//当Person类没有实现Comparable接口时,向TreeSet添加Person对象,会报ClassCastException
set.add(new Person("AA",));
set.add(new Person("JJ",));
set.add(new Person("MM",));
set.add(new Person("GG",));
set.add(new Person("BB",));
for(Object obj: set){
System.out.println(obj);//Person[name=BB,age=12],Person[name=JJ,age=13],Person[name=MM,age=14],
//Person[name=AA,age=16],Person[name=GG,age=16]
}
}
E:定制排序:要保证compare()与hashCode()以及equals()的一致性。
public void test(){
//1.创建一个实现了Comparator接口的类对象
Comparator com = new Comparator(){
//向TreeSet中添加Person类的对象,在此compare()方法中,指明按照Person的哪个属性排序
@Override
public int compare(Object obj1,Object obj2){
if(obj1 instanceof Person && obj2 instanceof Person){
Person p1 = (Person)obj1;
Person p2 = (Person)obj2;
int i = p1.getAge().compareTo(p2.getAge());
if(i == ){
return p1.getName().compareTo(p2.getName());
}else{
return i;
}
}
return ;
}
}
//2.将此Comparator对象作为形参传递给TreeSet的构造器中
TreeSet set = new TreeSet(com);
//也可以直接在形参创建匿名的Comparator对象
// TreeSet set = new TreeSet(new Comparator(){
// public int compare(Object o1,Object o2){
// 比较的代码
// }
// });
//3.向TreeSet中添加Comparator接口中的compare()方法涉及的类的对象
set.add(new Person("AA",));
set.add(new Person("JJ",));
set.add(new Person("MM",));
set.add(new Person("GG",));
set.add(new Person("BB",));
}
Java语法基础学习DayTen(集合续)的更多相关文章
- Java语法基础学习DayNine(Java集合)
一.Java集合 1.概述 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就需要对对象进行存储.另一方面,使用Array存储对象具有一些弊端,而Java集合就像一种容器, ...
- Java语法基础学习DayTwenty(反射机制续)
一.Java动态代理 1.代理设计模式的原理 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上. 2. ...
- Java语法基础学习DaySeventeen(多线程续)
一.线程的特点 1.线程的分类 java中的线程分为两类:守护线程和用户线程.唯一的区别是判断JVM何时离开. 守护线程是用来服务用户线程的,通过在start()方法前调用Thread.setDaem ...
- Java语法基础学习DayFifteen(IO续)
一.缓冲流(处理流的一种) 1.作用:可以提高文件操作的效率 2.使用BufferedInputStream和BufferedOutputStream实现非文本文件的复制 特点:flush()方法 代 ...
- Java语法基础学习DaySeven
---恢复内容开始--- 一.包装类——Wrapper 1.定义:针对八种基本数据类型定义相应的引用类型——包装类(封装类) boolean——Boolean byte——Byte ...
- Java语法基础学习DayEighteen(常用类)
一.String类 1.特点 String代表不可变的字符序列,底层用char[]存放. String是final的. 2.内存解析 3.常用方法 int length() char charAt(i ...
- Java语法基础学习DaySix
一.JavaBean——可重用组件 1.JavaBean是指符合以下标准的Java类: (1)类是公共的 (2)有一个无参的公共的构造器 (3)有属性,且有对应的get.set方法 2.好处 用户可以 ...
- Java语法基础学习DayThree
一.流程控制语句补充 1.switch语句 格式: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; ... default: 语句体 ...
- Java语法基础学习DayTwentyOne(网络编程)
一.IP地址和端口号 1.作用 通过IP地址,唯一的定位互联网上一台主机. 端口号标识正在计算机上运行的进程,不同进程有不同的端口号,被规定为一个16位的整数0~65535,其中0~1023被预先定义 ...
随机推荐
- DataGridView 访问任意行不崩溃
int index= this.dataGridView1.rows.Add(); 先执行这行代码,然后访问任意行,不崩溃, 赋值不存在的行,只是不显示,或者无值. 什么原理呢? 一些其他 priva ...
- Android内存泄漏的检测流程、捕捉以及分析
https://blog.csdn.net/qq_20280683/article/details/77964208 Android内存泄漏的检测流程.捕捉以及分析 简述: 一个APP的性能,重度关乎 ...
- 定位bug的基本要求
很多人觉得qa只是负责发现问题,这个实在太狭隘了,现代qa除了发现问题这种基本功外,定位问题,提出解决方案,提出预防方案也是要掌握的技能.这里先说定位问题的要求,定位问题要向深入,前提当然是对功能.产 ...
- Docker Kubernetes 健康检查
Docker Kubernetes 健康检查 提供Probe探测机制,有以下两种类型: livenessProbe:如果检查失败,将杀死容器,然后根据Pod的重启策略来决定是否重启. readines ...
- Splay详解
平衡树实际很简单的 以下讲解都以Luogu P3369 [模板]普通平衡树为例 我不会带指针的Splay,所以我就写非指针型的Splay Splay是基于二叉查找树(bst)实现的 什么是二叉查找树呢 ...
- 爆料:2019手游折扣app是真福利还是骗人哪个靠谱?
直接上干货.也许你在找寻,安全的手游折扣App,稳定的手游折扣App,不断续充的折扣App,续充不涨价的折扣App,网上的内容太多,难以分辨.那么看这个可以直接给你答案 1.历史(2004年成立,15 ...
- (转载)Unity UGUI点击不同Button执行不同的方法(无参方法)
将脚本随意挂在任何位置 但是这个btnParent一定是 按钮的父节点 脚本很简单自己敲一遍就全都明白了 上脚本 OnClickTest using UnityEngine; using Un ...
- 【转载】Xpath定位方法深入探讨及元素定位失败常见情况
一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...
- vue-先渲染dom载执行js
价格判断v-if=“dataList”有数据的时候才渲染
- 揭示牌面使之升序 Reveal Cards In Increasing Order
2019-03-27 14:10:37 问题描述: 问题求解: 模拟题.考虑角度是从结果来进行反推. input - [2,3,5,7,11,13,17] (just sort the input t ...