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被预先定义 ...
随机推荐
- C#异步编程基础入门总结
1.前言 *.NET Framework提供了执行异步操作的三种模式: 异步编程模型(APM)模式(也称为IAsyncResult的模式),其中异步操作要求Begin和End方法(例如,BeginWr ...
- URL与视图
path函数 path函数的定义为:path(route,view,name=None,kwargs=None).以下对这几个参数进行讲解. route 参数 url的匹配规则.这个参数中可以指定ur ...
- activiti5/6 系列之--BpmnModel使用
BpmnModel对象,是activiti动态部署中很重要的一个对象,如果BpmnModel对象不能深入的理解,那可能如果自己需要开发一套流程设计器,使用bpmn-js使用前端或者C/S展现流程流转而 ...
- ★Pandas 零碎知识
1 修改属性 1.1 修改1列的类型属性: df['总金额'] = pd.to_numeric(df['总金额']) #转变dataframe的1列为数值型 1.2 多列设为数值型:(使用DataFr ...
- UI自动化(五)dom
获取标签 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 // 直接获取标签 document.getEleme ...
- 使用python玩跳一跳亲测使用步骤详解
玩微信跳一跳,测测python跳一跳,顺便蹭一蹭热度: 参考博文 使用python玩跳一跳超详细使用教程 WIN10系统,安卓用户请直入此: python辅助作者github账号为:wangshub. ...
- 王之泰201771010131《面向对象程序设计(java)》第八周学习总结
第一部分:理论知识学习部分 第六章 第六章知识点主要分为1. 接口 2. lambda表达式 3. 内部类 4. 代理 1. 接口 1) Java为了克服单继承的缺点,Java使用了接口, 一个类可以 ...
- CF438E The Child and Binary Tree
思路 设F(x)的第x项系数为权值和为x的答案 题目中要求权值必须在集合中出现,这个不好处理,考虑再设一个C,C的第x项如果是1代表x出现在值域里,如果是0,代表x没有出现在值域里,然后由于二叉树可以 ...
- MVC 深入讲解Routing _路由规则【八】
一.客户端=>控制器 在项目中我们引用了system.web.routing, 如果第一个匹配成功了,那么后面的都不会再匹配. 1. routing的作用: 确定colltroller,确定ac ...
- DAY9 函数
一.脚本文件的执行 1.存放当前文件作为脚本文件执行的参数们:[‘当前文件的绝对路径’,手动传入的参数们] 2.脚本文件执行:直接用python解释器运行该文件 print(sys.argv) # ...