一.集合
1.集合概述:由于我们使用的是面向对象语言,所以,我们要经常使用对象,而很多时候我们需要使用很多对象,而用数组对对象进行存储,长度是固定的,不适用于变化的数据.所以,java提供了一种容器,用于存储对象,这种容器就叫做集合.
2.集合和数组的区别:
(1)集合
a.集合长度可变
b.集合只能存储引用数据类型
c.集合可以存储多种数据类型
(2)数组
a.数组长度是固定的
b.数组可以存储基本数据类型和引用数据类型
c.数组只能存储一种数据类型
3.collection集合的体系结构
4.迭代器
a.概念:按照某种方式重复的做事情,主要用于遍历集合中的元素
b.迭代器定义为接口而不是类的原理:由于集合的数据结构不同,数据存储的方式也就不同,取出的方式也不同.定义为具体的实现类是不合适的,使用的时候,通过内部类实现
c.常见问题:ConcurrentModificationException:并发修改异常
原因:在迭代的时候给集合增加或删除元素造成的
d.Iterator 和ListIterator的区别
A.Iterator是ListIterator的父接口
B.Iterator是Collection集合的公共的取出容器中元素的方式,对于List,Set都通用,ListIterator只能是List的方式
C.ListIterator具备对遍历的元素进行增删改查的方法,不会出现ConcurrentModificationException:并发修改异常
e.for 循环遍历和迭代器遍历的区别
A.最主要的区别就是remove方法,想要在循环的过程中删除元素就要用迭代器,因为迭代器的remove方法不仅会删除元素,还会维护一个标志,用了记录当前状态是不是可删除。而for循环脚标是变化的,删除元素会报错,因为list.size()大小发生变化了
B.ArrayList里面维护的是数组,顺序结构,所以用get方法获取比较快,因而用for循环
LinkedList里面维护的是链表,链式结构,Iterator中的next()方法,采用的即是顺序访问的方法,因此用迭代器比较快
5.增强for
a.格式:
for(对象的类型 变量名 : 对象名)
{
直接使用变量
}
b.好处:方便数组和集合的遍历
c.注意事项:增强for是用来代替Iterator的,不要在遍历的时候对集合进行修改
6.集合遍历的方式
a.增强for
b.迭代器
c.List 中可以用普通for ,通过get()方法
7.泛型
a.概念:泛型是一种把明确数据类型的工作放在创建对象或调用方法的时候才明确的特殊的类型
b.好处:
解决了黄线警告的问题
将系统运行期间的问题提前到了编译期
优化了程序设计,不用强制转换了
c.不足:泛型传入的只能是引用数据类型
d.在类上定义 : public class Student<T>{}
e.在方法上定义: public <T> void method(T s){}
f.在接口上定义:public class Student implements Person<T>{}
g.在类上定义两个泛型: public class MyArrayList<T, S >
h.泛型的使用:可以在继承关系,实现关系,创建对象时使用
j.泛型高级通配符? / ? extends E / ? super E
8.Collection和Collections的区别
a.Collection是Collection集合的顶层接口,定义了Collection集合的共性方法
b.collections是一个类,定义了针对Collection集合操作的功能.有排序,查找,反转等
9.针对Collection集合我们到底使用谁
唯一吗?
是:Set
排序吗?
是:TreeSet
否:HashSet
如果你知道是Set,但是不知道是哪个Set,就用HashSet。
否:List
要安全吗?
是:Vector
否:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList
如果你知道是List,但是不知道是哪个List,就用ArrayList。
有对应关系 ,用Map
如果你知道是Collection集合,但是不知道使用谁,就用ArrayList。
如果你知道用集合,就用ArrayList。
10.TreeSet排序的两种实现方式
A:自然排序(元素具备比较性) TreeSet的无参构造,要求对象所属的类实现Comparable接口。
B:比较器排序(集合具备比较性)TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。
11.Map和Collection的区别?
A:Map 存储的是键值对形式的元素,键唯一,值可以重复。夫妻对
B:Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复
二.集合各类和接口中常用方法
1.Collection中常用的方法
a.boolean add(obj) 向集合中添加元素
b.boolean remove(obj) 删除集合中的指定元素
c.boolean isEmpty() 判断集合是否为空
d.boolean contains(obj) 判断集合中是否存在指定元素
e.int size() 获取集合中元素的个数
f.Iterator iterator() 遍历
2.List中常用的成员方法
a.void add(int index,obj ) 在指定位置添加元素
b.Object remove(int index) 删除指定位置的元素
c.Object set (int index,obj) 把指定位置的元素改为指定的值,返回之前的值
d.Object get(int index) 获取集合中指定位置的元素
e.int indexOf(obj) 返回指定元素在集合中第一次出现的索引
f.ListIterator listIterator() 列表迭代器
g.List subList(int fromIndex,int toIndex) 截取集合
3.Vector类
a.void addElement(obj) 添加
b.Object elementAt(int index) 获取元素
c.Enumeration elements() 获取所有元素
d.int size() 获取集合中元素的个数
4.LinkedList类
a.void addFirst(Object o) 在第一个索引位置添加
b.void addLast(Object o)
c.Objcet getFirst() 获取第一个索引位置的元素
d.Objcet getLast()
e.Object removeFirst() 删除第一个索引位置的元素
f.Object removeLast()
5.Collections类
a.void sort(List list) 排序
b.binarySearch(List list,obj) 二分查找
c.reverse 反转
d.max(Collection c) 最大值
e.shuffer(List list ) 随机置换