黑马程序员技术交流社区

标题: 【长沙校区】助你成功!【Java基础笔记】第四阶段集合上 [打印本页]

作者: 袁文博老师    时间: 2016-3-23 15:27
标题: 【长沙校区】助你成功!【Java基础笔记】第四阶段集合上
本帖最后由 袁文博老师 于 2016-3-23 15:27 编辑

同样的课程、老师、就业,更好的学习环境,更低的学习成本!
内地学员,选择长沙校区,靠谱!!!
报名热线:0731-85833115
QQ:51106849
【长沙校区】助你成功!【Java基础笔记】
——每日重点知识展示
第四阶段集合框架 (上)

P.S : 此帖所描述的知识点分等级,五颗黑星为必须掌握熟练的知识点,因为课程后面会频繁使用,若是落下,后期难免陷入听不懂,看不明的囧境;未列出来的知识点同学在上课听懂,课后不用会太多时间专研,先把必须掌握的搞定才是关键!!!
第四阶段(15- 1815集合框架★★★★☆
n  集合特点:
集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象。
集合的长度的是可变的,可以根据元素的增加而增长。
n  集合架构:
Collection                          (接口)
     |——List                      (接口)   //可重复
          |——ArrayList             (类)
          |——Vector               (类)
          |——LinkedList            (类)
     |——Set                      (接口)     //不可重复
          |——HashSet             (类)
          |——TreeSet              (类)
n Collection、List接口
Collection是顶层接口,定义集合规则;
List是有序可重复集合接口,扩展Collection接口规则;
n 迭代器遍历
遍历集合的一种方式,可在迭代器内使用迭代器对象操作集合元素,不可在迭代器内直接用集合对象操作集合元素,否则会报错,ConcurrentModificationException:在迭代的时候给集合增加元素,删除元素(注意:不是通过索引删除)造成的;
  1. List list = new ArrayList();                //创建一个结合对象
  2. list.add(1);                //为集合添加元素,当添加基本数据类型时,系统自动装箱
  3. list.add(3);
  4. Iterator iterator = list.iterator();        //通过iterator()方法,获取迭代器对象
  5. while(iterator.hasNext()){                //while循环,调用迭代器对象hasNext方法,判断是否有下一个元素
  6.       Integer next = (Integer)iterator.next(); //调用next方法,取出元素,由于获取的元素是Object对象,所以向下转型可以获取存入的对象类型
  7.       System.out.println(next);
  8. }

  9. /*for(Iterator = list.iterator;iterator.hasNext;){  
  10.     Integer next = (Integer)iterator.next();  
  11.       System.out.println(next);
  12. }*/
复制代码

n 迭代器删除元素
  1. List list = new ArrayList();                //创建一个结合对象
  2. list.add(1);               
  3. list.add(3);
  4. Iterator iterator = list.iterator();        
  5. while(iterator.hasNext()){               
  6.       Integer next = (Integer)iterator.next();
  7. if(next.equals(1)){        //判断,如果元素是1,就删除该元素
  8.         iterator.remove();        //注意,这里是调用迭代器对象的remove方法,而不是集合的remove方法
  9. }
  10.       System.out.println(next);
  11. }
  12. /*for(Iterator = list.iterator;iterator.hasNext;){  
  13.     Integer next = (Integer)iterator.next();  
  14.       System.out.println(next);
  15. }*/
复制代码

n 普通for循环删除集合元素
  1. List c = new ArrayList();  //创建一个集合对象
  2. c.add("123");                //为集合添加任意元素对象
  3. c.add(456);
  4. c.add(new A("789"));
  5. System.out.println(c);        //打印
  6. for(int i = 0;i < c.size();i++){     //用for循环遍历集合元素
  7.         if(c.get(i).equals("123")){    //通过集合对象get方法获取每一个元素,判断是否是“123”
  8.                 c.remove(i);  //调用集合对象的remove方法删除对应索引位置的元素
  9.         }
  10. }
  11. System.out.println(c);
复制代码

16集合框架★★★★★
n  泛型★★★★★

集合内可以添加任意引用类型数据,然而我们通过get()方法获取集合内元素时,被定义为返回Object,一般必须将get()的结果强制类型转换为期望的类型,如下:
  1. ArrayList list = new ArrayList();
  2.         list.add("abc");
  3.         for(int i =0;i<list.size();i++){
  4.                 String s = (String)list.get(i);    //list.get(i)返回Object类型对象,需要向下转型才方便使用
  5.                 System.out.println(s);
  6. }
复制代码
如果集合内元素不只是一种数据类型,那么上面这种强制转换就是抛异常,ClassCastException(类型转换异常);所以理想就是集合在创建时就规定只能存入的类型,取出元素时,所有元素就一定是同一类型,这就是泛型所做的事。
  1. ArrayList<String> list = new ArrayList<String>();        //<>尖括号内是想要指定的泛型类型
  2. list.add("abc");        //添加元素时,只能添加String类型,添加其它类型便会报错
  3. list.add("xyz");
  4. for(int i =0;i<list.size();i++){
  5.          String s = list.get(i);        //因为使用了泛型,再通过get方法获取元素时,不需要向下转型
  6.          System.out.println(s);
  7. }
复制代码

l  泛型类★★★☆☆

public class 类名<泛型类型1,…>
  1. public class Demo_4 {
  2.         public static void main(String[] args) {
  3.                 //泛型类,在创建时给定想要的类型
  4.                 Point<String,Integer> p = new Point<String,Integer>();
  5.                 p.x="abc";  //所以属性 x 的类型就是上面的String类型
  6.                 p.y=123;        
  7.                
  8.         }
  9. }

  10. class Point<T1, T2>{
  11.     T1 x;               
  12.     T2 y;
  13.     public T1 getX() {
  14.         return x;
  15.     }
  16.     public void setX(T1 x) {
  17.         this.x = x;
  18.     }
  19.     public T2 getY() {
  20.         return y;
  21.     }
  22.     public void setY(T2 y) {
  23.         this.y = y;
  24.     }
  25. }
复制代码

l 泛型方法★★★☆☆

public <泛型类型> 返回类型 方法名(泛型类型 变量名)
  1. public <T>T show(T a){
  2.         T b = a;
  3.         return  b;
  4. }

  5. public <T>T getMax(boolean bl,T a,T b ){
  6.         return  bl ? a : b ;
  7. }

  8. public <T,E>void show2( T a,E b ){
  9.         System.out.println("泛型方法:T = " + a + ",E = "+b);
  10. }
复制代码
n 增强for循环★★★★☆
for(元素数据类型变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
            }
  1. ArrayList<String> list = new ArrayList<String>();         
  2. list.add("abc");         
  3. list.add("xyz");
  4. for (String s : list) {                //增强for循环,String是集合对象里面的元素类型,s是元素
  5.         System.out.println(s);
  6. }
复制代码
PS.增强for底层是用迭代器实现,但又不能获得迭代器对象,所以不能在循环中操作集合对象;









欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2