一,前言
了解List和set接口下子类的同和异,掌握接口的常用方法
二,List集合
1.List集合的特点
-
鉴于Java数组中用来存储数据的局限性,我们通常用List代替数组。
-
List集合中具有 元素有序,且可重复 的性质,集合中的每个元素都有其对应的顺序索引。
-
List接口实现类常用的有:ArrayList,LinkedList和Vector。
2.List集合常用方法
void add(int index, E element) 将指定的元素插入此列表中的指定位置。 boolean addAll(int index, Collection<? extends E> c) 将指定集合中的所有元素插入到此列表中的指定位置。 E remove(int index) 删除该列表中指定位置的元素。 Object get(int index) 返回此列表中指定位置的元素。 E set(int index, E element) 用指定的元素替换此列表中指定位置的元素。 int indexOf(Object o) 返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。 int lastIndexOf(Object o) 返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。 List<E> subList(int fromIndex, int toIndex) 返回此列表中指定的 fromIndex (含)和 toIndex之间的视图。
3.List集合遍历
-
迭代器遍历
public static void main(String[] args) { List<String> list = new ArrayList(); list.add(new String("book001")); list.add(new String("book002")); list.add(new String("book003 ")); String value = null; Iterator iter = list.iterator(); while (iter.hasNext()) { value = (String)iter.next(); System.out.println(value); } }
-
for循环遍历
public static void main(String[] args) { List<String> list = new ArrayList(); list.add(new String("book001")); list.add(new String("book002")); list.add(new String("book003 ")); String value = null; Iterator iter = list.iterator(); for(i = 0;i<list.size();i++){ value = (String)list[i]; System.out.println(value); }
-
增强 for (foreach) 循环遍历
public static void main(String[] args) { List<String> list = new ArrayList(); list.add(new String("book007")); list.add(new String("book008")); list.add(new String("book009")); String value = null; for (String books:list) { value = books; System.out.println(value); } }
4.list集合总结
-
List 中元素是有序的,元素可以重复,因为该集合体有索引。
ArrayList: 作为List接口的主要实现类,线程不安全,效率高,底层使用Object[] elementData。 LinkedList: 对于频繁的插入,删除操作,使用比ArrayList效率搞,底层使用双向链表存储。 Vector: 作为List接口的古老实现类,线程安全,效率低,底层使用Object[] elementData。
三,Set集合
1.Set集合的特点
-
Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败
-
Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals 方法。
2.HashSet集合
HashSet特点:
-
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
-
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
-
HashSet 具有以下特点:
-
-
-
不能保证元素的排列顺序
-
HashSet 不是线程安全的(异步)
-
集合元素可以是null
-
-
HashSet存储原理:
-
HashCode() 获取哈希码,也称散列码;实际是返回一个int整数。作用是确定该对象在哈希表中的索引位置,Java的任何类都包含有hashCode() 函数。
-
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法,获取哈希值,然后根据 值决定该对象在 HashSet 中存储位置。
-
如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,hashSet 将会把它们存储原有元素指向下面的位置,但依然可以添加成功。
注:测试重写 equals和hashCode方法,存储对象。
3.TreeSet集合
HashSet特点:
-
TreeSet基于TreeMpa实现,TreeMap本质就是红黑树。所以TreeSet其实于是基于红黑树的。
-
TreeSet有个特点,插入无序内部有序。
-
插入数据实现Comparable接口,通过compareTo方法去比较大小,或者在实力化TreeSet的时候自定义排序Comparator方法。内部的int compare(T o1, T o2)比较对象大小。
TreeSet集合排序:
插入实现Comparable接口重写类方法: (Comparable接口,compareTo方法) public class Person implements Comparable<Person>{ @Override public int compareTo(Person o) { // TODO Auto-generated method stub return this.age - o.age; } } 实力化TreeSet自定义排序Comparator方法:(如按类的年龄排序) (Comparator方法,compare(T o1, T o2)) public void test(){ Comparator com = new Comparator(){ @Override public int compareTo(Person o1,Person o2) { if(o1 instanceof User && o1 instanceof User){ User u1 = (User)o1; User u2 = (User)o2; return Integer.compare(u1.getAge(),u2.getAge()) }else{ throw new RuntimeException("输入的数据类型不匹配") } TreeSet ts = new TreeSet(com); } } }
4.Set集合遍历
迭代器遍历,foreach遍历;
5 .Set集合总结
-
不允许存储重复的元素
-
没有索引
HashSet: 不允许存储重复的元素 没有索引,没有带索引的方法,也不能使用普通的for循环遍历 是一个无序的集合,存储元素和取出元素的顺序有可能不一致 底层是一个哈希表结构(查询的速度非常的快) treeSet: 数据类型必须是一致的 读取的结果,是按照两种的方法或默认进行排序的输出的