学习日记40--java学习--集合框架2

  1. ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)—两种方法。

    import java.util.ArrayList;
    import java.util.Iterator;
    
    import com.heima.bean.Person;
    
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public class Demo2_ArrayList {
    
        /**
         * * A:案例演示
                * 需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
            * B:注意事项
                * 重写equals()方法的
            contains方法判断是否包含,底层依赖的是equals方法
            remove方法判断是否删除,底层依赖的是equals方法
         */
        public static void main(String[] args) {
            ArrayList list = new ArrayList();               //创建集合对象
            list.add(new Person("张三", 23));
            list.add(new Person("张三", 23));
            list.add(new Person("李四", 24));
            list.add(new Person("李四", 24));
            list.add(new Person("李四", 24));
            list.add(new Person("李四", 24));
            //方法1
            //ArrayList newList = getSingle(list);          //调用方法去除重复
            //System.out.println(newList);
            //方法2
            list.remove(new Person("张三", 23));
            System.out.println(list);
        }
    
        /*
         * 创建新集合将重复元素去掉
         * 1,明确返回值类型,返回ArrayList
         * 2,明确参数列表ArrayList
         * 
         * 分析:
         * 1,创建新集合
         * 2,根据传入的集合(老集合)获取迭代器
         * 3,遍历老集合
         * 4,通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加
         */
        public static ArrayList getSingle(ArrayList list) {
            ArrayList newList = new ArrayList<>();                  //1,创建新集合
            Iterator it = list.iterator();                          //2,根据传入的集合(老集合)获取迭代器
    
            while(it.hasNext()) {                                   //3,遍历老集合
                Object obj = it.next();                             //记录住每一个元素
                if(!newList.contains(obj)) {                        //如果新集合中不包含老集合中的元素
                    newList.add(obj);                               //将该元素添加
                }
            }
    
            return newList;
        }
    }
    *.  注意!:对上述例子需要重写equals方法,用于判断两个对象的属性相等。
        ```
        @Override
            public boolean equals(Object obj) {
                Person p = (Person)obj;
                return this.name.equals(p.name) && this.age == p.age;
            }
        ```  
    
  2. 栈和队列数据结构


      • 先进后出
    • 队列
      • 先进先出
  3. 用Linklist模拟栈数据结构,进栈和出栈

    import java.util.LinkedList;
    
    public class Demo4_LinkedList {
    
        /**
         * 用LinkedList模拟栈结构
         */
        public static void main(String[] args) {
            //demo1();
            Stack s = new Stack();
            s.in("a");                              //进栈
            s.in("b");
            s.in("c");
            s.in("d");
    
            while(!s.isEmpty()) {                   //判断栈结构是否为空
                System.out.println(s.out());        //弹栈
            }
        }
    
        public static void demo1() {
            LinkedList list = new LinkedList();                 //创建集合对象
            list.addLast("a");
            list.addLast("b");
            list.addLast("c");
            list.addLast("d");
    
            /*System.out.println(list.removeLast());
            System.out.println(list.removeLast());
            System.out.println(list.removeLast());
            System.out.println(list.removeLast());*/
    
            while(!list.isEmpty()) {
                System.out.println(list.removeLast());
            }
        }
    
    }

    创建一个类stack将Linked中的方法封装

    import java.util.LinkedList;
    
    public class Stack {
        private LinkedList list = new LinkedList();
    
        /*
         * 模拟进栈方法
         */
        public void in(Object obj) {
            list.addLast(obj);
        }
    
        /*
         * 模拟出栈
         */
        public Object out() {
            return list.removeLast();
        }
    
        /*
         * 模拟栈结构是否为空
         */
    
        public boolean isEmpty() {
            return list.isEmpty();
        }
    }
  4. 泛型(generic)概述和基本使用

    • 泛型概述:泛型程序设计是程序设计语言的一种风格或范式。允许程序员在编写代码时使用一些以后才指定的类型,在实例化时(instantiate)作为参数指明这些类型。
    • 泛型好处
      • 提高安全性(将运行期的错误转换到编译期)
      • 省去强转的麻烦
    • 泛型基本使用
      • 在类旁边放一个<>,在其中放的必须是引用数据类型
    • 泛型使用注意事项
      • 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)
  5. 注意:在一个语句中,next方法只能调用一次,不能重复调用来获取同一值,因为如果调用多次会将指针向后移动多次。

  6. 泛型类
    • A:泛型类概述
    • 把泛型定义在类上* B:定义格式
    • public class 类名<泛型类型1,…>
    • C:注意事项
    • 泛型类型必须是引用类型
    • A:泛型方法概述
    • 把泛型定义在方法上
    • B:定义格式
    • public <泛型类型> 返回类型 方法名(泛型类型 变量名)
  7. 静态方法static必须声明自己的泛型,与类的泛型无关
  8. 集合框架(增强for的概述和使用)(jdk1.5新特性)

    • A:增强for概述
    • 简化数组和Collection集合的遍历
    • B:格式:
      for(元素数据类型 变量 : 数组或者Collection集合) {
      使用变量即可,该变量就是元素
      }
    • C:案例演示
          public static void demo1() {
              int[] arr = {11,22,33,44,55};
              for (int i : arr) {
                  System.out.println(i);
              }
      
              ArrayList<String> list = new ArrayList<>();
              list.add("a");
              list.add("b");
              list.add("c");
              list.add("d");
      
              for (String string : list) {    //for循环用 fore + alt + / 可快速完成
                  System.out.println(string);
              }
          }
      
          public static void demo2() {
              ArrayList<Person> list = new ArrayList<>();
              list.add(new Person("张三", 23));
              list.add(new Person("李四", 24));
              list.add(new Person("王五", 25));
              list.add(new Person("赵六", 26));
      
              for (Person person : list) {
                  System.out.println(person);
              }
          }
  9. 三种迭代删除方法测试(重要)

    public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<>();
            list.add("a");
            list.add("b");
            list.add("b");
            list.add("c");
            list.add("d");
    
            //1,普通for循环删除,索引要--
            /*for(int i = 0; i < list.size(); i++) {
                if("b".equals(list.get(i))) {
                    list.remove(i--);                           //通过索引删除元素
                }
            }*/
    
            //2,迭代器删除
            /*Iterator<String> it = list.iterator();
            while(it.hasNext()) {
                if("b".equals(it.next())) {
                    //list.remove("b");                         //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常
                    it.remove();
                }
            }*/
            //迭代器的另一种写法
            /*for(Iterator<String> it2 = list.iterator(); it2.hasNext();) {    //指针++操作,隐藏于next()中,无需再写
                if("b".equals(it2.next())) {
                    //list.remove("b");                         //不能用集合的删除方法,因为迭代过程中如果集合修改会出现并发修改异常
                    it2.remove();
                }
            }*/
            //3,增强for循环,增强for循环不能删除,只能遍历
            for (String string : list) {
                if("b".equals(string)) {
                    list.remove("b");    //ConcurrentModificationException,报错,并发修改异常
                }
            }
            System.out.println(list);
        }
    
    • A:静态导入概述(jdk1.5新特性,开发时一般不用,了解即可)
    • B:格式:
      • import static 包名….类名.方法名;
      • 可以直接导入到方法的级别
    • C:注意事项
      • 方法必须是静态的,如果使用中有多个同名的静态方法,容易不知道使用谁?这个时候要使用,还要再加前缀。由此可见,意义不大,所以一般不用。
    • A:可变参数概述
      • 定义方法的时候不知道该定义多少个参数
    • B:格式
      • 修饰符 返回值类型 方法名(数据类型 … 变量名){}
    • C:注意事项:
      • 可变参数其实是一个数组
      • 可变参数可以不给他赋值
      • 如果一个方法有可变参数,并且有多个参数,那么,要把可变参数放在最后一个
  10. Java中处理数组的类:Array,Arrays,ArrayList,List,ListIterator

  11. 转。Arrays类的常用方法
  12. 数组转集合和集合转数组实例

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    public class Demo4_AsList {
    
    /**
     * 数组转换成集合
     * 数组转换成集合虽然不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法
     */
    public static void main(String[] args) {
    demo1();
    demo2();
    demo3();
    }
    
    public static void demo3() {//方法:集合转数组,加泛型的
    ArrayList<String> list = new ArrayList<>();//创建集合,此集合非彼集合Set
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    String[] arr = list.toArray(new String[10]);//当集合转换数组时,数组长度如果是小于等于集合的size时(如本例0,1,2,3,4),转换后的数组长度等于集合的size
    //如果数组的长度大于了size,分配的数组长度就和你指定的长度一样
    for (String string : arr) {//数组arr是不能直接打印的
    System.out.println(string);
    }
    }
    
    public static void demo2() {//方法:整数数组转集合
    //int[] arr = {11,22,33,44,55};
    //List<int[]> list = Arrays.asList(arr);//基本数据类型的数组转换成集合,会将整个数组当作一个对象转换
    //System.out.println(list);//结果是数组的地址值,即存储了一个数组元素作为集合
    Integer[] arr = {11,22,33,44,55};//将数组转换成集合,数组必须是引用数据类型
    List<Integer> list = Arrays.asList(arr);
    System.out.println(list);
    }
    
    public static void demo1() {//方法:String数组转集合
    String[] arr = {"a","b","c"};
    List<String> list = Arrays.asList(arr);//将数组转换成集合
    //list.add("d");//报错!数组转集合不能添加或减少
    System.out.println(list);
    }
    }
  13. 转!集合和数组的比较

    数组Array和集合的区别:
    [补充 :数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。]
    (1)数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)
    
    (2)JAVA集合可以存储和操作数目不固定的一组数据。 (3)若程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。
    
    联系:使用相应的toArray()和Arrays.asList()方法可以互相转换。
    
    一.集合的体系结构:
    
    ListSetMap是这个集合体系中最主要的三个接口。 ListSet继承自Collection接口。 Map也属于集合系统,但和Collection接口不同。
    
    Set不允许元素重复。HashSet和TreeSet是两个主要的实现类。Set 只能通过游标来取值,并且值是不能重复的。
    
    List有序且允许元素重复。ArrayList、LinkedList和Vector是三个主要的实现类。 ArrayList 是线程不安全的, Vector 是线程安全的,这两个类底层都是由数组实现的 LinkedList 是线程不安全的,底层是由链表实现的
    
    Map 是键值对集合。其中key列就是一个集合,key不能重复,但是value可以重复。 HashMap、TreeMap和Hashtable是Map的三个主要的实现类。 HashTable 是线程安全的,不能存储 null 值 HashMap 不是线程安全的,可以存储 null 值
    
    二.List和ArrayList的区别
    
      1.List是接口,List特性就是有序,会确保以一定的顺序保存元素.
    
      ArrayList是它的实现类,是一个用数组实现的List.
    
      Map是接口,Map特性就是根据一个对象查找对象.
    
      HashMap是它的实现类,HashMap用hash表实现的Map,就是利用对象的hashcode(hashcode()是Object的方法)进行快速散列查找.(关于散列查找,可以参看<<数据结构>>)
    
      2.一般情况下,如果没有必要,推荐代码只同List,Map接口打交道.
    
      比如:List list = new ArrayList();
    
      这样做的原因是list就相当于是一个泛型的实现,如果想改变list的类型,只需要:
    
      List list = new LinkedList();//LinkedList也是List的实现类,也是ArrayList的兄弟类
    
      这样,就不需要修改其它代码,这就是接口编程的优雅之处.
    
      另外的例子就是,在类的方法中,如下声明:
    
      private void doMyAction(List list){}
    
      这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数.
    
      3.如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制你的自定义类.
  14. 泛型和集合的区别

    泛型与集合的区别
    泛型听起来很高深的一个词,但实际上它的作用很简单,就是提高c#程序的性能。
    比如在计算机中经常用到一些数据结构,如队列,链表等,而其中的元素以前一般这么定义:object a=new object();
    这样就带来一个严重的问题,用object来表示元素没有逻辑问题,但每次拆箱、封箱就占用了大量的计算机资源,导致程序性能低下,而这部分内容恰恰一般都是程序的核心部分,如果使用object,那么程序的表现就比较糟糕。
    而使用泛型则很好的解决这个问题,本质就是在编译阶段就告诉编译器,数据结构中元素的种类,既然编译器知道了元素的种类,自然就避免了拆箱、封箱的操作,从而显著提高c#程序的性能。
    比如List<string>就直接使用string对象作为List的元素,而避免使用object对象带来的封箱、拆箱操作,从而提高程序性能。
    可以自己编个小例子体验一下在使用数据结构时的情形,自然就理解了。

    18.转!Java基础之int和Integer有什么区别?

  15. 集合嵌套及遍历 实例

    import java.util.ArrayList;
    
    public class Demo5_ArrayListArrayList {
    
        /**
         * * A:案例演示
         * 集合嵌套之ArrayList嵌套ArrayList
         * 案例:
         * 我们学科,学科又分为若个班级
         * 整个学科一个大集合
         * 若干个班级分为每一个小集合
         */
        public static void main(String[] args) {
            ArrayList<ArrayList<Person>> list = new ArrayList<ArrayList<Person>>();   //嵌套。右边的<>里内容可不写
    
            ArrayList<Person> first = new ArrayList<>();                //创建第一个班级
            first.add(new Person("a", 30));
            first.add(new Person("aa", 33));
            first.add(new Person("aaa", 20));
    
            ArrayList<Person> second = new ArrayList<>();
            second.add(new Person("b", 31));
            second.add(new Person("bb", 33));
            second.add(new Person("bbb", 32));
    
            //将班级添加到学科集合中
            list.add(first);
            list.add(second);
    
    
            //遍历学科集合
            for(ArrayList<Person> a : list) {       //格式:  for(引用类型名  集合中每一个元素:所在集合)
                for(Person p : a) {
                    System.out.println(p);
                }
            }
        }
    }
    
     class Person {      // 一般把类写在独立的class中,本例仅做演示
        private String name;
        private int age;
        public Person() {
            super();
    
        }
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
        /*@Override
        public boolean equals(Object obj) {
            Person p = (Person)obj;
            return this.name.equals(p.name) && this.age == p.age;
        }*/
    
    }
  16. jdk1.5-1.8新特性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值