java hasset 顺序_java集合排序问题

List: 元素是有序的,元素可以重复,因为该集合体系有索引(脚标)

常用的子类对象:

1————ArrayList 底层的数据结构是使用的数组结构特点:查询速度快,但是增删比较慢

2————LinkedList底层的数据结构使用的是链表结构特点:增删速度快,但是查询比较慢

Vector 底层是数组数据结构。

线程同步,ArrayList线程不同步,替代了vector ArrayList 是可变长度数组,默认长度是10,当添加的元素大于10时,系统自动new一个新的数组且增长原数组的一半长度,并把之前的元素复制到这个新数组中,vector和它一样,但是延长一倍。

Set:无序,不可重复元素 HashSet:数据结构是哈希表,线程是非同步的。保证元素唯一性的原理,判断元素的hashCode值是否相同如果相同,还会继续判断元素的equals方法,是否为true。

TreeSet:

可以对Set集合中的元素进行排序。底层数据结构是二叉树。 保证元素唯一行的依据,compareTo方法return 0;

TreeSet 排序的第一种方式

让元素(对象)自身具备比较性。元素需要实现Comparable接口,覆盖 compareTo方法这种方式也称为元素的自然顺序,或者叫做默认顺序

TreeSet第二种排序方式:

当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让集合(TreeSet)自身具备比较性。做法是在集合初始化时,就有了比较方式,即定义一个比较器将比较器作为参数传递给TreeSet集合的构造函数。比较器--定义一个类,实现Comparator接口,覆盖compare方法。而当两种排序都存在时以比较器为主。

关于ArrayList添加对象,自定义判断条件问题以及HashSet集合添加自定义对象问题虽然两个集合的底层结构不同,但是他们都调用添加对象类中的equals方法,而 ArrayList是通过contains()方法让系统自动调用equals方法;HashSet是通过当add添加元素的时候系统自动调用hashCode()方法判断hash值如果相等则不会被添加,如果相等,再通过hashCode方法调用equals方法判断。一般添加的时候都会在类中重写hashCode 和equals以满足实际条件的需求。但是,ArrayList和HashSet重写Object类中的equals方法原理都是一样的。

例如:

class Person {

private String name;

private int age;

Person(String name,int age) { this.name=name; this.age=age; }

public String getName() { return name; }

public int getAge() { return age; } }

此equals是重写Object中的equals方法 obj形参实参是contains中的,相当于obj=new Person("xiaoxiao11",15);

多态 public boolean equals(Object obj) { 判断传进来的对象是否是Person对象不是的话就返回false if (!(obj instanceof Person)) { return false; } 因为传参传进来的对象是Object的子类对象,体现多态性,必须向下转型 Person p=(Person)obj; return this.name.equals(p.name)&&this.age==p.age; 而return中的equlas是字符串中的equals方法~~! 比较字符串对象的内容是否相同 } }

关于TreeSet添加自定意对象,让其排序的问题。有两种方式

第一种让元素(对象)自身具备比较性。元素需要实现Comparable接口,覆盖 compareTo方法这种方式也称为元素的自然顺序,或者叫做默认顺序

