Java集合概述
- Java集合类存放与java.util包中,是一个用来存放对象的容器.
集合只能存放对象,比如你存一个int型数据1 放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本类型都有对应的引用类型.
集合存放的是多个对象的引用,对象本身还是放在堆内存中.
集合可以存放不同类型,不限数量的数据类型
- Java集合可分为Set、List、和Map三种大体系
Set:无序、不可重复的集合
List:有序,可重复的集合
Map:具有映射关系的集合 - 在JDK5之后,增加了泛型,Java集合可以记住容器中对象的数据类型
HashSet
HashSet是Set接口的典型实现,大多数时候使用Set集合时都使用这个实现类.我们大多数时候说的Set集合指的都是HashSet
- HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能.
- HashSet具有以下特点:
- 不能保证元素的排列顺序
- 不可重复
- HashSet不是线程安全的
- 集合元素可以使用null
- 当向HashSet集合中存入一个元素是,HashSet会调用该对象的hashCode()方法来得到该对象的hashSet值,然后根据hashCode值决定对象在HashSet中的存储位置.
- 如果两个元素的equals()方法返回true,但它们的hashCode()返回值不相等,hashSet将会把它们的存储在不同的位置,但依然可以添加成功.
import java.util.HashSet;
import java.util.Iterator;
public class HashSetDemo01 {
public static void main(String[] args) {
HashSet hashSet= new HashSet<>();
hashSet.add(2);
hashSet.add("a");
System.out.println(hashSet);
Iterator<String> it = hashSet.iterator();
System.out.println(it.next());
for ( Object x:hashSet) {
System.out.print(x+"\t");
}
System.out.println();
System.out.println(hashSet.size());
System.out.println(hashSet.isEmpty());
System.out.println(hashSet.contains("a"));
hashSet.remove(2);
System.out.println(hashSet);
Object w = hashSet.clone();
System.out.println(w);
hashSet.clear();
System.out.println(hashSet);
HashSet<String> strings = new HashSet<>();
strings.add("2");
}
}
TreeSet
- 线程不安全
- TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序转态.TreeSet支持两种排序方法:自然排序和定制排序.默认情况下,TreeSet采用自然排序.
排序:TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素之间的大小关系,然后将集合元素按升序排列
- 如果this>obj,返回正数1
- 如果this<obj,返回负数-1
- 如果this=obj,返回0,则认为这两个对象相等
- 必须放入同样类的对象.(默认会进行排序)否则可能会发生类型转换异常.我们可以使用泛型来进行限制
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Integer> set= new TreeSet();
set.add(20);
set.add(12);
set.add(5);
set.add(25);
System.out.println(set);
System.out.println(set.ceiling(3));
Iterator<Integer> it = set.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
for ( Integer x:set) {
System.out.print(x+"\t");
}
System.out.println();
System.out.println(set.size());
System.out.println(set.isEmpty());
System.out.println(set.contains("a"));
set.remove(2);
System.out.println(set);
Object w = set.clone();
System.out.println(w);
set.clear();
System.out.println(set);
}
}
-
定制排序
- 如果需要实现定制排序,则需要在创建TreeSet集合对象时,提供一个Comparator接口的实现类对象.由该Comparator对象负责集合元素的排序逻辑
public class TreeSetDemo {
public static void main(String[] args) {
Person p1=new Person(22,"张三");
Person p2=new Person(20,"李四");
Person p3=new Person(26,"王五");
Person p4=new Person(24,"Hello");
TreeSet<Person> set1 = new TreeSet<>(new Person());
set1.add(p1);
set1.add(p2);
set1.add(p3);
set1.add(p4);
System.out.println(set1);
for (Person x:set1
) {
System.out.println(x.name + " " + x.age);
}
}
}
class Person implements Comparator<Person> {
int age;
String name;
public Person(){
}
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int compare(Person o,Person o1) {
if (o.age > o1.age) {
return 1;
}else if (o.age < o1.age) {
return -1;
}else {
return 0;
}
}
}