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集合

java集合排序问题,布布扣,bubuko.com

时间: 2024-12-23 15:36:56

java集合排序问题的相关文章

java 集合排序问题

3种排序 TreeSet <T>:  排序:必须在对象所属的类<T>中实现java.lang.Comparable接口,并且重写toCompare()方法. List <T>+ Collection工具类: Collections.sort(list):需要实现Comparable接口,并且重写toCompare()方法. Collections.sort(list,new Comparator(){@Override public int compare(Object

Java集合框架总结(3)——TreeSet类的排序问题

Java集合框架总结(3)--TreeSet类的排序问题 TreeSet支持两种排序方法:自然排序和定制排序.TreeSet默认采用自然排序. 1.自然排序 TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间大小关系,然后将集合元素按升序排列,这种方式就是自然排序.(比较的前提:两个对象的类型相同). java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该

Java—集合框架List

集合的概念 现实生活中:很多的事物凑在一起 数学中的集合:具有共同属性的事物的总和 Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象 集合的作用 在类的内部,对数据进行组织(针对作用与意义一样的属性,将他们放到一个集合中) 简单而快速的搜索大数量的条目 有的集合接口,提供了一系列排列有序的元素,并且可以在序列中快速的插入或删除有关元素 有的集合接口,提供了映射关系,可以通过关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型 与数组相比 数组的长度

Java 集合

在Java Collections Framework中,不同类型的集合使用不同类型的数据结构以不同的方式存储它们的元素. 集合框架提供了遍历集合的以下方法: 使用迭代器 使用for-each循环 使用forEach()方法 使用迭代器 迭代器可以对集合执行以下三个操作: 检查是否有尚未访问的元素. hasNext() 检查是否有下一个访问的元素. next() 删除集合的最后访问元素. remove() 例子1 使用迭代器打印列表的所有元素: import java.util.ArrayLis

《深入理解Java集合框架》系列文章

Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framework, JCF)的资料却很少,甚至很难找到一本专门介绍它的书籍,这给Java学习者们带来不小的麻烦.我深深的不解其中的原因.虽然JCF设计参考了STL,但其定位不是Java版的STL,而是要实现一个精简紧凑的容器框架,对STL的介绍自然不能替代对JCF的介绍. 本系列文章主要从数据结构和算法层面分析

Java集合相关面试问题和答案

Java集合相关面试问题和答案 面试试题 1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector.Stack.HashTable和Array.随着集合的广泛使用,Java1.2提出了囊括所有集合接口.实现和算法的集合框架.在保证线程安全的情况下使用泛型和并发集合类,Java已经经历了很久.它还包括在Java并发包中,阻塞接口以及它们的实现.集合框架的部分优点如下: (1)使用核心集合类降低开发成本,而非实现我们自己的集合类.

Java集合

JAVA集合小结   有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否 否 HashSet TreeSet 是(用二叉树排序) Map AbstractMap 否 使用key-value来映射和存储数据,Key必须惟一,value可以重复 HashMap TreeMap 是(用二叉树排序) 几个面试常见问题:1.Q:ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?   A:Vector和HashT

一大波Java来袭(五)——Java集合概述

把"Java集合"比作是容器,可以把多个对象(实际:是对象的引用),扔在容器中. JDK1.5之前,被丢进集合中的对象,会丢失起数据类型.默认为Object类型 JDK1.5之后,不会丢失数据类型,因为引入了"泛型"(作为下文重点) 本文将结合数据结构,重点讲述Java的4种集合体系的功能和用法,并给出不同应用场景改如何选择? 一.同样是用于"存储数据",既可以使用"数组",有可以使用"集合",有什么区别吗

Java集合总览

这篇文章总结了所有的Java集合(Collection).主要介绍各个集合的特性和用途,以及在不同的集合类型之间转换的方式. Arrays Array是Java特有的数组.在你知道所要处理数据元素个数的情况下非常好用.java.util.Arrays 包含了许多处理数据的实用方法: Arrays.asList:可以从 Array 转换成 List.可以作为其他集合类型构造器的参数. Arrays.binarySearch:在一个已排序的或者其中一段中快速查找. Arrays.copyOf:如果你