List接口与Set接口
一 List接口
List接口,有序,可存重复元素,它的常用子类ArrayList、LinkedList。
list接口中常用的方法:增加元素方法add、删除元素方法remove、替换元素方法、查询元素方法、
List<String> list=new ArrayList<String>(); list.add("a"); list.add("v"); //在指定位置添加元素 list.add(1,"e"); list.add(2, "c"); System.out.println(list); //遍历 for(int i=0;i<list.size();i++){ System.out.print(list.get(i)+" "); } //删除指定位置的元素 System.out.println(); String str=list.remove(1); System.out.println(str); System.out.println(list); //替换指定位置的元素 list.set(1, "z"); System.out.println(list);
在迭代过程中,使用了集合的方法对元素进行操作。导致迭代器并不知道集合中的变化,容易引发数据的不确定性。
称为并发修改异常java.util.ConcurrentModificationException
并发修改异常的解决办法:在迭代时,不要使用集合的方法操作元素。想要在迭代时对元素操作,通过ListIterator迭代器操作元素
数据存储的常用结构有:堆栈(先进后出)、队列(先进先出)、数组(查找元素快,增删元素慢)、链表(查找元素慢,增删元素快)。
链表结构:
ArrayList集合是数组结构,LinkedList集合数据存储的结构是链表结构,LinkedList是List的子类,List中的方法LinkedList都是可以使用
Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合。Vector中独特的取出方式枚举Enumeration,就是早期的迭代器。
二 Set接口
set接口 存放不重复元素,无序。
HashSet集合 保证元素唯一性的方式依赖于:hashCode()与equals()方法。
ArrayList的contains方法,底层其实就是equal方法
hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。
给HashSet中存储JavaAPI中提供的类型元素时,不需要重写元素的hashCode和equals方法,因为这两个方法,在JavaAPI的每个类中已经重写完毕,如String类、Integer类等。但是存储自定义类型时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一
HashSet下面有一个子类LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。可以保证有序。