class Student implements Comparable {

private String name;

private int age;

Student(String name,int age) { this.name=name; this.age=age; }

当在TreSet中添加对象的时候底层自动调用Comparable接口中的compareTo方法

class Student implements Comparable {

private String name;

private int age;

Student(String name,int age) { this.name=name; this.age=age; }

public int compareTo(Student s) { System.out.println(this.name+"...compareto...."+s.name);

int num= new Integer(this.age).compareTo(new Integer (s.age));

if(num==0) return this.name.compareTo(s.name);//比较名字是否相同时次要条件

return num; }

public String getName() { return name; }

public int getAge() { return age; } }

第二种:当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时需要让集合(TreeSet)自身具备比较性。做法是在集合初始化时,就有了比较方式,即定义一个比较器将比较器作为参数传递给TreeSet集合的构造函数。比较器--定义一个类,实现Comparator接口,覆盖compare方法。而当两种排序都存在时以比较器为主使用了泛型--在集合初始化时把new Mycomparator()以构造方法传参传进去即可

class Mycomparator implements Comparator {

public int compare(String o1,String o2) { int num=new Integer(o1.length()).compareTo(new Integer (o2.length()));

if (num==0) { return o1.compareTo(o2); }

return num; } }

Map集合的两种取出方式

Set keySet:将Map中所有的键存入到Set集合,因为Set集合具备迭代器所以可以迭代取出所有的键,在根据get(key)获取值。 Map集合的取出原理:将Map集合转成Set集合,再迭代取出。

Set> entrySet:将Map集合中的映射关系存入到Set集合中,而这个关系的数据类型就是:Map.Entry Map.Entry 其实Entry也是一个就扣,它是Map接口中的一个内部接口。

interface Map {

public static interface Entry {

//定义内部接口是因为取出Map中的成员属性方便

public abstract Object getKey();

public abstract Object getValue(); } }

class HashMap implements Map {

//HashMap 取出元素的原理

class Haha implements Map.Entry {

public abstract Object getKey(){ }

public abstract Object getValue(){ } }

Map的子类

Hashtable:底层是哈希表数据结构,不可以存null键null值。线程同步

HashMap: 底层是哈希表数据结构,允许存null键null值,线程不同步

TreeMap: 底层是二叉树数据结构,线程不同步,可以给Map中的键排序其实Set底层就是使用了Map集合

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用JavaScript删除CSS属性?

In this article, well see how we can remove a CSS property from a certain element using JavaScript? We can remove only those properties that we assign ourselves and the pre-default ones cannot be removed by this method. 在本文中,我们将看到如何使…

Django 缓存系统

Django 是动态网站,一般来说需要实时地生成访问的网页,展示给访问者,这样,内容可以随时变化,但是从数据库读多次把所需要的数据取出来,要比从内存或者硬盘等一次读出来 付出的成本大很多。 缓存系统工作原理…

java web截屏_java_WebDriver中实现对特定的Web区域截图方法,用过 WebDriver 的同学都知道,We - phpStudy...

WebDriver中实现对特定的Web区域截图方法用过 WebDriver 的同学都知道,WebDriver 可以对浏览器中的页面进行截图。例如:public byte[] takeScreenshot() throws IOException {TakesScreenshot takesScreenshot (TakesScreenshot) driver;return takesSc…

c语言 关键字const_C ++ const关键字| 查找输出程序| 套装1

c语言 关键字constProgram 1: 程序1&#xff1a; #include <iostream>using namespace std;void fun(int& A) const{A 10;}int main(){int X 0;fun(X);cout << X;return 0;}Output: 输出&#xff1a; [Error] non-member function void fun(int) cannot ha…

【喜报】JEEWX荣获“2016 年度码云新增热门开源软件排行榜”第一名!

为什么80%的码农都做不了架构师&#xff1f;>>> 2016 年度码云新增项目排行榜 TOP 50 正式出炉&#xff01;根据 2016 年在码云上新增开源项目的 Watch、Star、Fork 数量以及其他角度的统计&#xff0c;JEEWX捷微管家荣获“2016 年度码云新增热门开源软件排行榜”第…

java 二叉树特点_疯狂java笔记之树和二叉树

树的概述树是一种非常常用的数据结构&#xff0c;树与前面介绍的线性表&#xff0c;栈&#xff0c;队列等线性结构不同&#xff0c;树是一种非线性结构1.树的定义和基本术语计算机世界里的树&#xff0c;是从自然界中实际的树抽象而来的&#xff0c;它指的是N个有父子关系的节点…

编辑距离 dp_使用动态编程(DP)编辑距离

编辑距离 dpProblem: You are given two strings s1 and s2 of length M and N respectively. You can perform following operations on the string. 问题&#xff1a;给您两个长度分别为M和N的字符串s1和s2 。 您可以对字符串执行以下操作。 Insert a character at any posi…

tomcat +apache 配置集群

2019独角兽企业重金招聘Python工程师标准>>> APACHE2.2.25TOMCAT6.0.37配置负载均衡 目标: 使用 apache 和 tomcat 配置一个可以应用的 web 网站&#xff0c;要达到以下要求&#xff1a; 1. Apache 做为 HttpServer &#xff0c;后面连接多个 tomcat 应用实例&…

java双缓存机制_详解JVM类加载机制及类缓存问题的处理方法

前言大家应该都知道&#xff0c;当一个Java项目启动的时候&#xff0c;JVM会找到main方法&#xff0c;根据对象之间的调用来对class文件和所引用的jar包中的class文件进行加载(其步骤分为加载、验证、准备、解析、初始化、使用和卸载)&#xff0c;方法区中开辟内存来存储类的运…

oracle中dbms_并发和由于DBMS中的并发导致的问题

oracle中dbms并发 (Concurrency) The ability of a database system which handles simultaneously or a number of transactions by interleaving parts of the actions or the overlapping this is called concurrency of the system. 数据库系统通过交织部分操作或重叠操作来…

什么是mvc?

什么是MVCMVC 是一种设计模式&#xff0c;它将应用划分为3 个部分&#xff1a;数据&#xff08;模型&#xff09;、展现层&#xff08;视图&#xff09;和用户交互层&#xff08;控制器&#xff09;。换句话说&#xff0c;一个事件的发生是这样的过程&#xff1a;1&#xff0e;…

mysql的安装和基本命令_MySQL安装以及简单命令用法

MYSQL:关系型数据库存储引擎:负责将逻辑层的概念转化为物理层机制&#xff0c;在物理层完成物理机制。支持事务&#xff1a;transaction必须满足的条件&#xff1a;ACID(一致性,持久性,原子性,隔离性)锁&#xff1a;并发访问随机访问&#xff1a;数据在磁盘上是随机存储的安装&…

将数组转换为JavaScript中的对象

Lets say you have the following array, 假设您有以下数组&#xff0c; const nums [1, 2, 3, 4, 5];console.log(nums);Output 输出量 (5) [1, 2, 3, 4, 5]We know that nums is an array and we can see in the output that we get an array. Lets convert it into an ob…

docker集群运行在calico网络上

2019独角兽企业重金招聘Python工程师标准>>> ##网络及版本信息 docker1 centos7 192.168.75.200 docker2 centos7 192.168.75.201 物理网络 192.168.75.1/24 Docker version 1.10.3, build 3999ccb-unsupported &#xff0c;安装过程略 # calicoctl version Version…

python批量雷达图_python批量制作雷达图

老板要画雷达图&#xff0c;但是数据好多组怎么办&#xff1f;不能一个一个点excel去画吧&#xff0c;那么可以利用python进行批量制作&#xff0c;得到样式如下&#xff1a;首先制作一个演示的excel&#xff0c;评分为excel随机数生成&#xff1a;1 INT((RAND()4)*10)/10加入标…

JavaScript中带有示例的Math.log()方法

JavaScript | Math.log()方法 (JavaScript | Math.log() Method) Math.log() is a function in math library of JavaScript that is used to return the value of natural Log i.e. (base e) of the given number. It is also known as ln(x) in mathematical terms. Math.log…

SUI踩坑记录

SUI踩坑记录 最近做了个项目选型了SUI和vue做单页应用。下面记录一下踩坑经历SUI 介绍 sui文档&#xff1a;http://m.sui.taobao.org/SUI Mobile 是一套基于 Framework7 开发的UI库。它非常轻量、精美&#xff0c;只需要引入我们的CDN文件就可以使用&#xff0c;并且能兼容到 i…

java 写入xml文件_java读写xml文件

要读的xml文件李华姓名>14年龄>学生>张三姓名>16年龄>学生>学生花名册>package xml;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.Iterator;import java.util.Vector;import javax.xml.pa…

JavaScript中带有示例的Math.max()方法

JavaScript | Math.max()方法 (JavaScript | Math.max() Method) Math.max() is a function in math library of JavaScript that is used to return the greatest value of all the passed values to the method. Math.max()是JavaScript数学库中的函数&#xff0c;用于将所有…

java 修饰符默认_Java和C#默认访问修饰符

C#中&#xff1a;针对下面几种类型内部成员的访问修饰符&#xff1a;enum的默认访问修饰符&#xff1a;public。class的默认为private。interface默认为public。struct默认为private。其中&#xff1a;public可以被任意存取&#xff1b;protected只可以被本类和其继承子类存取&…