第四阶段(15- 18)15集合框架★★★★☆n 集合特点:
集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象。
集合的长度的是可变的,可以根据元素的增加而增长。
n 集合架构:
Collection (接口)
|——List (接口) //可重复
|——ArrayList (类)
|——Vector (类)
|——LinkedList (类)
|——Set (接口) //不可重复
|——HashSet (类)
|——TreeSet (类)
n Collection、List接口
Collection是顶层接口,定义集合规则;
List是有序可重复集合接口,扩展Collection接口规则;
n 迭代器遍历
遍历集合的一种方式,可在迭代器内使用迭代器对象操作集合元素,不可在迭代器内直接用集合对象操作集合元素,否则会报错,ConcurrentModificationException:在迭代的时候给集合增加元素,删除元素(注意:不是通过索引删除)造成的;
- List list = new ArrayList(); //创建一个结合对象
- list.add(1); //为集合添加元素,当添加基本数据类型时,系统自动装箱
- list.add(3);
- Iterator iterator = list.iterator(); //通过iterator()方法,获取迭代器对象
- while(iterator.hasNext()){ //while循环,调用迭代器对象hasNext方法,判断是否有下一个元素
- Integer next = (Integer)iterator.next(); //调用next方法,取出元素,由于获取的元素是Object对象,所以向下转型可以获取存入的对象类型
- System.out.println(next);
- }
- /*for(Iterator = list.iterator;iterator.hasNext;){
- Integer next = (Integer)iterator.next();
- System.out.println(next);
- }*/
复制代码
n 迭代器删除元素
- List list = new ArrayList(); //创建一个结合对象
- list.add(1);
- list.add(3);
- Iterator iterator = list.iterator();
- while(iterator.hasNext()){
- Integer next = (Integer)iterator.next();
- if(next.equals(1)){ //判断,如果元素是1,就删除该元素
- iterator.remove(); //注意,这里是调用迭代器对象的remove方法,而不是集合的remove方法
- }
- System.out.println(next);
- }
- /*for(Iterator = list.iterator;iterator.hasNext;){
- Integer next = (Integer)iterator.next();
- System.out.println(next);
- }*/
复制代码
n 普通for循环删除集合元素
- List c = new ArrayList(); //创建一个集合对象
- c.add("123"); //为集合添加任意元素对象
- c.add(456);
- c.add(new A("789"));
- System.out.println(c); //打印
- for(int i = 0;i < c.size();i++){ //用for循环遍历集合元素
- if(c.get(i).equals("123")){ //通过集合对象get方法获取每一个元素,判断是否是“123”
- c.remove(i); //调用集合对象的remove方法删除对应索引位置的元素
- }
- }
- System.out.println(c);
复制代码
16集合框架★★★★★n 泛型★★★★★
集合内可以添加任意引用类型数据,然而我们通过get()方法获取集合内元素时,被定义为返回Object,一般必须将get()的结果强制类型转换为期望的类型,如下:
- ArrayList list = new ArrayList();
- list.add("abc");
- for(int i =0;i<list.size();i++){
- String s = (String)list.get(i); //list.get(i)返回Object类型对象,需要向下转型才方便使用
- System.out.println(s);
- }
复制代码如果集合内元素不只是一种数据类型,那么上面这种强制转换就是抛异常,ClassCastException(类型转换异常);所以理想就是集合在创建时就规定只能存入的类型,取出元素时,所有元素就一定是同一类型,这就是泛型所做的事。
- ArrayList<String> list = new ArrayList<String>(); //<>尖括号内是想要指定的泛型类型
- list.add("abc"); //添加元素时,只能添加String类型,添加其它类型便会报错
- list.add("xyz");
- for(int i =0;i<list.size();i++){
- String s = list.get(i); //因为使用了泛型,再通过get方法获取元素时,不需要向下转型
- System.out.println(s);
- }
复制代码
l 泛型类★★★☆☆
public class 类名<泛型类型1,…>
- public class Demo_4 {
- public static void main(String[] args) {
- //泛型类,在创建时给定想要的类型
- Point<String,Integer> p = new Point<String,Integer>();
- p.x="abc"; //所以属性 x 的类型就是上面的String类型
- p.y=123;
-
- }
- }
- class Point<T1, T2>{
- T1 x;
- T2 y;
- public T1 getX() {
- return x;
- }
- public void setX(T1 x) {
- this.x = x;
- }
- public T2 getY() {
- return y;
- }
- public void setY(T2 y) {
- this.y = y;
- }
- }
复制代码
l 泛型方法★★★☆☆
public <泛型类型> 返回类型 方法名(泛型类型 变量名)
- public <T>T show(T a){
- T b = a;
- return b;
- }
- public <T>T getMax(boolean bl,T a,T b ){
- return bl ? a : b ;
- }
- public <T,E>void show2( T a,E b ){
- System.out.println("泛型方法:T = " + a + ",E = "+b);
- }
复制代码n 增强for循环★★★★☆
for(元素数据类型变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}
- ArrayList<String> list = new ArrayList<String>();
- list.add("abc");
- list.add("xyz");
- for (String s : list) { //增强for循环,String是集合对象里面的元素类型,s是元素
- System.out.println(s);
- }
复制代码PS.增强for底层是用迭代器实现,但又不能获得迭代器对象,所以不能在循环中操作集合对象;