------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
Collection派系
day16 01-常用对象API(集合框架-概述)
1、集合是一个容器。
2、集合类的由来:对象用于封装特有数据,对象多了需要存储,如果对象的个数不确定。就使用集合容器进行存储。
3、集合的特点:
①、用于存储对象的容器
②、集合的长度是可变的
③、集合中不可以存储基本数据类型,都是用的封装类,例如Integer
4、集合框架体系图
day16 02-常用对象API(集合框架-体系&共性内容)
1、对于体系的学习:看顶层,用底层。顶层中的内容都是这一体系的共性内容。
Collection在集合框架中的位置:
2、工具包:java.util 接口:Collection
注意Collection是一个接口,里面全都是抽象方法。
3、Collection接口的常用方法
(1)添加:
boolean add(Object obj)——添加对象
boolean addAll(Collection coll)——把集合里的元素全部添加进来
(2)删除:(集合用的是remove,不是delete)
boolean remove(Object obj)——删对象,若集合中有多个该对象,只删第一个
boolean removeAll(Collection coll)——删集合里重复的元素
void clear()——清空
(3)判断
boolean contains(Object obj)——包含对象
boolean containsAll(Collection coll)——包含子集(包含coll中的所有元素),无顺序要求
boolean isEmpty()——判断集合中是否有元素
(4)获取
int size()——返回此Collection中的元素个数
Iterator iterator()——取出元素的方式:迭代器
(5)其他
boolean retainAll(Collection coll)——取交集
Object[] toArray()——将集合转成数组
day16 05-常用对象API(集合框架-Iterator迭代器使用)
1、Iterator接口在集合框架中的位置:
2、java.util包——接口Iterator(迭代器)就三个方法
方法摘要 |
|
boolean |
hasNext() |
next() |
|
void |
remove() |
2、代码示例——迭代器使用方法
public class Demo36 {
public static void main(String args[]){
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
al.add("abc4");
for(Iterator<String> it =al.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
运行结果:abc1 abc2 abc3 abc4
3、特别说明:Iterator取完元素后,再next()就没用了。这时它就占着控件。为了用完它就释放它。我们在开发时一般不用while循环,而用for循环。
4、一个迭代器(以写一次“集合.iterator()”为一个)。观察以下两段代码:
代码示例1:
public class Demo37 {
public static voidmain(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
al.add("abc4");
Iterator<String> it1 = al.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
System.out.println(it1.next());
}
}
运行结果:abc1 abc2 abc3 abc4
Exception in thread "main" java.util.NoSuchElementException
代码示例2:
public class Demo37 {
public static voidmain(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
al.add("abc4");
Iterator<String> it1 = al.iterator();
Iterator<String>it2 = al.iterator();
while(it1.hasNext()){
System.out.println(it1.next());
}
System.out.println(it2.next());
}
}
运行结果:abc1 abc2 abc3 abc4 abc1
day16 06-常用对象API(集合框架-迭代器的原理)
1、迭代器的实现其实是通过内部类完成的。迭代器必须依赖于容器,因为没一个容器的数据结构都不同。所以该迭代器对象是在容器中进行内部实现的。对于使用者而言,具体的实现不重要,只要通过融期货渠道该实现的迭代器对象即可,也就是iterator()方法。Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
day16 07-常用对象API(集合框架-List和Set的特点)
1、List和Set的位置
2、Collection
|
|——List:①有序(存入和取出的顺序一致)②元素都有索引(角标)③与Set不同, | 列表通常允许重复的元素
|
|——Set:①元素不能重复②无序(但是LinkedHashSet是有序的)
day16 08-常用对象API(集合框架-List集合的常见方法)
1、List特有的常用方法,有一个共性特点,就是都可以操作角标。
2、List集合的常见方法
①List集合的“增”
void add(index,element)——在指定角标插入元素
boolean addAll(Collection<? extends E> c)——添加C集合中的所有元素
booleanaddAll(int index, Collection<? extends E> c)——在指定角标,添加C集合中的所有元素
②List集合的“删”
Object remove(index)——删除指定角标的元素,返回被删除的元素(我得知道,我删了谁)
③List集合的“改”
Object set(index,element)——更改指定角标的元素,返回被修改的元素(我得知道,我改了谁)
④List集合的“查”(获取)
Object get(index)——获取指定角标的元素
int indexOf(Object)——正向查找,获取指定元素的角标
int lastIndexOf(Object)——反向查找,获取指定元素的角标
List subList(from,to)——获取子集合,(包含头,不包含尾)
3、代码示例——List集合常用方法演示
public class Demo38 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
//添加元素
list.add("abc1");
list.add("abc2");
list.add("abc3");
System.out.println(list);//运行结果:[abc1, abc2, abc3]
//插入元素
list.add(1, "abc9");
System.out.println(list);//运行结果:[abc1, abc9, abc2, abc3]
//删除元素
System.out.println(list.remove(2));//运行结果:abc2
System.out.println(list);//运行结果:[abc1, abc9, abc3]
//修改元素
System.out.println(list.set(2,"abc0"));//运行结果:abc3
System.out.println(list);//运行结果:[abc1, abc9, abc0]
//获取元素
System.out.println(list.get(1));//运行结果:abc9
//获取子集合
System.out.println(list.subList(0, 2));//运行结果:[abc1, abc9]
}
}
4、add方法与addAll方法的区别(),其余的xx方法与xxAll方法也类似。观察以下两段代码。
代码示例1——add方法:
public class Demo39 {
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add("A");
list1.add("B");
list1.add("C");
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add(list1);
for(Iterator it = list.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
运行结果:abc1 abc2 abc3 [A, B, C]
代码示例2——addAll方法
public class Demo39 {
public static void main(String[] args) {
List list1 = new ArrayList();
list1.add("A");
list1.add("B");
list1.add("C");
List list = new ArrayList();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.addAll(list1);
for(Iterator it = list.iterator();it.hasNext();){
System.out.println(it.next());
}
}
}
运行结果:abc1 abc2 abc3 A B C
5、集合也是一个对象,你add一个集合,相当于把这个集合作为一个整体、一个元素,加了进来。而addAll方法则是把这个集合中的每个元素一一加进来。
day16 09-常用对象API(集合框架-ListIterator)
1、ListIterator在集合框架中的位置
2、List集合除了使用普通的迭代器Iterator之外,还可以使用功能更多的列表迭代器ListIterator。只有List集合能用列表迭代器!
3、ListIterator接口方法摘要,有色彩填充的为新增方法
方法摘要 |
|
void |
|
boolean |
hasNext() |
boolean |
hasPrevious() |
next() |
|
int |
nextIndex() |
previous() |
|
int |
previousIndex() |
void |
remove() |
void |
day16 10-常用对象API(集合框架-List常用子类的特点)
1、List常用子类(3个),Vector、ArrayList、LinkedList在集合框架中的位置
2、List集合常用的3个子类
(1)Vector:内部是数组数据结构(1.0就有了)。Vector是同步的。可变数组原理,100%延长。增删查询都很慢。
(2)ArrayList:内部是数组数据结构。ArrayList是不同步的。可变数组原理,50%延长。增删改查速度快。替代了Vector。
(3)LinkedList:内部是链表数据结构。LinkedList是不同步的。增删元素速度非常快。
day16 12-常用对象API(集合框架-Vector集合)
1、Vector集合中,Enumation接口功能与Iterator接口的功能一模一样。此外,Iterator添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用Iterator接口,而不是Enumeration接口。
2、Enumeration接口
方法摘要 |
|
boolean |
hasMoreElements() |
nextElement() |
3、代码示例,演示Vector集合
public class Demo40 {
public static void main(String[] args) {
Vector v = new Vector();
v.addElement("abc1");
v.addElement("abc2");
v.add("abc3");
v.add("abc4");
System.out.println("------------以下使用Enumeration遍历-----------------");
for(Enumeration en =v.elements();en.hasMoreElements();){
System.out.println("nextelement:" + en.nextElement());
}
System.out.println("------------以下使用Iterator遍历-----------------");
for(Iterator it = v.iterator();it.hasNext();){
System.out.println("next:" + it.next());
}
}
}
运行结果:
------------以下使用Enumeration遍历-----------------
nextelement:abc1
nextelement:abc2
nextelement:abc3
nextelement:abc4
------------以下使用Iterator遍历-----------------
next:abc1
next:abc2
next:abc3
next:abc4
day16 13-常用对象API(集合框架-LinkedList集合)
1、LinkedList(链表)常用方法
void addFirst(E e)——将指定元素插入该列表的开头
void addLast(E e)——将指定元素添加到此列表的结尾
void add(int index,E element)——将指定元素插入到指定位置
E removeFirst()——移除并返回此列表的第一个元素
E removeLast()——移除并返回此列表的最后一个元素
E getFirst()——返回此列表的第一个元素
E getLast()——返回此列表的最后一个元素
E get(int index)——返回此列表中指定位置处的元素
int indexOf(Object o)
day17 14-常用对象API(集合框架-LinkedList集合-练习(堆栈和队列))
1、面试题:请使用LinkedList来模拟一个堆栈或者队列数据结构。LinkedList适合用来实现堆栈与队列。
堆栈:先进后出,后进先出
队列:先进先出
2、代码示例——队列
class DuiLie {
private LinkedList link;
public DuiLie(){
link = new LinkedList();
}
//队列添加元素的功能
public void myAdd(Object obj){
link.addLast(obj);
}
//队列取出元素的功能、
public Object myGet(){
return link.removeLast();
}
public boolean isNull(){
return link.isEmpty();
}
}
public class LinkedTest{
public static void main(String args[]){
DuiLie dl = new DuiLie();
dl.myAdd("abc1");
dl.myAdd("abc2");
dl.myAdd("abc3");
dl.myAdd("abc4");
while(!dl.isNull()){
System.out.println(dl.myGet());
}
}
}
3、LinkedList类中的方法在java版本升级后有了些许变动:
addFirst()
addLast()
在java1.6后
offerFirst()
offerLast()
getFirst()//获取但不移除,如果链表为空,抛出NoSuchElementException
getLast()
在java1.6后
peekFirst()//获取但不移除,如果链表为空,返回null
peekLast()
removeFirst()//获取并移除,如果链表为空,抛出NoSuchElementException
removeLast()
在java1.6后
pollFirst()//获取并移除,如果链表为空,返回null
pollLast()