7月24号_list集合

List的学习

今天的主要内容

  • 集合框架(去除ArrayList中重复字符串元素方式)(掌握)

  • 集合框架(去除ArrayList中重复自定义对象元素)(掌握)

  • 集合框架(LinkedList的特有功能)(掌握)

  • 集合框架(用LinkedList模拟栈数据结构的集合并测试)(掌握)

  • 集合框架(三种迭代的能否删除)(掌握)

  • 集合框架(三种迭代的能否删除)(掌握)

一、集合框架(去除ArrayList中重复字符串元素方式)(掌握)

  1. 案例演示

    • 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)

    • 思路:创建新集合方式

      • 分析:
        1. 创建新集合
        2. 获取老集合中的迭代器
        3. 遍历老集合
        4. 通过新集合判断是否包含老集合中的元素,如果包含则不添加,不包含则添加
    • 此时要注意的是:从老集合中获取,到新的中查看是否存在

2 .程序

        /*
         * * A:案例演示
            * 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
            * 思路:创建新集合方式
            * 
            * 分析:
            *   1. 创建新集合
            *   2. 获取老集合中的迭代器
            *   3.遍历老集合
            *   4. 通过新集合判断是否包含老集合中的元素,如果包含则不添加,不包含则添加
         * */
        public class TestList_1 {
            public static void main(String[] args) {
                ArrayList<String> list = new ArrayList<>();
                
                list.add("haha");
                list.add("xixi");
                list.add("haxi");
                list.add("xiha");
                list.add("haha");
                list.add("xixi");
                list.add("haxi");
                list.add("xiha");
                
                System.out.println("======原集合中元素为======");
                System.out.println(list);
                
                System.out.println("======去重后集合中元素为======");
                System.out.println(getList(list));      
            }
        
            private static ArrayList<String> getList(ArrayList<String> list) {
                //创建新集合
                ArrayList<String> newList = new ArrayList<>();
                
                //获取老集合的迭代器     
                Iterator<String> i = list.iterator();
                
                while(i.hasNext()) {
                    //获取老集合中元素
                    String s = i.next();
                    
                    //如果新集合中不包含则add
                    if(!newList.contains(s))
                        newList.add(s);
                }       
                return newList;
            }
        }
        /*
         在JDK1.8中输出结果为:
        ------------------------------------------------
        ======原集合中元素为======
        [haha, xixi, haxi, xiha, haha, xixi, haxi, xiha]
        ======去重后集合中元素为======
        [haha, xixi, haxi, xiha]
        ------------------------------------------------
        */

二、集合框架(去除ArrayList中重复自定义对象元素)(掌握)

  • 自定义Employee类并存储对象到集合中,然后去重

    • 重写equals()方法的
  • class Employee

      class Employee{
    
          //data field
          private String name;
          private double salary;
          private LocalDate hireDay;
          
          //constructor
          public Employee(String name,double salary,int year,int month,int day){
              this.name = name;
              this.salary = salary;
              this.hireDay = LocalDate.of(year,month,day);
          }
          
          //method
          public String getName(){
              return name;    
          }
          
          public double getSalary(){
              return salary;  
          }
          
          public LocalDate gethireDay(){
              return hireDay;
          }
          
          public void raiseSalary(double byPercent){
              salary += salary * byPercent/100;
          }
          
          public String toString() {
              return "name : " + name + " salary : " + salary + " hireDay : " + hireDay;      
          }
      
          @Override
          public boolean equals(Object obj) {
              if(this == obj)
                  return true;
              
              if(obj == null)
                  return false;
              
              if(this.getClass() != obj.getClass())
                  return false;
              
              Employee e = (Employee)obj;     
              return (this.name.equals(e.name) && this.salary == e.salary && this.hireDay.equals(e.hireDay));
          }
      }           
    
  • class TestList_2

      public class TestList_2 {
          public static void main(String[] args) {
              ArrayList<Employee> list = new ArrayList<>();
              
              list.add(new Employee("haha",200,2018,7,16));
              list.add(new Employee("xixi",200,2018,7,16));
              list.add(new Employee("haxi",200,2018,7,16));
              list.add(new Employee("xiha",200,2018,7,16));
              
              list.add(new Employee("haha",200,2018,7,16));
              list.add(new Employee("xixi",200,2018,7,16));
              list.add(new Employee("haxi",200,2018,7,16));
              list.add(new Employee("xiha",200,2018,7,16));
              
              System.out.println("======原集合中元素为======");
              for(int i = 0;i < list.size();i++) {
                  System.out.println(list.get(i));
              }
              
              System.out.println("======去重后集合中元素为======");
              ArrayList<Employee> newList = getList(list);
              for(int i = 0;i < newList.size();i++) {
                  System.out.println(newList.get(i));
              }
          }
          
          private static ArrayList<Employee> getList(ArrayList<Employee> list) {
              //创建新集合
              ArrayList<Employee> newList = new ArrayList<>();
              
              //获取老集合的迭代器     
              Iterator<Employee> i = list.iterator();
              
              while(i.hasNext()) {
                  //获取老集合中元素
                  Employee s = i.next();
                  
                  //如果新集合中不包含则add
                  if(!newList.contains(s))
                      newList.add(s);
              }       
              return newList;
          }
      }
      /*
       *  在JDK1.8中输出结果为:
       *  --------------------------------------------------------
       *  ======原集合中元素为======
          name : haha salary : 200.0 hireDay : 2018-07-16
          name : xixi salary : 200.0 hireDay : 2018-07-16
          name : haxi salary : 200.0 hireDay : 2018-07-16
          name : xiha salary : 200.0 hireDay : 2018-07-16
          name : haha salary : 200.0 hireDay : 2018-07-16
          name : xixi salary : 200.0 hireDay : 2018-07-16
          name : haxi salary : 200.0 hireDay : 2018-07-16
          name : xiha salary : 200.0 hireDay : 2018-07-16
          ======去重后集合中元素为======
          name : haha salary : 200.0 hireDay : 2018-07-16
          name : xixi salary : 200.0 hireDay : 2018-07-16
          name : haxi salary : 200.0 hireDay : 2018-07-16
          name : xiha salary : 200.0 hireDay : 2018-07-16
          --------------------------------------------------------
       * */
    

