Set

  • hashSet

    无序,不可重复

public class Fish01 {
    public static void main(String args[]) {
        HashSet books = new HashSet();
        //分别向books集合中添加两个A对象,两个B对象,两个C对象
        books.add(new A());
        books.add(new A());
        books.add(new B());
        books.add(new B());
        books.add(new C());
        books.add(new C());
        System.out.println(books);
    }
}
class A{
    @Override
    public boolean equals(Object obj) {
        return true;
    }
}
class B {
    @Override
    public int hashCode() {
        return 1;
    }
}
//同时重写hashCode,equals方法,在集合中定义
class C {
    @Override
    public int hashCode() {
        return 2;
    }
    @Override
    public boolean equals(Object obj) {
        return true;
    }
}
//result
/home/sha/software/jdk/jdk-8u171-linux-x64/jdk1.8.0_171/bin/java -........
[cn.shafish.B@1, cn.shafish.B@1, cn.shafish.C@2, cn.shafish.A@677327b6, cn.shafish.A@14ae5a5]
Process finished with exit code 0

C类中重写hashCode,equals。定义两个对象相同,hashCode定位对象的存储位置(C类中返回hashCode值相同),equals判断对象值是否相等(C类中返回true)
B类中两个对象的引用值是不相等的,因为对象在内存中的地址单元不同(对于引用类型来说,默认是比较两个对象引用的地址)
A类对象的hashCode不同

  • LinkedHashSet

    元素的顺序总是与添加顺序一致(通过删除后再添加测试)

public class FIsh02 {
    public static void main(String[] args) {
        LinkedHashSet books = new LinkedHashSet();
        books.add("Java");
        books.add("LittleHann");
        System.out.println(books);
        //删除 Java
        books.remove("Java");
        //重新添加 Java
        books.add("Java");
        System.out.println(books);
    }
}
//result
[Java, LittleHann]
[LittleHann, Java]
  • TreeSet

    有序不重复

public class Fish03 {
    public static void main(String[] args) {
        TreeSet nums = new TreeSet();
        //向TreeSet中添加四个Integer对象
        nums.add(5);
        nums.add(2);
        nums.add(10);
        nums.add(-9);
        //输出集合元素,看到集合元素已经处于排序状态
        System.out.println(nums);
        //输出集合里的第一个元素
        System.out.println(nums.first());
        //输出集合里的最后一个元素
        System.out.println(nums.last());
        //返回小于4的子集,不包含4
        System.out.println(nums.headSet(4));
        //返回大于5的子集,如果Set中包含5,子集中还包含5
        System.out.println(nums.tailSet(5));
        //返回大于等于-3,小于4的子集。
        System.out.println(nums.subSet(-3 , 4));
    }
}
//result
[-9, 2, 5, 10]
-9
10
[-9, 2]
[5, 10]
[2]

List

  • ArrayList

    可以在创建它们时就指定initialCapacity大小,这样可以减少重新分配的次数,提高性能

public class Fish04 {
    public static void main(String[] args) {
        List books = new ArrayList();
        //向books集合中添加三个元素
        books.add(new String("算法导论"));
        books.add(new String("java编程思想"));
        books.add(new String("第一行代码"));
        System.out.println(books);
        //将新字符串对象插入在第二个位置
        books.add(1 , new String("疯狂Ajax讲义"));
        for (int i = 0 ; i < books.size() ; i++ )
        {
            System.out.println(books.get(i));
        }
        //删除第三个元素
        books.remove(2);
        System.out.println(books);
        //判断指定元素在List集合中位置:输出1,表明位于第二位
        System.out.println(books.indexOf(new String("疯狂Ajax讲义")));  //①
        //将第二个元素替换成新的字符串对象
        books.set(1, new String("LittleHann"));
        System.out.println(books);
        //将books集合的第二个元素(包括)
        //到第三个元素(不包括)截取成子集合
        System.out.println(books.subList(1 , 2));
    }
}
//result
[算法导论, java编程思想, 第一行代码]
算法导论
疯狂Ajax讲义
java编程思想
第一行代码
[算法导论, 疯狂Ajax讲义, 第一行代码]
1
[算法导论, LittleHann, 第一行代码]
[LittleHann]
  • Stack

    Stack后进先出

public class Fish05 {
    public static void main(String[] args) {
        Stack v = new Stack();
        //依次将三个元素push入"栈"
        v.push("算法导论");
        v.push("java编程思想");
        v.push("第一行代码");
        System.out.println(v);
        //访问第一个元素,但并不将其pop出"栈"
        System.out.println(v.peek());
        System.out.println(v);
        //pop出第一个元素
        System.out.println(v.pop());
        System.out.println(v);
    }
}
//result
[算法导论, java编程思想, 第一行代码]
第一行代码
[算法导论, java编程思想, 第一行代码]
第一行代码
[算法导论, java编程思想]