1.Set
数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。数组中可以存储基本数据类型,集合只能存储对象。
集合可以存储不同类型的对象。
共性方法
由于大部分集合类都继承了Collection接口,所以Collection接口的方法就是集合类的共性方法.
public static void demo1(){
Collection col1=new ArrayList();
col1.add("java01");
col1.remove("java01");
col1.clear();
System.out.println(col1.size());
System.out.println(col1.isEmpty());
System.out.println(col1.contains("java01"));
}
迭代器
//用迭代器取出元素方式2,将迭代器在for循环的第一个;前定义,可以提高性能
for (Iterator it=col1.iterator();it.hasNext();) {
System.out.println(it.next());
}
2.List 与Set
3.HashSet
HashSet:底层数据结构是哈希表。通过Object上的hashCode方法来判断元素是否重复,如果hashCode一样,则进一步通过equals方法判断,如果连equals都一样,则确认是重复元素.如果equals 为false那么HashSet 认为新加入的对象没有重复.新元素可以存入.
左图:hashCode值不相同的情况
右图:hashCode值相同,但equals不相同的情况。
public static void main(String[] args) {
HashSet set=new HashSet();
set.add(new Person("a1", 12));
System.out.println(set.contains(new Person("a2", 34)));
System.out.println(set.remove(new Person("a2", 34)));
Iterator it=set.iterator();
while (it.hasNext()) {
Person p=(Person)it.next();
System.out.println(p.getName()+"的年龄是"+p.getAge());
}
}
LinkedHashSet:
类HashSet和LinkedHashSet都是接口Set的实现,两者都不能保存重复的数据。主要区别是HashSet不保证集合中元素的顺序,即不能保证迭代的顺序与插入的顺序一致。
而LinkedHashSet按照元素插入的顺序进行迭代,即迭代输出的顺序与插入的顺序保持一致。
LinkedHashSet 通过继承 HashSet,底层使用 LinkedHashMap.
4.TreeSet
TresSet:可以对集合中的元素排序。底层数据结构是二叉树,通过元素的compareTo方法是否返回0保证元素唯一性。
TreeSet则是对Set中的元素进行排序存放【TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序】。
import java.util.Iterator;
import java.util.TreeSet;
class Student implements Comparable{
String name;
int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Object o) {
if (!(o instanceof Student)) {
throw new RuntimeException();
}
Student s=(Student)o;
if (this.age>s.getAge()) {
return 1;
}else if (this.age==s.getAge()) {
return this.name.compareTo(s.name);
}
return -1;
}
}
public class TreeSetDemo {
public static void main(String[] args) {
demo2();
}
public static void demo2(){
TreeSet ts=new TreeSet();
ts.add(new Student("lisi01", 56));
ts.add(new Student("lisi02", 34));
ts.add(new Student("lisi03", 34));
ts.add(new Student("lisi04", 12));
Iterator it=ts.iterator();
while(it.hasNext()){
Student s=(Student)it.next();
System.out.println(s.getName()+"的年龄是:"+s.getAge());
}
}
}
注意:存入TreeSet集合中的元素类必须实现Comparable接口,并覆盖compareTo方法。方法抛出异常。compareTo方法的作用是确定对象在集合中的顺序,如果compareTo方法返回1,则放在当前比较元素的后边,否则放前边。
参考: