集合
- 集合概述: 集合相当于一个容器,存储相同类型型的数据;相对于数组的长度固定,集合的长度不固定.
- 集合与数组的区别
相同点:
(1)都是用来存储数据的容器;
(2)都可以通过索引,有规律的操作方式来对数据进行操作;
不同点:
(1)存储的内容不同:
数组既可以存储基本数据类型,也可以存储引用数据类型;
集合只能存储引用数据类型,如果需要存储基本数据类型,其实里面存的是包装类对象;例如想要存储int类型的元素只能用integer包装类;
(2) 存储的数量不同:
数组的长度不可变,一旦确定大小就无法更改;
集合的长度可变,是一个可以伸缩的容器;
(3) 方法不同
数组中只有Object中定义的方法,以及有一个length属性;
集合中可以有很多方法;
3.集合的体系结构:
单列集合:每个元素都是一个单独的个体
双列集合:每个操作都是针对一对数据来进行的,一对数据作为一个单位;
Collection
概述和常用方法
- Collection 收集,集合; 导包 java.util
- Collection是单例集合的顶层接口,定义的是单例集合中共有的功能;
- 有两个子接口一个 set 一个list
- Collection是个接口,没有构造方法不能实例化,需要通过实现类来创建对象,使用接口类型的引用,执行实现类的对象`
//实例化例子=>多态向上转型,可以获取到父类中所有的方法;
Collection collection = new ArrayList();
- 常用的方法
add(Object obj);添加 remove(Object obj);删除 clear();清空 isEmpty();判断集合是否为空; contains(Object obj);判断集合中是否包含obj元素; size();返回集合中元素的个数;
- 四个带all的方法:集合与集合来进行操作 大集合来操作小集合
boolean addAll(Collection<? extends E> c) //集合相加
boolean removeAll(Collection<?> c) //删除两个集合相交的部分;
boolean containsAll(Collection<?> c) //判断两个集合是否含有包含关系不会改变集合
boolean retainAll(Collection<?> c) //获取两个集合中相交的部分,如果集合没有改变则返回false
Collection中的遍历方法
Collection中的第一种遍历方法
- 转换成数组,通过遍历数组的的方式来遍历集合;
- 调用Object[] toArray():将调用者集合转换为Object类型的数组;
Collection中的第二种遍历方法:利用迭代器
- 集合自己内部就应该有一个可以迭代自己的对象,从集合对象中即可获取 Iterator iterator();
- 可以对Collection进行迭代遍历;
- Iterator的常规方法:
boolean hasNext() 用来判断是否有下一个元素,如果有返回true;
E next() 返回就是下一个元素;
void remove() 删除迭代器中的元素;
Iterator iterator() 把集合转换成迭代器; - 操作:调用next()出现的异常
原因:没有下一个元素,在调用next()就会报错;
解决方法:使用hasNext()先判断是否有下一个元素,再进行获取; - 迭代器遍历原理
- Collection遍历代码示例
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionText02 {
public static void main(String[] args) {
Collection col = new ArrayList();
// Student stu01 = new Student(010,"zhangsan",18);
// Student stu02 = new Student(011,"lisi",18);
// Student stu03 = new Student(012,"wangwu",19);
// col.add(stu01);
// col.add(stu02);
// col.add(stu03);
//利用匿名对象进行实例化;简化了代码;
col.add(new Student(010,"zhangsan",18));
col.add(new Student(011,"lisi",18));
col.add(new Student(012,"wangwu",19));
//第一种遍历方法
/* Object[] obj = col.toArray();
for(int i = 0; i < obj.length;i++) {
//将对象向下转型,才能拿到student的属性值;
Student stu = (Student) obj[i];
//通过重写toString方法,获取stu的属性值;
System.out.println(stu.toString());
//通过get方法得到stu的属性值;
System.out.println(stu.getId()+" "+stu.getName()+" "+stu.getAge());
}*/
//第二种遍历.利用迭代器
Iterator ite = col.iterator();
while(ite.hasNext()) {
Object obj = ite.next();
System.out.println(obj);
}
}
}
List
- List是Collection的一个子接口;
- 特点:
有序:list的数据是怎么存入的就怎么取出; 有索引:可以根据索引利用普通的for循环进行遍历; 可以重复,list集合中可以存储重复值的数据;
- List的常规方法:
void add(int index,E element) ==>根据索引来进行增加 E set(int index, E element) ==> 进行索引来进行修改 E remove(int index) ==> 根据索引来进行删除 E get(int index) ==> 根据索引得到具体的对象
- List的实现类:ArrayList,LinkList,Vector;
集合中的第三种遍历方法
- 示例代码
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class ListTest01 {
public static void main(String[] args) {
List li = new ArrayList();
li.add(0, new New(1,"qw","asdf",new Date()));
li.add(1, new New(2,"er","zxcv",new Date()));
li.add(2, new New(3,"ty","bnmj",new Date()));
for (int i = 0; i < li.size();i++) {
//因为新定义的不是object类型所以需要将li.get(i),强制转换为New类型;
New news = (New) li.get(i);
System.out.println(news.toString());
}
}
}
并发异常 ListIterator
- ListIterator也是一个接口,不能实例化,是Iterator的子接口,比Iterator多一些方法
- ListIterator的方法
E previous() ; 返回列表中的前一个元素;
Boolean hasPrevious(); 如过以逆向遍历列表,列表迭代器有多个元素,则返回true;
注意:如果要将集合中的数据倒着输出,需要把迭代器的指针指向最后,调用next(); - 并发异常
出现原因:在使用迭代器遍历集合的同时;使用集合对象增加集合元素;
解决方法:使用迭代器遍历,迭代器添加或者集合遍历集合添加;
ArrayList
- ArrayList是List的一个实现类,可以插入null值;底层是由数组来进行存储的;
- 特点:查询修改快;增加删除慢;
- 没有特别的方法;
LinkedList
- LinkedList也是List的实现类;可以插入null值;
- 提供了一些对头尾进行增加或者是删除的方法;
- 以链表的形式来进行存储;
- 特点:查询慢,增删快;
- LinkedList 常用的方法:
public void addFirst(E e) 将指定元素插入此列表的开头 public void addLast(E e) 将指定元素添加到此列表的结尾 public E removeFirst() 移除并返回此列表的第一个元素 public E removeLast() 移除并返回此列表的最后一个元素 public E getFirst() 返回此列表的第一个元素 public E getLast() 返回此列表的最后一个元素