Java- - -集合学习一(List)
|---- Collection接口:单列集合,用来存储一个一个的对象
|---- List接口:存储有序的、可重复的数据。- - >”动态“数据
|---- ArrayList、LinkedList、Vector
|---- Set接口:存储无序的、不可重复的数据。- - >高中所讲的集合
|---- HashSet、LinkedHashSet、TreeSet
|---- Map接口:双列集合,用来存储一对(key - value)一对的数据
|---- HashMap、LinkedHashMap、TreeMap、HashTable、properties
Collection接口中方法的使用
方法 | 描述 |
---|---|
boolean add(Object e) | 将元素e添加到集合中 |
int size() | 获取元素个数 |
boolean addAll(Collection c) | 将另一个集合中的元素添加到当前集合中 |
boolean isEmpty() | 判断当前集合是否为空 |
void clear() | 清空集合中的元素 |
boolean contains(Object obj) | 判断当前集合中是否包含obj |
boolean containsAll(Collection c) | 判断形参集合c中的元素是否都存在于当前集合中 |
boolean remove(Object o) | 移除集合中o元素 |
boolean removeAll(Collection c) | 差集:从当前集合中移除c集合中所有的元素 |
boolean retainAll(Collection c) | 交集:获取当前集合和c集合的交集,并返回给当前集合 |
boolean equals(Object o) | 当前集合和形参obj是否相等 |
int hashCode() | 返回当前对象的哈希值 |
Object[] toArray() | 集合----->数组 |
Iterator iterator() | 返回Iterator接口的实例,用于遍历集合元素 |
List接口
ArrayList:作为List接口的主要实现类;线程不安全,效率高;底层使用Object[] elementData存储;
LinkedList:对于频繁的插入和删除操作,此类效率比ArrayList高;底层使用双向链表存储
Vector:作为List接口的古老实现类;线程安全,效率低;底层使用Object[] elementData存储;
List中的常用方法
void add(int index,Object ele) | 在index位置插入ele元素 |
---|---|
boolean addAll(int index,Collection eles | 从index位置开始将eles中的所有元素添加进来 |
Object get(int index) | 获取指定index位置的元素 |
int indexOf(Object obj) | 返回obj在集合中首次出现的位置 |
int lastIndexOf(Object obj) | 返回obj在当前集合中末次出现的位置 |
Object remove(int index) | 移除指定index位置的元素,并返回此元素 |
Object set(int index,Object ele) | 设置指定index位置的元素为ele |
List subList(int fromIndex ,int toIndex) | 返回从fromIndex到toIndex位置的子集合 |
List中遍历方式
方式一:Iterator迭代器方式
@Test
/**
*Iterator迭代器遍历
*/
public void test1(){
ArrayList arrayList = new ArrayList();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
Iterator iterator = arrayList.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
方式二:增强for循环
@Test
public void test2(){
ArrayList arrayList = new ArrayList();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
for(Object o:arrayList){
System.out.println(o);
}
}
方式三:普通for循环
@Test
public void test3(){
ArrayList arrayList = new ArrayList();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
for(int i = 0;i < arrayList.size();i++){
System.out.println(arrayList.get(i));
}
}
ArrayList
/**
*
*JDK 7中:
*/
ArrayList list = new ArrayList();//底层创建长度为10的Object[]数组elementData
list.add(123);//elementData[0] = new Integer(123);
//.......继续添加
list.add(1234);//如果此次添加导致底层elementData数组容量不足,则扩容。默认情况下扩容到原来容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。
/**
* JDK 8中
*/
ArrayList listt = new ArrayList();//底层Object[] elementData初始化为{},并没有创建长度为10的数组
listt.add(123);//第一次调用add()时,才创建了长度为10的数组,并将数据添加到elementData[0]
//.......继续添加
listt.add(1234);//后续的添加操作和扩容操作同jdk7中无异
jdk7中ArrayList的对象的创建有些类似于单例模式中饿汉式,而ArrayList8中ArrayList的对象的创建有些类似与单例模式中懒汉式,延迟了数组的创建,节省内存。
LinkedList
LinkedList linkedList = new LinkedList();//内部声明了Node类型的first和last属性,默认值为null;
linkedList.add(123);//将123封装到Node中,创建Node对象。
/*其中Node定义为:体现了LinkedList的双向链表的说法
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
*/