zoukankan      html  css  js  c++  java
  • java基础知识--Collection、Collections、泛型

    Collection集合

    1.1 集合概述

      集合是java中提供的一种容器,可以用来存储多个数据。

      集合与数组的区别:

    • 数组的长度是固定的。集合的长度是可变的。

    • 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。(在开发中一般当对象多的时候,使用集合进行存储。)

    1.2 集合框架

      集合按照其存储结构可以分为两大类,分别是单列集合java.util.Collection双列集合java.util.Map

      单列集合java.util.Collection单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是java.util.Listjava.util.Set

    • List的特点是元素有序、可重复。List接口的主要实现类有java.util.ArrayListjava.util.LinkedList

    • Set的特点是元素无序,不可重复。Set接口的主要实现类有java.util.HashSetjava.util.TreeSet

    1.3 Collection 常用方法

      Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列集合。

      部分常用方法如下:<E为泛型,后续会作简单介绍>

    • public boolean add(E e):  把给定的对象添加到当前集合中 。

    • public void clear() :清空集合中所有的元素。

    • public boolean remove(E e): 把给定的对象在当前集合中删除。

    • public boolean contains(E e): 判断当前集合中是否包含给定的对象。

    • public boolean isEmpty(): 判断当前集合是否为空。

    • public int size(): 返回集合中元素的个数。

    • public Object[] toArray(): 把集合中的元素,存储到数组中。

    Collections集合工具类

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

    1.2 常用方法

    • public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。

    • public static void shuffle(List<?> list) :打乱集合顺序。

    • public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。(默认升序排序)

    • public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。

    1.3 Comparator比较器

      我们还是先研究这个方法

    public static <T> void sort(List<T> list)`//将集合中元素按照默认规则排序。
    

      举例

    public class CollectionsDemo1 {
        public static void main(String[] args) {
            ArrayList<String>  list = new ArrayList<String>();
            //list.add("cba");
            //list.add("aba");
            //list.add("sba");
            //list.add("nba");
    	  //采用工具类 完成 往集合中添加元素
    	  Collections.addAll(list, "cba", "aba", "sba","nba");
    	  System.out.println(list);
            //排序方法
            Collections.sort(list);
            System.out.println(list);
        }
    }
    
    // 结果:[aba, cba, nba, sba]

      我们使用的是默认的规则完成字符串的排序,那么默认规则是怎么定义出来的呢?

      说到排序了,简单的说就是两个对象之间比较大小,那么在JAVA中提供了两种比较实现的方式:

    •  一种是比较死板的采用java.lang.Comparable接口去实现,
    •  一种是灵活的当我需要做排序的时候在去选择的java.util.Comparator接口完成。

      那么我们采用的public static <T> void sort(List<T> list)这个方法完成的排序,实际上要求了被排序的类型需要实现Comparable接口,重写compareTo方法完成比较的功能,在String类型上如下:

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence { ... }
    /**
    Comparable接口的排序规则:
    compareTo (参数) {
    	return this.Xxx - 参数;   //升序排序
    	//return 参数 - this.Xxx;   //降序排序
    }
    */

      String类实现了这个接口,并完成了比较规则的定义,但是这样就把这种规则写死了,那比如我想要字符串按照第一个字符降序排列,那么这样就要修改String的源代码,这是不可能的了,那么这个时候我们可以使用下面方法灵活的完成,

    public static <T> void sort(List<T> list,Comparator<? super T> )

    这个里面就涉及到了Comparator这个接口,位于位于java.util包下,排序是comparator能实现的功能之一,该接口代表一个比较器,比较器具有可比性!顾名思义就是做排序的,通俗地讲需要比较两个对象谁排在前谁排在后,那么比较的方法就是:

     public int compare(String o1, String o2)    //比较其两个参数的顺序。(o1-o2 升序 o2-o1 降序)
    /**
        两个对象比较的结果有三种:大于,等于,小于。
        
        如果要按照升序排序,
        则o1 小于o2,返回(负数),相等返回0,o1大于o2返回(正数)
        如果要按照降序排序
        则o1 小于o2,返回(正数),相等返回0,o1大于o2返回(负数)
    */        
    

      案例

    public class CollectionsDemo2 {
        public static void main(String[] args) {
            ArrayList<String> list = new ArrayList<String>();
            list.add("cba");
            list.add("aba");
            list.add("sba");
            list.add("nba");
            //排序方法  按照第一个单词的降序
            Collections.sort(list, new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    return o2.charAt(0) - o1.charAt(0);
                }
            });
            System.out.println(list);
        }
    }
    
    // 结果:[sba, nba, cba, aba]

    1.4 简述Comparable和Comparator两个接口的区别

      Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。

      Comparator:强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序。

    Generic泛型

    1.1  泛型概述

      广泛通用的类型,用来定义一个类型规范,可以在类或方法中预支地使用未知的类型。(只能是引用类型)

      一般在创建对象时,将未知的类型确定具体的类型。当没有指定泛型时,默认类型为Object类型。

      ps:泛型的本质还是object类型,是编译器将其转为我们规范的类型。这种为了使用更加方便,但是原理不变的代码语法我们称之为语法糖

    1.2  泛型作用

    • 统一了规范,避免集合在运行时期可能出现的ClassCastException异常。

    • 简化开发,避免了类型强转的麻烦。

    1.3  泛型的定义与使用

      泛型,用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递。

      1.3.1 泛型类:在类上面定义的泛型。

          格式:修饰符 class 类名<代表泛型的变量> {  }

      1.3.2 泛型方法:在方法上面定义的泛型,只能使用在普通方法上面。

        (对于这种单独对方法进行泛型定义的泛型方法,必须有参数才有意义)

          格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){  }

      1.3.3 泛型接口:在接口上定义的泛型。

          格式:修饰符 interface 接口名<代表泛型的变量> {  }

    1.4  泛型通配符

      概述:当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示

    • 只作接收时表示,不作添加存储操作。

    • 一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用

      泛型的上限:用来限定元素类型时指定类X或其子类

        格式:类型名称 <? extends 类X > 对象名称

        意义:只能接收该类型及其子类

      泛型的下限:用来限定元素类型时指定类Y或其父类

        格式:类型名称 <? super 类Y > 对象名称

        意义:只能接收该类型及其父类

    1.5  泛型擦除

      概述:将一个有泛型的集合对象(如 list1)赋值给没有泛型的集合对象(如 list2)的过程。此时list2不会有泛型。

        

  • 相关阅读:
    SVN 使用锁实现独占式签出
    浏览器console中加入jquery方便调试
    nuget安装说明
    sql server 索引优化
    Windwos Server 2016 远程桌面授权
    tomcat的安装与配置
    业务监控
    敏捷话管理团队
    一键搞定多服务器的更新
    迁移历史sql数据
  • 原文地址:https://www.cnblogs.com/sun9/p/13475427.html
Copyright © 2011-2022 走看看