一、集合

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. 【转】jira插件Zephyr的具体使用

    在工作中,我们通常是在excel表格中编写测试用例,增删改查功能都不错,但保存.管理.共享都不完美,为了让公司领导或其他同事方便查看测试执行情况和测试进度,我们引入了TestLink工具来编写测试用例 ...

  2. Android-Gradle(二)

    理解Gradle脚本 当然我们现在讨论的所有内容都是基于Android studio的,所以请先行下载相关工具.当我们创建一个新的工程,Android studio会默认为我们创建三个gradle文件 ...

  3. 自制操作系统Antz(2)——进入保护模式 (上) jmp到保护模式

    Antz系统更新地址: https://www.cnblogs.com/LexMoon/category/1262287.htm Linux内核源码分析地址:https://www.cnblogs.c ...

  4. Python-图片文字识别

    百度AI接口(手写文字识别):https://ai.baidu.com/docs#/OCR-API/9ef46660 实现效果: 步骤一:接入接口 进入上述网站申请账号,然后运行相关代码,获取 acc ...

  5. MATLAB raw格式转为bmp格式

    今天是第一天写博客,哈哈哈!把完成的数字图像作业放上来和大家一起分享一下! 如果有什么问题,希望大家和我多多交流 1518234852@qq.com width=512; height=512; im ...

  6. Spring错误——Spring 注解——factory-bean reference points back to the same bean definition

    背景:学习Spring,在使用注解@Bean的name属性配置<bean>实例时,不能注册实例成功 报错 WARNING: Exception encountered during con ...

  7. 基本设置_common_setting

    comment(备注) ID(请勿修改) Param(参数) 说明与格式 积分物品ID设置 1 60000 积分属性虚拟货币,存储在Auth库account表TokenAmount字段. 这里设置积分 ...

  8. SSH 远程登陆

    2019-03-10 20:41:39 一.什么是SSH 简单说,SSH是一种网络协议,用于计算机之间的加密登录. 如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登 ...

  9. 【文献07】基于MPC的WMR点镇定-极坐标系下和轨迹跟踪

    参考: Kuhne F , Lages W , Silva J D . Point stabilization of mobile robots with nonlinear model predic ...

  10. 问题处理:Library not loaded: /usr/local/opt/readline/lib/libreadline.7.dylib (LoadError)

    进入rails 文件夹, terminal输入rails console报告❌. 类似下面的 Running via Spring preloader Traceback (most recent c ...