• JavaSE集合基础总览


    Java集合

    Java集合,也称之为容器。基本上你写所有的Java程序,都必须要用到一个包。该API基本都位于java.util工具类包中,是JavaSE中的重中之重。
    简单可以总结为“1136”,分别是一个图,一个类,三个知识点,六个接口。下面逐个剖析。

    1.一个图


    备注:

    • 实现Collection接口的,基本都是按个的方式存入的集合类。
    • 实现Map接口的,基本都是按照键值对的方式存入的集合类。
    • 这两个接口都定义了该类型集合的基本方法。
    • Collectionz中,两个对象互相equalsw为true,即为重复。(或者说,是hashCode中相等)

    (1)六个接口:Collection接口

     1 import java.util.*;
     2 
     3 public class CollectionTest {
     4     public static void main(String[] args) {
     5         // 父类引用,指向子类对象
     6         // 为求方便更换其他子类的实现
     7         Collection c = new ArrayList<>();
     8         // 可以放入不同类型的对象
     9         c.add("hello");
    10         c.add("f1");
    11         c.add(new Integer(100));
    12         System.out.println(c.size());   // 3
    13         System.out.println(c);  // [hello,f1,100]
    14     }
    15 }

    (2)六个接口:Iterator接口

    大部分容器类,都必须实现Collection接口,而实现该接口必须实现其的iterator方法。
    iterator方法的作用就是,所有实现Collection接口方法的容器子类,不管其具体的实现、使用的数据结构,其必须提供一个iterator方法用以进行统一的遍历数据方式。
    (举个栗子,我不管你馒头店具体是怎么去做馒头,存储馒头的,反正你做馒头必须要实现卖馒头的方法,我去到按照金钱交易的方式一定能得到馒头)
    所以:

    • 所有实现了Collection接口的容器类都有一个iterator方法,用以返回一个实现了Iterator接口的对象。
    • Iterator对象称为迭代器,用以方便的实现对容器内元素的遍历操作
    • Iterator对象的的remove方法是在迭代中删除元素的唯一的安全方法
    • 也可以使用增强的for循环遍历容器数据,但是因为不方便操作,除了简单的遍历读取外,不建议使用。 示例:
       1 import java.util.*;
       2 
       3 public class IteratorTest {
       4     public static void main(String[] args) {
       5         Collection c = new HashSet<>();
       6         c.add(new Name("f1", "l1"));
       7         c.add(new Name("f2", "l2"));
       8         c.add(new Name("f3", "l3"));
       9         Iterator i = c.iterator();
      10         while (i.hasNext()) {
      11             //next()的返回值为Object,需要转换为相应类型
      12             Name = n = (Name) i.next();
      13             System.out.println(n.getName());
      14             // 因为set没有顺序,所以返回[f2,f1,f3,l1,l2,l3]
      15         }
      16     }
      17 }

    (3)六个接口:Set接口

    • Set接口是Collection的子接口,Set接口没有提供额外的方法,但是实现Set接口的容器类中的元素是没有顺序的,且不可重复
    • Set容器可以与数学中“集合”的概率相对应。
    • Java API中所提供的Set容器类有HashSet、TreeSet等。
      示例:
       1 import java.util.*;
       2 
       3 /**
       4  * 求交集 去重
       5  */
       6 public class SetTest {
       7     public static void main(String[] args) {
       8         Set s1 = new HashSet<>();
       9         Set s2 = new HashSet<>();
      10         s1.add("a");s1.add("b");s1.add("c");
      11         s2.add("d");s2.add("a");s2.add("b");
      12         //Set和List容器类都具有Constructor(Constructor c)
      13         //构造方法用以初始化容器类
      14         Set sn = new HashSet<>(s1);
      15         sn.retainAll(s2);
      16         Set su = new HashSet<>(s1);
      17         su.addAll(s2);
      18         System.out.println(sn);// [a,b]
      19         System.out.println(su);// [d,a,c,b]
      20     }
      21 }

    (4)六个接口:List接口

    • List接口是Collection的子接口,实现List接口的容器类中的元素是有序的,且可重复的
    • List容器中的元素都对应一个整数型的序号记载其在容器的位置,可以根据序号存取容器中的元素。
    • Java API所提供的List容器类有ArrayList、LinkeList等。

    一个类:Collections类

    • 该类位于java.util.Collections,提供了一些静态方法实现了基于List容器的一些常用算法。
    • sort (对List容器内的元素进行排序)
    • shuffle (对List容器内的对象进行随机排序)
    • reverse (对List容器内的对象进行逆序排序)
    • fill (用一个特定的对象重写整个List容器)
    • copy (将src List容器内容拷贝到dest List容器)
    • binarySearch (对于顺序的List容器,采用二分法查找的方式查找特定对象)
      其余的方法可以具体去看API文档,再给个示例:
       1 import java.util.*;
       2 /**
       3  * 举例部分Collections的算法排序,具体看API
       4  */
       5 public class Collections {
       6     public static void main(String[] args) {
       7         List l1 = new LinkedList<>();
       8         for (int i = 0; i <= 9; i++) {
       9             l1.add("a" + i);
      10         }
      11         /**
      12          * 目前l1的值排序为: [a0,a1,a2,a3,a4,a5,a6,a7,a8,a9]
      13          */
      14         Collections.reverse(l1);// 逆序排序
      15         System.out.println(l1);// [a9,a8,a7,a6,a5,a4,a3,a2,a1,a0]
      16         Collections.shuffle(l1);// 随机排序
      17         System.out.println(l1);// [a1,a3,a8,a9,a4,a6,a5,a2,a0,a7]
      18         Collections.sort(l1);// 正序排序
      19         System.out.println(l1);// [a0,a1,a2,a3,a4,a5,a6,a7,a8,a9]
      20         System.out.println(Collections.binarySearch(l1, "a5"));// 6
      21     }
      22 }

    (5)六个接口:Comparable接口

    • 问题:Collections类的方法算法根据什么来确定容器中对象的“大小”顺序?
    • 所有可以“排序”的类,都实现了java.lang.Comparable接口,Comparable接口只有一个方法,compareTo,该方法:
      • 返回0表示this == obj
      • 返回正数表示this > obj
      • 返回负数表示this < obj
    • 实现了Comparable接口的类通过重写compareTo方法从而确定该类对象的排序的具体方式。

    (6)六个接口:Map接口

    • 实现Map接口的类用来存储键值对。
    • Map接口的实现类有HashMap和TreeMap等。Map类中存储的键值对通过键来标识,所以键值 不能重复。

    泛型

    • 起因:
      • JDK1.4以前类型不明确
        • 装入集合的类型都被当作Object对待,从而失去了自己的实际类型。
        • 从集合中取出时往往需要转型,效率低,容易发生错误。
    • 解决办法:
      • 在定义集合的时候同时定义集合中对象的类型。
        • 可以在定义Collection的时候指定。
        • 也可以在循环时用Iteration指定。
    • 好处:
      • 增强程序的可读性和稳定性。

    总结

    • 一个图
    • 一个类
      • Collections
    • 三个知识点
      • For - 增强的for循环
      • Generic - 泛型
      • Auto-boxing/unboxing - 自动打包、解包
    • 六个接口(如上)

    欢迎访问我的博客 尺素书 https://www.chisushu.cn/87.html

  • 相关阅读:
    假期训练七(hdu-2845 dp,hdu-1846,2188 巴什博奕)
    假期训练六(poj-1753,递归+hdu-2844,多重背包)
    假期训练五(poj-1077bfs+康拓展开,hdu-2577dp)
    1-10假期训练(hdu-2059 简单dp)
    1-9-假期训练心得(dp+bfs)
    如何在IntelliJ Idea中同时启动不同端口的两个实例
    搭建Springboot监控中心报错A attempt was made to call the method reactor.retry.Retry.retryMax(I)Lreactor/ret)
    使用spring中遇到"java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor"问题
    mvc:annotation-driven的前缀 "mvc"未绑定
    使用Idea构建springmvc框架,出现no bean named 'cacheManager' is defined 错误
  • 原文地址:https://www.cnblogs.com/byuc/p/9744060.html
Copyright © 2020-2023  润新知