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被预先定义 ...
随机推荐
- 怎样才能提交一个让开发人员拍手叫好的bug单
怎样才能提交一个让开发人员拍手叫好的bug单 软件测试人员写得最多的文档就是测试用例和BUG,现在测试用例和BUG都没有标准的模板,每个公司使用的缺陷管理工具都有可能不一样,如果你换了一家公司就有可能 ...
- c#链接access数据库
public ActionResult Index() { OleDbDataAdapter db = new OleDbDataAdapter("select * from [user]& ...
- flask 定义数据库关系(多对多)
多对多 我们使用学生和老师来演示多对多关系:每个学生有多个老师,每个老师有多个学生.多对多关系示意图如下: 在实例程序中,Student类表示学生,Teacher类表示老师.在这两个模型之间建立多对多 ...
- pyCharm的第一个项目
首先打开编译器pyCharm 创建一个项目 在location :新建文件夹 在interpreter:指定python解释器的路径 python解释器下载官网: https://www.python ...
- SQLServer “无法对数据库'XX' 执行删除,因为它正用于复制”的解决方法
修改数据库某个字段的长度时出现: “无法修改表.无法对 表'dbo.N_Client_content' 执行 删除,因为它正用于复制.” 不能直接对该数据库进行操作,通过alter 的办法来修改,问题 ...
- CSS: hover选择器的使用
用法1:这个表示的是:当鼠标悬浮在a这个样式上的时候,a的背景颜色设置为黄色 a:hover { background-color:yellow; ...
- Linux下调试.Net core(1):lldb的安装
windows下,我们对于.net程序发生Crash,资源泄露,死锁等问题的分析,有神器windbg,那现在我们的.net core程序运行在linux上时,该怎么进行对对Core Dump文件进行分 ...
- SQLyog 字体设置
新公司连接数据库的工具是SQLyog,我以前使用的一直是Navicat,抱着多学个工具也不亏的想法我也安装了试下,但是SQLyog那紧凑的字体对于近视200度的我来说看着着实难受,在询问了公司前辈之后 ...
- 用jQuery实现参数自定义的文字跑马灯效果
一,明确需求 基本需求:最近在工作中接到一个新需求,简单来说就是实现一行文字从右到左跑马灯的效果,并且以固定的时间间隔进行循环. 原本这是一个很容易实现的需求,但是难点是要求很多参数得是用户可自行设置 ...
- vue-update-表单形式复写方法上传图片
handleSave() { const formData = new FormData(); /* eslint-disable */ for (let key in this.dataInfo) ...