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不会有泛型。

    

原文地址:https://www.cnblogs.com/sun9/p/13475427.html