本文共 5554 字,大约阅读时间需要 18 分钟。
简单的说,变量、数组、对象、集合,都可以看做是一个容器
java.util.Collection
集合,java.util.Map
集合 Collections
工具类,里面封装了大量操作集合的常用方法java.util.Collection
接口,是 List接口
、Queue接口
、Set接口
的父接口。所以,父类接口中定义的方法,通用于 list集合、Queue集合、Set集合
说到接口,就会想到多态
接口类型的引用指向了实现类对象
Collectionst = new ArrayList ();
回顾,匿名内部类:接口类型的引用指向了,匿名实现类
// A 是一个接口 A a = new A(){ @Override public void show(){ System.out.println("这是接口的实现类!不过是匿名"); } };
方法声明 | 功能介绍 |
---|---|
boolean add(E e); | 向集合中添加元素 |
boolean addAll( Collection<? extends E> c); | 将集合c 中的元素,全部添加到当前的集合中 |
boolean contains(Object o); | 判断是否包含指定对象 |
boolean containsAll(Collection<? extends E> c); | 在当前集合中,判断是否包含了集合c中的所有元素对象 |
boolean retainAll(Collection<? extends E> c); | 在当前集合中,保留集合c中的所有元素对象 |
boolean remove(Object o); | 在当前集合中,删除指定的元素 |
boolean removeAll(Collection<? extends E> c); | 在当前集合中,删集合c中包含的所有元素对象 |
void clear(); | 在当前集合中,删除所有的元素 |
int size() | 返回集合中的元素对象个数 |
boolean isEmpty(); | 判断集合是否为空 |
boolean equals(Object o); | 判断这两个集合是否相等 |
int hashCode(); | 获取当前集合的哈希值 |
Object[] toArray(); | 将集合转换为对象数组 |
Iterator iterator(); | 获取当前集合的迭代器对象 |
注意:
集合和 字符串数组的转换:
// 字符串数组 ---> 集合String[] str = { "123", "wq", "dsa"};Listlist = Arrays.asList(str);// 集合 ---> 字符串数组Object[] array = list.toArray();
java.util.Iterator
接口,主要用于描述迭代器对象,可以用来遍历Collection集合中的所有元素java.util.Collection
接口,继承至Iterator接口,所以Collection的实现类都能够使用迭代器对象方法声明 | 功能介绍 |
---|---|
boolean hasNext(); | 判断集下一个位置是否有元素 |
E next(); | 取出一个元素,并指向下一个元素 |
void remove() | 用于删除访问到的最后一个元素( next方法获得的元素 ) |
举例:
Iteratorit = collection.iterator();while(it.hasNext()){ String s = it.next(); if("汪星人".equals(s)){ it.remove(); }}
在创建迭代器对象后(调用next方法之前),迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,
当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。
总结:
Collectionlist = new ArrayList ();list.add("悟空");list.add("八戒");list.add("悟能");// 使用StringBuilder,来拼接结果StringBuilder sb = new StringBuilder();// 获得迭代器对象,所谓的指针,指向null(第一个元素前)Iterator iterator = list.iterator();// 不知道遍历多少次,用while// 迭代器对象调用hasNext(),来判断指针指向的下一个索引是否有元素sb.append("[");while (iterator.hasNext()) { // 迭代器对象调用next(),指针移向下一个元素,并且将其返回 String element = iterator.next(); if (!iterator.hasNext()) { // 满足条件,则为最后一个元素 sb.append(element).append("]"); } else { // 不是最后一个元素,进行", "的拼接 sb.append(element).append(", "); }}System.out.println("最终效果为:" + sb);
运行结果:
实现了,list集合
直接 toString 进行打印的效果
Collectionlist = new ArrayList ();list.add(1);list.add(2);list.add(3);/*------ 迭代中删除元素2 ——————*/// 获取迭代器Iterator ite = list.iterator();while (ite.hasNext()) { Integer element = ite.next(); if (2 == element) { // 删除指针指向的元素 (就是next方法获取的元素) ite.remove(); }}System.out.println(list);
会报错,并发修改异常:ConcurrentModificationException
就是指,Collection在迭代的过程中,不允许有其他线程来修改它。不然,迭代的结果是不正确的
增强for循环,本质上也是一个迭代器的简化版
java.util.List
接口,是Collection集合的子接口。该集合允许重复的元素,有序排列
主要实现类有:
ArrayList:底层采用了动态数组进行数据管理,支持索引访问元素,增删不便
LinkedList:底层采用双向链表进行数据管理,访问不便,增删方便
ArrayList更适合于元素的查改,LinkedList更适合于元素的增删。(在性能要求不是特别严格情况下,可以忽略该条)
Vector:底层采用动态数组,和ArrayList相比,属于线程安全,效率低(基本不用,过时了)
动态数组
Listlist = new ArrayList ();list.add("1");
特点:多态,无参构造
源码分析:
最开始调用了 ArrayList的无参构造
public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}
结论:
ArrayList的无参构造,构造了一个长度为0 的空数组。所以,由源码可知:当new对象时并没有申请数组的内存空间
调用add方法,添加元素时:
底层采用双向链表进行数据管理,访问不便,增删方便
Listlist = new LinkedList ();list.add("1");
特点:多态,无参构造
源码分析:
调用LinkedList的无参构造
public LinkedList() { }
调用add方法
// 参数 e 就是我们待添加的元素public boolean add(E e) { linkLast(e); return true;}
进入 linkLast 方法:
void linkLast(E e) { // 让一个变量l = 指向最后一个节点的指针 final Nodel = last; // 创建一个新的节点 (l= last:前驱,e:待添加的元素,null:后继) final Node newNode = new Node<>(l, e, null); // 让last指向newNode last = newNode; if (l == null) first = newNode; else l.next = newNode; // 元素个数+1 size++; modCount++;}
方法声明 | 功能介绍 |
---|---|
void add(int index, E element); | 向指定位置添加元素 |
boolean addAll ( int index,Collection<? extends E> c); | 向指定位置,添加集合c中的所有元素 |
E get (int index); | 从List集合中,获取指定索引的元素 |
int indexOf(Object o); | 返回List集合中,指定元素的首次出现的索引 |
int lastIndexOf(Object o); | 返回List集合中,指定元素最后一次出现的索引 |
E set(int index, E element); | 用指定的元素替换List集合中指定索引的元素 |
E remove( int index ) | 删除指定位置的元素 |
List subList(int fromIndex, int toIndex); | 获取子List ( 从fromIndex索引开始,截取到 toIndex-1) |
方法声明 | 功能介绍 |
---|---|
boolean offer(E e); | 将一个对象添加到队尾,成功返回true |
E poll(); | 删除并返回队列中的头元素, |
E peek(); | 返回队列中的头元素,不删除 |
转载地址:http://bhuen.baihongyu.com/