三、集合框架(LinkedList的特有功能)(掌握)

  1. LinkedList类概述

    • LinkedList类特有功能
    • public void addFirst(E e)及addLast(E e)
    • public E getFirst()及getLast()
    • public E removeFirst()及public E removeLast()
    • public E get(int index);
  2. 程序

     public class TestLinkedList_1 {
         public static void main(String[] args) {
             LinkedList<String> list = new LinkedList<>();
             
             list.addFirst("1");       //头部插入,插入顺序和输出顺序相反
             list.addFirst("2");
             list.addFirst("3");
             list.addLast("i");     //尾部插入,则输入顺序和输出顺序一致
             list.addLast("love");
             list.addLast("you");;
             
             System.out.println("======list集合中的元素======");
             list.forEach((str) ->{
                 System.out.print (str + "  ");
             });
             
             System.out.println();
             System.out.println();
             
             //获取0号位置上元素
             System.out.println("====get(int index)获取元素====");
             System.out.println("第 0 个位置上元素为:" + list.get(0));
             
             System.out.println();
             
             //删除头部和尾部
             System.out.println("======删除头部和尾部后======");
             list.forEach((str) ->{
                 System.out.print(str + "  ");
             });
         }
     }
     /*
      *  在JDK1.8中输出结果为:
      *  -----------------------------
      *  ======list集合中的元素======
         3  2  1  i  love  you  
     
         ====get(int index)获取元素====
         第 0 个位置上元素为:3
         
         ======删除头部和尾部后======
         -----------------------------
         2  1  i  love  
      * */
    

四、集合框架(用LinkedList模拟栈数据结构的集合并测试)(掌握)

  • 创建Stack类,利用LinkedList来实现进栈、出栈和判空

      class Stack<E> {
          private LinkedList<E> list = new LinkedList<>();
          
          //元素添加
          void add(E e) {
              list.addFirst(e);
          }
          
          //元素取出
          E get() {
              return list.removeFirst();
          }
          
          boolean isEmpty() {
              return list.isEmpty();
          }
      }
    
  • Stack测试类——TestStack

      public class TestStack {
          public static void main(String[] args) {
              Stack<String> stack  = new Stack<>();
              
              stack.add("1");
              stack.add("2");
              stack.add("3");
              stack.add("4");
              
              while(!stack.isEmpty()) {
                  System.out.print(stack.get() + "   ");
              }       
          }
      }
      /*
       * 在JDK1.8中输出结果为:
       * ---------------
       * 4   3   2   1 
       * ---------------
       * */
    

