集合框架概述
数组和集合的区别
长度
数组的长度固定不变的
集合长度是可以根据实际需要改变
内容
数组存储的是同一种类型的元素
集合可以存储不同类型的元素
数据类型
数组可以存储基本数据类型,也可以存储引用数据类型
集合只能存储引用类型
注意:虽然集合不能存储基本数据类型,但是可以存储基本数据类型的包装类类型
集合框架体系图
collection
集合层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。
一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
集合的设计
* 因为集合有很多 增删查改的方法,而且集合是一套框架,既然是框架那么每一种集合处理增加删除修改遍历的方式不一样
* Collection的特点
* 1.部分集合是有序的,部分集合是无序的,这里的有序指的是存储有序
* 2.部分集合是可排序的,部分集合是不可排序
* 3.部分集合是可重复的,部分集合是不可重复,唯一的
*
* 那么既然每一个集合的特点不一样,那么就取决于所有子类的实现方式不一样,但是我们知道,既然是集合就应该具备集合的特点:
* 1.长度可变的
* 2.能够存储任意的引用类型
* 3.具备很多对对象进行增删查改的方法
* 4.集合也能够存储基本类型的包装类类型,更加扩展了int的一些功能
* 但是实现方式不一样
* 实现方式不一样取决于底层的数据结构不一样
* 数据结构: 数据的存储方式
* 算法: 递归 冒泡 选择
* 学习集合就一定要学习集合相关的数据结构
* 集合涉及的数据结构: 栈 , 队列, 链表, 数组, 哈希表 , 二叉树
*
* 1.添加功能
* boolean add(Object obj)
* boolean addAll(Collection c)
* 2.删除功能
* void clear()
* boolean remove(Object o)
* boolean removeAll(Collection> c)
* 3.修改功能
* 4.遍历功能
* Object[] toArray()
* Iterator
*
* 5.判断功能
* boolean contains(Object o)
* boolean containsAll(Collection> c)
* boolean isEmpty()
* 6.其他功能
* boolean retainAll(Collection> c)
* 7.获取集合长度的功能
* int size()
*
*/
public class CollectionDemo02 {
public static void main(String[] args) {
Collection c = new ArrayList();
System.out.println(c);
// boolean add(Object obj)
c.add("张三");
c.add("李四");
c.add("王五");
System.out.println(c);
// boolean addAll(Collection c)
Collection c1 = new ArrayList();
c1.add("关羽");
c1.add("赵云");
c1.add("吕布");
c.addAll(c1);
System.out.println(c);
System.out.println(c1);
// void clear()
System.out.println("--------------");
// c.clear();
System.out.println(c);
// boolean remove(Object o)
System.out.println("remove:" + c.remove("张三"));
System.out.println(c);
// boolean removeAll(Collection> c)
// System.out.println("remove:" + c.removeAll(c1));
System.out.println(c);
System.out.println("------------------");
System.out.println("boolean contains(Object o): " + c.contains(""));
System.out.println("abc".contains(""));
// boolean containsAll(Collection> c)
System.out.println(c);
Collection c2 = new ArrayList();
c2.add("吕布");
System.out.println("boolean containsAll(Collection> c) :" + c.containsAll(new ArrayList<>()));
System.out.println("boolean containsAll(Collection> c) :" + c.containsAll(c2));
// c: [李四, 王五, 关羽, 赵云, 吕布] new ArrayList<>(): []
// c.clear();
// boolean isEmpty()
// System.out.println("boolean isEmpty() :" +c.isEmpty());
// boolean retainAll(Collection> c)
System.out.println(c); // c:[李四, 王五, 关羽, 赵云, 吕布] 交集 [李四,曹操] = c:[李四]
/*
* c:[李四, 王五, 关羽, 赵云, 吕布] 交集 [李四,曹操] = c:[李四]
* c:[李四, 王五, 关羽, 赵云, 吕布] 交集 [李四123,曹操] = c:[]
* c:[李四, 王五, 关羽, 赵云, 吕布] 交集 [张三, 李四, 王五, 曹操, 关羽, 赵云, 吕布] = c:[李四, 王五, 关羽, 赵云, 吕布]
*/
Collection c3 = new ArrayList<>();
c3.add("张三");
c3.add("李四");
c3.add("王五");
c3.add("曹操");
c3.add("关羽");
c3.add("赵云");
c3.add("吕布");
System.out.println(c3);
// System.out.println("boolean retainAll(Collection> c) " + c.retainAll(c3));
// System.out.println(c);
System.out.println("boolean retainAll(Collection> c) " + c.retainAll(c3));
System.out.println(c);
// 求交集,返回的结果是观察原集合是否发生改变 改变了返回true,没改变返回false
System.out.println(c.size());
}
}
/*
* 4.遍历功能
* Object[] toArray()
* Iterator
* boolean hasNext(); 判断是否有下一个元素
* E next(); 获取下一个元素,并且指针指向下一个元素的位置
*
* java.util.NoSuchElementException
* 异常名称: 没有下一个元素异常
* 产生原因: 迭代器遍历的时候没有下一个元素了
* 解决办法:在迭代器迭代之前做判断
*
*/
public class CollectionDemo03 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("李逵");
c.add("武松");
c.add("武大郎");
System.out.println(c);
Object[] arrs = c.toArray();
for (int i = 0; i < arrs.length; i++) {
System.out.println(arrs[i]);
}
System.out.println(arrs[1]);
System.out.println("-------------------------");
// 获取和集合有关的迭代器对象
// Iterator it = c.iterator();
// if (it.hasNext()) {
// Object oj = it.next();
// System.out.println(oj);
// }
// if (it.hasNext()) {
// Object oj = it.next();
// System.out.println(oj);
// }
// if (it.hasNext()) {
// Object oj = it.next();
// System.out.println(oj);
// }
// if (it.hasNext()) {
// Object oj = it.next();
// System.out.println(oj);
// }
//
// Iterator it = c.iterator();
// while(it.hasNext()) {
// Object oj = it.next();
// System.out.println(oj);
// }
iterator接口
对 collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration,迭代器依赖于集合而存在。
boolean hasNext()
如果仍有元素可以迭代,则返回 true。
E next()
返回迭代的下一个元素。
注意:
抛出: NoSuchElementException - 没有元素可以迭代。
void remove()
返回迭代的当前元素。
迭代器原理
for(Iterator it = c.iterator();it.hasNext();) {
Object oj = it.next();
System.out.println(oj);
}
System.out.println("-------------------");
// foreach遍历
/*
* foreach就是用来遍历集合或者数组的
* 格式:
* for(元素类型 元素 : 集合或者数组){
* 对元素进行响应的操作
* }
*/
for (Object obj : arrs) {
System.out.println(obj);
}
int[] arr = new int[5];
arr[0] = 25;
arr[1] = 235;
for (int i : arr) {
System.out.println(i);
}
}
}