1.集合的由来:
数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少 。
集合和数组的区别:
* 数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
* 集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象
* 数组长度是固定的,不能自动增长
* 集合的长度的是可变的,可以根据元素的增加而增长
2.集合体系框架:
一张图说明问题:
3.Collection的基本功能:
collection是一个接口,是不能直接创建对象的;
基本功能演示
boolean add(E e)
boolean remove(Object o)
void clear()
boolean contains(Object o)
boolean isEmpty()
int size()
add方法如果是List集合一直都返回true,因为List集合中是可以存储重复元素的
如果是Set集合当存储重复元素的时候,就会返回false
public static void demo1() {
Collection c = new ArrayList(); //父类引用指向子类对象
boolean b1 = c.add("abc");
boolean b2 = c.add(true); //自动装箱new Boolean(true);
boolean b3 = c.add(100);
boolean b4 = c.add(new Student("张三",23));
boolean b5 = c.add("abc");
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);
System.out.println(b5);
System.out.println(c.toString());
}
public static void main(String[] args) {
//demo1();
Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
//c.remove("b"); //删除指定元素
//c.clear(); //清空集合
//System.out.println(c.contains("b")); //判断是否包含
//System.out.println(c.isEmpty());
System.out.println(c.size()); //获取元素的个数
System.out.println(c);
}
集合的遍历之集合转数组遍历
Collection coll = new ArrayList();
coll.add(new Student("张三",23)); //Object obj = new Student("张三",23);
coll.add(new Student("李四",24));
coll.add(new Student("王五",25));
coll.add(new Student("赵六",26));
Object[] arr = coll.toArray(); //将集合转换成数组
for (int i = 0; i < arr.length; i++) {
Student s = (Student)arr[i]; //强转成Student
System.out.println(s.getName() + "," + s.getAge());
}
boolean addAll(Collection c) //将一个集合添加到另一个集合中
boolean removeAll(Collection c) //移除一个集合;删除的是两个集合交集;
boolean containsAll(Collection c) //一个集合是否包含另一个集合;这种包含是判断是否包含另个集合中的元素;判断的是元素是否包含
boolean retainAll(Collection c) //取交集,如果取得交集赋值给调用的集合,如果没有交集则也会赋值给调用者,返回true,如果调用的集合被赋值后和原来的不变就返回false
迭代器:
* 迭代器的使用
Collection c = new ArrayList();
c.add("a");
c.add("b");
c.add("c");
c.add("d");
Iterator it = c.iterator(); //获取迭代器的引用
while(it.hasNext()) { //集合中的迭代方法(遍历)
System.out.println(it.next());
}
迭代器原理
迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可 。
4.List结合接口
List集合的特有功能概述
* void add(int index,E element)//在指定位置添加元素;使用不存的位置时会出异常;
* E remove(int index)//通过索引删除元素;
* E get(int index)//根据索引获取元素;
* E set(int index,E element)//根据索引修改元素;
需求:我有一个集合,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("d");
list.add("e");
/*Iterator it = list.iterator();
while(it.hasNext()) {
String str = (String)it.next();
if(str.equals("world")) {
list.add("javaee"); //这里会抛出ConcurrentModificationException并发修改异常
}
}*/
C:解决方案
* a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
* b:集合遍历元素,集合修改元素
ListIterator lit = list.listIterator(); //如果想在遍历的过程中添加元素,可以用ListIterator中的add方法
while(lit.hasNext()) {
String str = (String)lit.next();
if(str.equals("world")) {
lit.add("javaee");
//list.add("javaee");
}
}
(ListIterator)中的方法:
* boolean hasNext() //是否有下一个
* boolean hasPrevious() //是否有前一个
* Object next() //返回下一个元素
* Object previous(); //返回上一个元素
在List有三个子类:ArrayList,Vector和LinkedList,前两者是通过数组的实现的,后者是通过链表结构实现的;Vector已经基本上不用了,被ArrayList取代了;有一个工具类可以将ArrayList变成线程安全的;
数组:查询,修改速度快;增加和删除慢;(通过索引直接找值;增删会重新创建数组,所以慢)
链表:查询,修改慢,增加和删除快;(一个元素保存了前后的元素的索引,当查询的时候从头开始查;增删的是时候打开链子,保存前后索引就可以了,所以快);在LinkedList中有个get(index),这种看似直接取值的,其实内部原理是折半查找;
List的三个子类的特点:
ArrayList:底层数据结构是数组,查询快,增删慢。 线程不安全,效率高。
Vector:底层数据结构是数组,查询快,增删慢。 线程安全,效率低。
LinkedList:底层数据结构是链表,查询慢,增删快。 线程不安全,效率高。