首页 > 代码库 > java集合排序问题
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集合