集合概述
1 什么叫集合
集合,也称为Java 类集,是一个动态的对象数组。它对一些实现好的数据结构进行
了包装,从而使用起来更加方便。java中的集合类都在java.util包中。集合就是存储对象最常用的一种方式。
2 集合与数组的区别
从存储的数据类型来看:
可以定义基本类型的数组,用来存储基本类型数据。也可以定义引用类型的数组,存储引用类型的数据;
集合只能存储引用类型,而不能存储基本类型。
从长度来看:
数组一旦定义后,其长度就不能改变;
集合的长度会自动变化。
3 集合的功能
集合可以存取元素!这是对容器的基本功能。
集合还有很多对数据的操作方法,例如查看当前集合中是否包含某个元素、移除指定的元素等功能。
4 java全部集合类结构图
不可能把每个类都学习了。
其中加粗的是重点。
细虚线矩形框:接口
粗虚线矩形框:抽象类
实线矩形框:类
加粗实线矩形框:重点类
实心三角箭头加虚线:可转换
空心三角箭头加虚线:接口间的继承,或抽象类与接口间的实现
空心三角箭头加实线:继承
Comparable与Comparator:与排序相关接口
Collections和Arrays:工具类(操作集合类与操作数组类)
追忆数组
1 基本类型数组使用
2 学生数组使用
3 数组的优缺点
数组长度不可变
数组不能添加删除元素
数组没有操作方法(查看数组中某个元素是否存在等方法)
数组中的元素在内存中是邻居,索引速度天下无敌!
a b cd e f g hd 2
0 1 23 4 5 6 78 9
arr[3]
arr绑定的是arr[0]的地址
集合体系结构
1 学过哪些集合特性的类
数组、StringBuffer、StringBuilder
2 为什么有那么多集合类
每个集合类中有不同的数据存放方式,即数据结构不同。
例如:水杯、书柜、大衣柜都是容器,它们内部存储物件的方式是不同的。
这些集合类总会在某一个领域比较强,而在另一个领域比较弱。
Java为我们提供了这么多集合类的目的就是,让我们在不同的环境下使用不同的集合。
例如现在的手机也有音乐手机、照像手机等。
3 集合共性抽取
无论是什么集合,它们都是集合。所以可以把集合的共性向上抽取,而形成一个体系。在Java集合中的根就是Collection。
当我们学习了Collection的使用,那么就掌握了所有集合的基本操作。(学顶层,用底层)
4 Collection家族介绍
这是我们要学习的Collection内容。
Collection功能介绍
添加功能
boolean add(Object o):添加元素,添加成功返回true。
boolean addAll(Collection c):添加一个集合中所有元素到当前集合对象中。
2 删除功能
boolean remove(Object o):移除元素,移除成功返回true。
boolean removeAll(Collection c):移除指定集合中所有元素,移除成功一个就返回true。
boolean retainAll(Collection c):只保留参数集合中的元素,即取交集。只要移除一个就返回true。
void clear():清空集合,使当前集合长度为0。
3 判断功能
boolean contains(Object o):判断当前集合中是否包含指定元素;
boolean containsAll(Collection c):判断当前集合中是否包含指定集合,只有都包含才返回true;
boolean isEmpty():判断当前集合是否为空,即长度为0。
4 元素个数(集合长度)
int size():获取当前集合中元素的个数
5 转换数组
Object[] toArray():把当前集合对象转换成Object数组。
6 遍历功能
Iterator iterator():获取当前集合的迭代器。
注:什么是遍历:遍历就是把每个元素都访问一次
Collection功能测试
使用ArrayList实现类
1 基本功能测试
boolean add(Object o)
String toString()
int size()
boolean isEmpty()
void clear()
boolean remove(Object o)
boolean contains(Object o)
2 参数为Collection类型的方法测试
boolean removeAll(Collection c)
boolean containsAll(Collection c)
boolean retainAll(Collection c)
遍历集合
1 toString()是否算是遍历集合
2 把集合转换成Object[]数组,再遍历
3 Iterator接口介绍
boolean hasNext():判断当前是否还有下一个元素;
Object next():返回当前元素,让光标向下走
void remove():删除当前元素。你next()出来的元素就是你删除的元素。
4 Collection接口的iterator()方法介绍
iterator() 方法返回的是Iterator接口类型。
任何返回抽象类或接口类型的方法,返回的都是子类或实现类的对象。
查看iterator()方法返回值的真实类型!
你是否关心他的真实类型!
5 Iterator的next()方法出现异常
在迭代器内部会有一个光标,这个光标默认是在第一个元素上。
next()方法会返回当前光标指向的元素,而且next()方法会使光标向下移动。
当已经没有元素时再去next()方法会出异常。
6 配合hasNext()来使用next()方法
while(it.hasNext()) {
it.next();
}
7 不常用的remove()方法
while(it.hasNext()) {
String s = (String)it.next();
if(“xxx”.equals(s)) {
it.remove();
}
}
8 迭代器存在的意义
集合类有很多,但它们的存储数据的方式不同。这说明遍历不同的集合使用的试也就不相同了。无论哪一种集合,都有返回Iterator对象的方法,不同的集合返回的Iterator对象内部的实现是不同的,但我们使用Iterator对象时却没有什么不同。
9 小心使用next()
在每次调用next()之前都要调用hasNext()进行检测,以保证还有元素可以获取。如果连续调用next()就很可能出现异常。例如:
while(it.hasNext()) {
it.next();
it.next()
}
注意:在每次next()之前必须hasNext()!
List概述
有序
可重复
有索引
1 什么是List
有序的Collection,也叫序列(列表)。List是Collection的子接口!List保证元素存入的顺序!也可以包含重复元素。
List与数组更加相似,因为List也有下标。不过List可以添加、移除元素,而且List的长度可以改变。
Java中有两个List:
java.util.List:接口,这是我们要学习的List;
java.awt.List:类,这是GUI组件,不是集合。
2 把List当成Collection来使用
List list = new ArrayList();
list.add("hello");
list.add("world");
list.add("list");
Iterator it = new list.iterator();
while(it.hasNext()) {
String str = (String)it.next();
System.out.println(str);
}
因为List是Collection的子接口,所以可以把List当成Collection来使用。List中包含了所有Collection中的方法。
List特有功能
1 List特有功能介绍
void add(int index, Object o):在指定位置index上插入元素o;
boolean add(int index, Collection c):在指定位置index上插入集合c中所有元素。
Object get(int index):获取指定下标位置上的元素;
int indexOf(Object o):获取指定对象在当前集合中的位置;
int lastIndexOf(Object o):同上,但是倒着找;
ListIterator listIterator():返回列表迭代器,这是List独有的!
ListIterator listIterator(int index):返回列表迭代器,只是一段元素的迭代器;
Object remove(int index):移除指定下标位置上的元素,返回被移除的元素;
Object set(int index, Object o):设置指定下标位置上的元素,返回老值;
List sublist(int fromIndex, int toIndex):截取子 List,子列表从fromIndex到toIndex。
因为List也是有索引的,所以很多方法都需要小心下标越界的问题!
2 List一般性方法使用
void add(int index, Object o)
Object remove(int index)
Object set(int index, Object o)
Object get(int index)
boolean add(int index, Collection c)
int indexOf(Object o)
int lastIndexOf(Object o)
问题:在集合类中,N多方法都依赖元素类型的equals()方法才能完成,所以我们必须把元素类型的equals()重写了。
boolean contains(Object o)
boolean remove(Object o)
3 遍历List
使用迭代器来遍历:Iterator it = list.iterator()
使用size()和get()来遍历。
4 获取子列表(subList()方法)
获取子序列:List subList(int fromIndex, int toIndex)
ListIterator介绍
1 ListIterator是什么
ListIterator列表迭代器,它是Iterator的子接口。当然它的功能要比Iterator多一些!只有通过List的listIterator()方法才能获取到ListIterator对象。
列表迭代器是专门为迭代List面存在的!
2 把ListIterator当成Iterator来使用
List list = new ArrayList();
list.add("zhangSan");
list.add("liSi");
list.add("wangWu");
list.add("zhaoLiu");
ListIterator lit = list.listIterator();
while(lit.hasNext()) {
String str = (String)lit.next();
System.out.println(str);
}
3 使用ListIterator向前遍历
boolean hasPrevious():判断是否前一个元素;
Object previous():返回前一个元素;
4 使用ListIterator获取下标
int nextIndex():获取下一个元素的下标
int previousIndex():获取前一个元素的下标
5 ListIterator的添加、删除和设置方法
void add(Object o):添加元素!
void remove():删除元素!
void set(Object o):设置新值!
6 返回从指定位置开始的列表迭代器
ListIterator listIterator(int index)
写一个List,里面多放点字符串;
写一个程序,删除List中所有以s开始的字符串。
对List的添加与删除操作要小心
添加和删除都会改变集合的长度。
1 生成子集的方法
Iterator iterator()
ListIterator listIterator()
List subList(int fromIndex, int toIndex)
2 怎么出现的异常
当获取子集后
对原集合进行了添加或删除操作
然后再使用子集时就会异常。
3 避免异常的出现
在获取子集之前或之后对原集合进行添加删除操作。
对子集进行添加删除操作不会出异常。
对子集进行操作就是对原集合进行操作!
其它功能
1 集合对象的toString()方法会调用元素对象的toString()方法
2 增强for与集合(简单了解一下)
增强for:for(元素类型的变量 : 集合或数组对象) {}
增强for的代码比较简捷,但功能不是很强大。强大的还是老for。
老for可以做的事,新for不一定能行,但新for能做的,老for一定能做。
难道真是除了数组和集合以外,其它东西就不能使用增强for来遍历了么?
如果这个对象是可迭代的(实现了Iterable),那么就可以出现在新for中冒号的右边!
因为只要你实现了Iterable,那么你一定有iterator方法,其实新for就是在使用迭代器来遍历的。
Words ws = new Words(“Hello world java css html xml”);
for(Object o : ws) {
String w = (String)o;
System.out.println(w);
}
/*
Hello
world
java
css
html
xml
*/
备注:null null 比较
是否相等?
Int s1;
Int s2;
先判断s1是否为空,如果为空在和s2比较