Java学习第七周
1.集合由来:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类
数组和集合的区别
(1): 长度区别:
数组的长度是固定的而集合的长度是可变的
(2): 存储数据类型的区别:
数组可以存储基本数据类型 , 也可以存储引用数据类型; 而集合只能存储引用数据类型
(3): 内容区别:
数组只能存储同种数据类型的元素 ,集合可以存储不同类型的元素
2.集合中的方法
Collection:
public boolean add(E e) 向集合添加指定元素
public boolean addAll(Collection c) 向集合添加指定集合
public void clear() 清空集合
public boolean remove(Object o) 移除指定元素
public boolean removeAll(Collection c) 移除指定集合
public boolean contains(Object o) 检查集合中是否含有指定元素
public boolean containsAll(Collection c) 检查集合中是否含有指定集合
public boolean isEmpty() 检查集合是否为空
public Iterator iterator() 遍历集合的迭代器
public boolean retainAll(Collection<?> c) 获取俩个集合的交集
public int size() 获取集合的长度
public Object[] toArray() 将集合转换成数组
List:
public void add(int index, Object element) 在集合的指定位置添加指定元素
public Object remove(int index) 移除集合中指定位置的元素
public Object set(int index, Object element) 替换集合中指定位置的元素
public Object get(int index) 返回列表中指定位置的元素
public ListIterator listIterator() 列表迭代器(List集合特有的迭代器)
3.并发修改异常产生的原因及解决方案(在迭代器中产生):
ConcurrentModificationException出现
我们用Iterator这个迭代器遍历采用hasNext方法和next方法,集合修改集合 会出现并发修改异常
原因是我们的迭代依赖与集合 当我们往集合中添加好了元素之后 获取迭代器 那么迭代器已经知道了集合的元素个数,这个时候你在遍历的时候又突然想给 集合里面加一个元素(用的是集合的add方法) 那迭代器不同意 就报错了
解决方案1 我们用ListIterator迭代器遍历 用迭代器自带的add方法添加元素 那就不会报错了
(1):迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
(2):集合遍历元素,集合修改元素
解决方案2 使用for循环遍历集合 添加元素 不会报错
4.List的三个子类的特点
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
使用环境:
考虑线程安全?
是: Vector
否: 查找操作多还是增删操作多?
查找多:ArrayList 增删多:LinkedList
5.集合中的方法
Vector
public void addElement(E obj) 添加指定的元素到这个集合最后
public E elementAt(int index) 返回指定索引的元素
public boolean removeElement(Object obj) 删除指定元素
public void removeElementAt(int index) 删除指定索引处元素
public void setElementAt(E obj, int index) 替换指定索引的元素
public Enumeration elements()
Enumeration
public boolean hasMoreElements() 检查此集合是否包含更多元素
public Object nextElement() 返回此集合的下一个元素
LinkedList
public void addFirst(E e) 在集合最前面插入指定元素
public void addLast(E e) 在集合最后面插入指定元素
public E getFirst() 返回集合第一个元素
public E getLast() 返回集合最后一个元素
public E removeFirst() 移除集合第一个元素
public E removeLast() 移除集合最后一个元素
6.ArrayList集合,Vector集合,LinkedList集合的各种遍历方式:
见课后作业day16
**7.泛型概述:**是一种把类型明确的工作
推迟到创建对象
或者调用方法的时候才去明确的特殊的类型。
参数化类型,把类型当作参数一样的传递。
好处: 把运行时期的问题提前到了编译期间
避免了强制类型转换
优化了程序设计,解决了黄色警告线
泛型只在编译期有效 但在运行期就擦除了
8.泛型类的概述及使用
泛型类概述: 把泛型定义在类上
定义格式: public class 类名<泛型类型1,…>
注意事项: 泛型类型必须是引用类型
格式: public class 类名<数据类型 , …> {}
实例如下:
public class ObjectTools<K> {
private K k ;
public K getK() {
return k;
}
public void setK(K k) {
this.k = k;
}
}
9.泛型方法的概述和使用
泛型方法概述: 把泛型定义在方法上
定义格式: public <泛型类型> 返回类型 方法名(泛型类型 变量名)
实例如下
public class Phone {
public <E> void show(E e){
System.out.println(e);
}
}
10.泛型接口的概述和使用
泛型接口概述: 把泛型定义在接口上
定义格式: public interface 接口名<泛型类型>
实例如下
public interface Inter<T> {
public abstract void show(T t) ;
}
泛型接口的子类: 第一种情况: 就是在定义子类的时候我们已经可以明确数据类型了
public class InterImpl implements Inter<String> {
public void show(String t) {
System.out.println(t);}
}
泛型接口的子类: 第二种情况: 就是在定义子类的时候我们还不知道到底使用神马数据类型.这个时候我们就需要将这个子类也定义成泛型
public class InterImpl<T> implements Inter<T> {
public void show(T t) {
System.out.println(t);
}
}
11.可变参数的概述和使用
可变参数概述: 定义方法的时候不知道该定义多少个参数
格式: 修饰符 返回值类型 方法名(数据类型… 变量名){}
注意事项:
(1): 这里的变量其实是一个数组
(2): 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
(3):注意有单独需要注明的参数需要写在最前面如add(double s,int… a)
// 可变参数
public static int add(int... a){
// 定义一个累加变量
int sum = 0 ;
for(int s : a ){
sum += s ;
}
return sum;
}