zoukankan      html  css  js  c++  java
  • Collection集合。

    Collection集合。

     java.util.Collection 接口。 没有索引

    是所有单列集合的最顶层的接口,里面定义了所有单列集合共性的方法。

    任意的单列集合都可以使用Collecion接口中的方法。

    共性的方法:

    ............................

    Iterator接口

    java.util.Iterator

    迭代器,Collection集合元素的通用取出方式。对集合遍历。  也是有泛型的,跟着集合走

    常用方法: boolean hasNext()  还有没有元素可以迭代。

          next()取出集合的下一个元素。

    获取实现类的方式比较特殊:

    在Collection接口中有一个方法叫 Iterator,这个方法的返回就是迭代器的实现类对象。

    使用步骤:重点

    1、使用集合中的方法,Iterator()获取迭代器的实现类对象,使用Iterator接口接收(多态)

    2、使用hasnext方法,判断是否还有下一个

    3、使用next,取出下一个元素

    代码实现:

     public static void main(String[] args) {
            Collection<String> collection=new ArrayList<>();
            collection.add("科比");
            collection.add("姚明");
            collection.add("乔丹");
           Iterator<String> iterator =collection.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
        }

    Java的foreach:

    内部也是迭代器,简化迭代器的使用:

    public static void main(String[] args) {
            int[] arr={1,2,3,4};
            for(int i : arr){
                System.out.println(i);
            }
        }

     List接口。

    List 接口 extends Collection类。

    List接口的特点:

    1、有序的集合,存储元素和取出元素的顺序是一致的。

    2、有索引,包含了一些索引的方法。

    3、允许重复元素。

    List接口特有的方法:

    注意:操作索引要注意越界问题。

       public static void main(String[] args) {
            /* 创建一个List集合对象,多态。 */
            List<String> list=new ArrayList<>();
            //add 添加元素。
            list.add("a");
            list.add("b");
            list.add("a"); //可重复
            System.out.println(list); //重写了tostring方法。
            // public void add(int index, E elemet);
            list.add(2,"c");
            System.out.println(list);
            //public E remove (int index) 移除指定位置元素,
            //并返回该元素。
            String remove=list.remove(3);
            System.out.println(list);
            System.out.println(remove);
            //public E set(int index, E element)
            //替换指定位置的元素,并返回被替换的值。
            String update=list.set(2,"update");
            System.out.println(list);
            System.out.println(update);
            //List集合遍历有三种方式。
            //1、for
            //2、迭代器。
            //3、foreach
        }

    LinkedList 集合:

    java.util.LinkedList 集合  implements List 接口。

    特有特点:

      链表结构,查询慢,但增删快。

      有大量操作首位元素的方法。

    public static void main(String[] args) {
          //Public void addFirst(E e) =public void push(E e)
            LinkedList<String> linkedList=new LinkedList<>();
            linkedList.add("b");
            linkedList.add("c");
            linkedList.addFirst("a");
            System.out.println(linkedList);
            linkedList.push("push an element");
            System.out.println(linkedList);
            //public void addLast(E e) = add()
            linkedList.addLast("d");
            System.out.println(linkedList);
            //获取元素。
            //getFirst   getLast
            //移除
            // removeFirst  = pop    removeLast
        }

    Set接口:

    特点:

      java.util.Set  extends Collection

      不允许重复

      没有索引,不能用普通的for遍历

    java.util.HashSet 集合   implement Set 接口

    HashSet特点:

      1、无序集合,存元素和取元素的顺序有可能不一致。

      2、底层是哈希表结构   查询速度快。

    哈希表:

    哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑

        地址,是模拟出来的地址看,不是数据实际存储的物理地址)
    Object类有一个方法能获取对象的哈希值。

      int hashCode() 返回该对象的哈希值。

      源码: public native int hashCode()

      native 代表该方法调用的是本地操作系统的方法。

    String类的哈希值:

      重写了Object类的hashCode方法。

    哈希表:

      jdk1.8之前,哈希表=数组+链表   jdk1.8之后, 哈希表还=数组+红黑树(查询快)

    Set不允许重复元素的原理:

    Hash Set存储自定义类型元素:

    需要重写对象中的hashcode 和 equals方法,建立自己的比较方式,

    才能保证 HashSet中的对象唯一。

    //需求:
        //同名同龄的人,视为同一个人,只能存储一次。
    public class main {
        public static void main(String[] args) {
            HashSet<Person> set=new HashSet<>();
            Person p1=new Person("Sam",18);
            Person p2=new Person("Sam",18);
            Person p3=new Person("Penny",19);
            set.add(p1);
            set.add(p2);
            set.add(p3);
            System.out.println(set);
            //[Person{name='Sam', age=18}, Person{name='Penny', age=19}, Person{name='Sam', age=18}]
            System.out.println(p1.hashCode());
            System.out.println(p2.hashCode());
            //1355531311
            //1967205423
        }
    
    
    }

    重写方法后:

      public static void main(String[] args) {
            HashSet<Person> set=new HashSet<>();
            Person p1=new Person("Sam",18);
            Person p2=new Person("Sam",18);
            Person p3=new Person("Penny",19);
            set.add(p1);
            set.add(p2);
            set.add(p3);
            System.out.println(set);
            System.out.println(p1.hashCode());
            System.out.println(p2.hashCode());
            //[Person{name='Sam', age=18}, Person{name='Penny', age=19}]
            //2570228
           // 2570228
    
        }

    LinkedHashSet:

    extends HashSet

    特点:

      底层是哈希表(数组+链表/红黑色) + 链表(用来记录元素的存储顺序)。

      

       public static void main(String[] args) {
        HashSet<String> set=new HashSet<>();
            set.add("c");
            set.add("a");
            set.add("b");
            System.out.println(set);// 无序,不允许重复。
            LinkedHashSet<String> linked=new LinkedHashSet<>();
            linked.add("a");
            linked.add("b");
            linked.add("c");
            System.out.println(linked);//有序,不允许重复
            //[a, b, c]
            //[a, b, c] 
        }

     可变参数:

    jdk 1.5 之后出现。

    前提: 参数列表的数据类型已确定,但参数个数不确定时。

    格式:

      修饰符  返回值类型 方法名 (数据类型...变量名){}

    可变参数原理:

      底层:数组,根据参数个数不同,来创建不同长度的数组,来存储参数。

      参数个数: 0个-多个。

    注意事项:

      1、一个方法的参数列表,只能有一个可变参数。

      2、如果参数有多个,可变参数放最后。

    可变参数的终极写法 :  method(Object...obj)

     public static void main(String[] args) {
        int sum=add(10,20,30);//创建一个长度为三的数组
            System.out.println(sum);
        }
        //计算多个整数的和。
        public  static int add(int...arr){
            int sum=0;
           for(int i:arr)
               sum+=i;
            return sum;
        }

    Collections 工具类:

    java.utils.Collections  是集合工具类,用来对集合进行操作。

    public static void main(String[] args) {
            //public static <T> boolean addAll(Collection<T> c,T...elements)
            //往集合添加多个元素。
            //public static void shuffle(List<T> list)
            //打乱集合顺序。
            ArrayList<String> list=new ArrayList<>();
            Collections.addAll(list,"a","b","c","d");
            System.out.println(list);//[a, b, c, d]
            Collections.shuffle(list);
            System.out.println(list);//[c, d, b, a]
        }
    public static void main(String[] args) {
            //public static <T> void sort(List<T> list)
            //对集合排序,默认升序。
            ArrayList<Integer> list=new ArrayList<Integer>();
            Collections.addAll(list, 1,3,2);
            Collections.sort(list);
            System.out.println(list);
        }

    sort方法的使用前提:

      被排序的集合里边存储的元素,必须实现Comparable,重写接口中的compareTo

      定义排序的规则。

      Compareble 的排序规则:this - 参数  升序  反之。

    public static void main(String[] args) {
           //对Person类型的集合排序。
            ArrayList<Person> personList=new ArrayList<>();
            personList.add(new Person("张三",17));
            personList.add(new Person("李四",19));
            personList.add(new Person("王麻子",15));
            Collections.sort(personList);
            System.out.println(personList);
            //[Person{name='王麻子', age=15}, Person{name='张三', age=17}, Person{name='李四', age=19}]
        }

    Person类:

     @Override
        public int compareTo(Person o) {
            //return 0; 认为元素都是相同的。
            //自定义比较规则,比较两个人的年龄(this,参数Person)
            return this.getAge()-o.getAge(); //年龄升序排序
        }

    Comparator 接口:

     
     public static void main(String[] args) {
        //public static <T> void sort(List<T> list,Comparator<? super T>)
            //将集合中的元素按指定规则排序。
            //Comparator和 Comparable的区别:
            //Comparable : 自己 this  和别人(参数)比较,
              //自己需要实现Comparable接口,重写compareto 方法
            //Comparator:相当于找一个第三方裁判,来比较两个。
            ArrayList<Integer> list=new ArrayList<>();
            Collections.addAll(list,1,3,2);
            System.out.println(list);
            Collections.sort(list, new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    return  o1-o2;//升序。
                }
            });
            System.out.println(list);
            // Person 类型的集合排序。
            ArrayList<Person> personList=new ArrayList<>();
            personList.add(new Person("张三",17));
            personList.add(new Person("b李四",19));
            personList.add(new Person("a王麻子",19));
            //一个规则
    //        Collections.sort(personList, new Comparator<Person>() {
    //            @Override
    //            public int compare(Person o1, Person o2) {
    //                //年龄升序
    //                return o1.getAge()-o2.getAge();
    //            }
    //        });
            //多个规则:
            Collections.sort(personList, new Comparator<Person>() {
                @Override
                public int compare(Person o1, Person o2) {
                    int result=o1.getAge()-o2.getAge();
                    if (result==0){
                        result=o1.getName().charAt(0)-o2.getName().charAt(0);
                    }
                    return  result;
                }
            });
            System.out.println(personList);
        }
  • 相关阅读:
    HashMap数据结构分析(jdk8)
    ConcurrentHashMap数据结构(jdk8)
    TOJ1373_多项式规律
    Windows程序基础——Windows应用程序的基本概念
    Why to learn MFC?
    TOJ1062
    TOJ1369
    TOJ1003
    vue 生命周期~~
    如何跨域访问的两种方法~
  • 原文地址:https://www.cnblogs.com/zhangyuhao/p/10729063.html
Copyright © 2011-2022 走看看