一、集合

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(集合续)的更多相关文章

  1. Java语法基础学习DayNine(Java集合)

    一.Java集合 1.概述 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就需要对对象进行存储.另一方面,使用Array存储对象具有一些弊端,而Java集合就像一种容器, ...

  2. Java语法基础学习DayTwenty(反射机制续)

    一.Java动态代理 1.代理设计模式的原理 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上. 2. ...

  3. Java语法基础学习DaySeventeen(多线程续)

    一.线程的特点 1.线程的分类 java中的线程分为两类:守护线程和用户线程.唯一的区别是判断JVM何时离开. 守护线程是用来服务用户线程的,通过在start()方法前调用Thread.setDaem ...

  4. Java语法基础学习DayFifteen(IO续)

    一.缓冲流(处理流的一种) 1.作用:可以提高文件操作的效率 2.使用BufferedInputStream和BufferedOutputStream实现非文本文件的复制 特点:flush()方法 代 ...

  5. Java语法基础学习DaySeven

    ---恢复内容开始--- 一.包装类——Wrapper 1.定义:针对八种基本数据类型定义相应的引用类型——包装类(封装类) boolean——Boolean          byte——Byte ...

  6. Java语法基础学习DayEighteen(常用类)

    一.String类 1.特点 String代表不可变的字符序列,底层用char[]存放. String是final的. 2.内存解析 3.常用方法 int length() char charAt(i ...

  7. Java语法基础学习DaySix

    一.JavaBean——可重用组件 1.JavaBean是指符合以下标准的Java类: (1)类是公共的 (2)有一个无参的公共的构造器 (3)有属性,且有对应的get.set方法 2.好处 用户可以 ...

  8. Java语法基础学习DayThree

    一.流程控制语句补充 1.switch语句 格式: switch(表达式) { case 值1: 语句体1; break; case 值2: 语句体2; break; ... default: 语句体 ...

  9. Java语法基础学习DayTwentyOne(网络编程)

    一.IP地址和端口号 1.作用 通过IP地址,唯一的定位互联网上一台主机. 端口号标识正在计算机上运行的进程,不同进程有不同的端口号,被规定为一个16位的整数0~65535,其中0~1023被预先定义 ...

随机推荐

  1. Python 语言来编码和解码 JSON 对象

    Json函数: json.dumps: Python标准库中的json模块,集成了将数据序列化处理的功能. 将 Python 对象编码成 JSON 字符串 语法: json.dumps(obj, sk ...

  2. Subverion仓库迁移知识点整理

    目录 dump远程仓库内容到本地 可能碰到的问题 将dumpFile导入到本地仓库 可能碰到的问题 如何获取控制台信息 最近在工作上提出了一个需求,需要将各个团队的Subversion仓库进行集中管理 ...

  3. 在 Tomcat 中自定义 404 页面(简单配置)

      打开 Tomcat 中的 web.xml,(tomcat/conf/web.xml) 添加如下代码: <error-page>  <error-code>404</e ...

  4. UI自动化(七)selenium简述

    1.什么是ui自动化模拟人用代码的方式去操作页面2.为什么要做ui自动化后期迭代的时候,老功能比较多,人工维护成本大这时候考虑引入ui自动化3.什么时候做ui自动化项目稳定,不在修改的某些老功能,为这 ...

  5. Linux下Shell的for循环语句

    第一类:数字性循环-----------------------------for1-1.sh #!/bin/bash ;i<=;i++)); do + ); done ------------ ...

  6. 2018年天梯赛LV2题目汇总小结

    Ⅰ.L2-1 分而治之---邻接表 分而治之,各个击破是兵家常用的策略之一.在战争中,我们希望首先攻下敌方的部分城市,使其剩余的城市变成孤立无援,然后再分头各个击破.为此参谋部提供了若干打击方案.本题 ...

  7. codeforce 955c --Sad powers 思路+二分查找

    这一题的题意是   定义一个数,该数特点是为a的p次方 (a>0,p>1) 再给你n个询问,每个询问给出一个区间,求区间内该数的数目. 由于给出的询问数极大(10e5) 所以,容易想到应该 ...

  8. 牛客-数据库SQL实战

    查找最晚入职员工的所有信息 CREATE TABLE `employees` ( `emp_no` ) NOT NULL, `birth_date` date NOT NULL, `first_nam ...

  9. 从实验室走向世界:HSP90抑制剂,一种新的癌症药物

    热休克蛋白90(HSP90)是细胞内一种普遍存在的.十分保守的以及有高度活性的蛋白质,它在肿瘤细胞内的含量要比正常细胞多.作为一种分子伴侣,HSP90协助不同种类的癌蛋白(即HSP90的服务蛋白)进行 ...

  10. Ceph常用命令

    目录 [1.环境准备] [2.部署管理] [3.集群扩容] [4.用户管理] [5.密钥环管理] [6.块设备管理] [7.快照管理] [8.参考链接] 简要说明: 最近心血来潮,对分布式存储感兴趣, ...