五、集合框架(泛型概述和基本使用)(掌握)

  1. 泛型概述

  2. 泛型好处

    • 提高安全性(将运行期的错误转换到编译期)

    • 省去强转的麻烦

  3. 泛型基本使用

    • <>中放的必须是引用数据类型
  4. 泛型使用注意事项

    • 前后的泛型必须一致,或者后面的泛型可以省略不写

六、集合框架(三种迭代的能否删除)(掌握)

  • 普通for循环,可以删除,但是索引要--

      List<String> list = new ArrayList<>();
      
      list.add("a");
      list.add("b");
      list.add("b");
      list.add("d");
      
      System.out.println("======list中元素======");
      System.out.println(list);
      
      System.out.println("=====删除元素'b'后=====");
      //for循坏进行元素删除
      for(int i = 0;i < list.size();i++) {
          if(list.get(i).equals("b")) {
              //list.remove(i);        
              //remove以后数组元素上移,i本来指向了下一个待检查的元素,但是i++使得指针下移,造成元素遗漏
              list.remove(i--);
          }       
      }
      System.out.println(list);
    
      /*
       * 在JDK1.8中输出结果为:
       * --------------------------
       * ======list中元素======
         [a, b, b, d]
         =====删除元素'b'后=====
         [a, b, d]                   //无法做到正确删除b,i的问题
         -------------------------
       * */
    
  • 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常

      List<String> list = new ArrayList<>();
      
      list.add("a");
      list.add("b");
      list.add("b");
      list.add("d");
      
      System.out.println("======list中元素======");
      System.out.println(list);
      
      System.out.println("=====删除元素'b'后=====");
              
      for(Iterator<String> iterator = list.iterator();iterator.hasNext();) {
          if("b".equals(iterator.next()))
              iterator.remove();          //不可调用集合的remove方法
      }
      
      System.out.println(list);
    
      /*
       *   在JDK1.8中输出结果为:
       *  ------------------------
       *  ======list中元素======
          [a, b, b, d]
          =====删除元素'b'后=====
          [a, d]                      //成功删除
         -------------------------
       * */
    
  • 增强for循环不能删除

    • 有异常,增强的for循坏不可以删除元素,只能遍历

    • 因为增强的for循坏的原理就是迭代器,迭代器中不可以通过集合名称来删除元素

七、集合框架(集合嵌套之ArrayList嵌套ArrayList)(掌握)

  • A:案例演示

    • 集合嵌套之ArrayList嵌套ArrayList
  • 程序

      public class TestMulArrayList {
          public static void main(String[] args) {
              ArrayList<Employee> personList1 = new ArrayList<>();   //第一个部门员工信息
              ArrayList<Employee> personList2 = new ArrayList<>();    //第二个部门员工信息
              
              //为第一个部门员工添加信息
              personList1.add(new Employee("haha", 200, 2018, 7, 24));
              personList1.add(new Employee("xixi", 300, 2018, 7, 24));        
              
              //为第二个部门员工添加信息
              personList2.add(new Employee("haxi", 400, 2018, 7, 24));
              personList2.add(new Employee("xiha", 500, 2018, 7, 24));
              
              ArrayList<ArrayList<Employee>> depList = new ArrayList<>();
              
              depList.add(personList1);
              depList.add(personList2);   
              
              for(ArrayList<Employee> elem : depList) {
                  System.out.println(elem);
              }  
          }
      /* 在JDK1.8中输出结果为:
       * [name : haha salary : 200.0hireDay : 2018-07-24, name : xixi salary : 300.0hireDay : 2018-07-24]
         [name : haxi salary : 400.0hireDay : 2018-07-24, name : xiha salary : 500.0hireDay : 2018-07-24]
       * */
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 7月20号知识点 今天主要内容 集合的由来 Collection集合的基本功能测试 集合的两种基本遍历方式forE...
    须臾之北阅读 184评论 0 0
  • 转载自:Java集合框架实例 1- 介绍 集合是程序和语言的基本思想。应用程序通常都会应用到集合,例如雇员的信息,...
    01_小小鱼_01阅读 392评论 0 1
  • 昨晚排舞结束,看看时间,才8点,索性走路回家。 掏出手机,带上耳塞,打开樊登读书会APP,在“书”...
    李琴7802阅读 347评论 0 2
  • 有一天晚上,女儿跟我说需要一个特殊的本子来写读书笔记(语文老师布置的作业)。我问她家里的那些本子是不是都用完了。她...
    行之舞者阅读 353评论 2 2