前言:本篇开始对数据结构知识的介绍与学习,对于数据结构,我们这里以Java集合来进行探讨,学习Java集合与数据结构。本篇主要是先介绍一下,集合中的一些东西。

话不多说,直接进入主题。

本篇介绍内容:

  1. 什么是集合框架
  2. 集合框架的意义
  3. 握集合框架相关接口和常见的实现类


Java集合与数据结构:

  • 一、Java集合框架的介绍
  • 二、学习集合框架的意义
  • 三、接口 interfaces
  • 1.基本关系说明
  • 2. Collection 接口说明
  • 3.Collection 常用方法说明
  • 四、Map 接口
  • 1.Map 接口说明
  • 2.Map 接口常用方法说明
  • 五、实现 classes



一、Java集合框架的介绍

Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes

其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索retrieve 、管理 manipulate ,即平时我们俗称的增删查改 CRUD

总的来说,集合框架其实就是Java写好的数据结构。

而对于类和接口总览,我们有这么一个大致的图:

java jvm metrics 采集 java数据采集框架_数据结构


其中,Interface是接口,abstact class是抽象类,class是具体实现类。List是线性结构,Queue是队列,Set是不能重复的集合,Deque是双端队列等等。

java jvm metrics 采集 java数据采集框架_java jvm metrics 采集_02

接口:其实是对一个行为的"抽象"标准。

比如这里的队列,其实就是相当于大家在学校打饭,你必须从队尾开始排队,然后打完从队头出来,不能直接上去队头吧。然后如果是双端队列,那就可以从队尾进,也可以从队头进,同时两边也都可以出。


二、学习集合框架的意义

  1. 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码。
  2. 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景。
  3. 对于很多公司的笔试及面试题,集合框架都算是占据重要部分。



java jvm metrics 采集 java数据采集框架_数据结构_03



三、接口 interfaces

1.基本关系说明

java jvm metrics 采集 java数据采集框架_java_04

Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elements

  1. Set : 元素不能重复,背后隐含着查找/搜索的语义
  2. SortedSet : 一组有序的不能重复的元素
  3. List : 线性结构
  4. Queue : 队列
  5. Deque : 双端队列

Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义

  1. SortedMap : 一组有序的键值对

2. Collection 接口说明


3.Collection 常用方法说明

然后这里我们来了解一下Collection 常用的方法。

方法签名

说明

boolean add(E e)

将元素 e 放入集合中

void clear()

删除集合中的所有元素

boolean isEmpty()

判断集合是否没有任何元素,俗称空集合

boolean remove(Object e)

如果元素 e 出现在集合中,删除其中一个

int size()

返回集合中的元素个数

Object[] toArray()

返回一个装有所有集合中元素的数组

首先我们来了解一下Collection的这几行代码:

public static void main(String[] args) {
        Collection collation = new ArrayList();
        collation.add("abcd");
        collation.add(12345);
        //add就是添加元素放入集合中
    }

这里的话都还好,但是add添加的时候,什么类型都可以添加,就比较随便了,怎么能随便什么类型都放一起呢,取的时候就麻烦了,所以这里Collection可以多一个尖括号<>,而尖括号里面,是我们要add的类型,比如:

public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("hello world!");
        collection.add("hhahah");
        //同时要注意 尖括号里面  放的类型 一定要是 类类型 不能是简单的基本类型
        //Collection<int> collection = new ArrayList<>(); 错误的
        Collection<Integer> collection1 = new ArrayList<>();
        collection1.add(1);
        collection1.add(23456);
    }

而这种多了一个尖括号的语法,叫做泛型,是一种晦涩难懂的语法,我们后面再有一篇博客介绍它。

而上面的东西存进去之后,也是可以看见的,直接打印就行了:

java jvm metrics 采集 java数据采集框架_开发语言_05


然后我们挑两个演示一下这些方法:

1.clear

public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("hello world!");
        collection.add("hhahah");
        
        Collection<Integer> collection1 = new ArrayList<>();
        collection1.add(1);
        collection1.add(23456);

        System.out.println(collection);
        System.out.println(collection1);

        collection.clear();
        System.out.println(collection);
        System.out.println(collection1);
    }

clear也就是清空里面的内容,最后打印的时候就只是一个空的了,其实clear就是把里面每一个元素置为空了:

java jvm metrics 采集 java数据采集框架_开发语言_06

2.isEmpty

public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("hello world!");
        collection.add("hhahah");

        Collection<Integer> collection1 = new ArrayList<>();
        collection1.add(1);
        collection1.add(23456);

        System.out.println(collection);
        System.out.println(collection1);

        System.out.println(collection.isEmpty());
    }

就像前面说的,isEmpty就是看集合里面是否是空集合,不是就打印false,是就打印true,就是这样:

java jvm metrics 采集 java数据采集框架_java_07

3.Object[] toArray()

public static void main(String[] args) {
        Collection<String> collection = new ArrayList<>();
        collection.add("hello world!");
        collection.add("hhahah");

        Collection<Integer> collection1 = new ArrayList<>();
        collection1.add(1);
        collection1.add(23456);

        System.out.println(collection);
        System.out.println(collection1);

        Object[] objects = collection.toArray();//因为是Object[]类型所以要有其接收
        System.out.println(Arrays.toString(objects));
        //以数组的形式打印

        /*  String[] objects = (String[])collection.toArray();
            System.out.println(Arrays.toString(objects));   不行!  */

    }

这里就是换一个方式,返回一个装有所有集合中元素的数组,但是值得注意的是,我们上面的代码尝试强转为String类型,但是是不可以的!这其中的原因就比较复杂,整体可以理解为JVM对数组的处理 不建议进行强制类型转换,也就是编译通过了,但是到里面检查每一个元素的时候,就检查到不是一样的类型了。


四、Map 接口

1.Map 接口说明


2.Map 接口常用方法说明

对于Map接口,同样有一些常用方法:

方法签名

说明

V get(Object k)

根据指定的 k 查找对应的 v

V getOrDefault(Object k, V defaultValue)

根据指定的 k 查找对应的 v,没有找到用默认值代替

V put(K key, V value)

将指定的 k-v 放入 Map

boolean containsKey(Object key)

判断是否包含 key

boolean containsValue(Object value)

判断是否包含 value

Set<Map.Entry<K, V>> entrySet()

将所有键值对返回

boolean isEmpty()

判断是否为空

int size()

返回键值对的数量

那么同样的我们也在下面举一些例子:

  1. 首先是写入的,也就是put的(将指定的 k-v 放入 Map)和取出的get以及getOrDefault:
public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("千金","安娜-谢尔巴科娃");
        map.put("莎莎","特鲁索娃");
        map.put("K宝","瓦利耶娃");
        //写入就是put,前面的和后面的也就是K和V一一对应,比如千金就是安娜-谢尔巴科娃

        String ret = map.get("千金");
        System.out.println(ret);
        //这里是取出来,输入对应的K得到对应的V

        System.out.println(map.get("天天"));//如果没有就会返回null
        System.out.println(map.getOrDefault("天天","金博洋"));
        //然后getOrDefault就是当没有的时候,就输出后面的默认值

    }

输出结果:

java jvm metrics 采集 java数据采集框架_System_08

  1. 然后就是对于Map 接口中是否包含某一K值或某一V值:
public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("千金","安娜-谢尔巴科娃");
        map.put("莎莎","特鲁索娃");
        map.put("K宝","瓦利耶娃");

         boolean flg = map.containsKey("千金");
         System.out.println(flg);//输出true
         //查找是否存在此K值 存在输出true 反之false
         boolean flg2 = map.containsValue("莎莎");
         System.out.println(flg2);//输出false
         //查找是否存在此V值 存在输出true 反之false
    }
  1. 然后这个Set<Map.Entry<K, V>> entrySet()就比较有意思了,我们来慢慢了解它,先看这样一个代码打印出来的东西:
public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("千金","安娜-谢尔巴科娃");
        map.put("莎莎","特鲁索娃");
        map.put("K宝","瓦利耶娃");

        System.out.println(map);
        //打印map里面的东西
    }

你以为是按住顺序打印吗,我们来看一下结果:

java jvm metrics 采集 java数据采集框架_开发语言_09

其实不是这样的,对于哈希表,并不是简简单单的一个顺序存放,下面我们画一个图让大家了解一下哈希表,但并不是真正的哈希表,只是为了让大家了解:

java jvm metrics 采集 java数据采集框架_System_10

对于上面的图,其实意思就是,当我们的K值进入哈希表的时候,是需要通过相当于是一个厂子也就是函数加工之后进去的,是随机放置在了某一k值位置,然后对于v值再放于其位置,然后当我们用这个方法。 Set<Map.Entry<String,String>> entrySet = map.entrySet();的时候,就会讲这些V值和K值组合到一起放进一个地方,就是我们的entrySet:

java jvm metrics 采集 java数据采集框架_数据结构_11

所以这个合起来的数据类型,就是<Map.Entry<String,String>> 了。

而对于这个数据类型我们也可以打印看一下:

public static void main(String[] args) {
        Map<String,String> map = new HashMap<>();
        map.put("千金","安娜-谢尔巴科娃");
        map.put("莎莎","特鲁索娃");
        map.put("K宝","瓦利耶娃");

        Set<Map.Entry<String,String>> entrySet = map.entrySet();
        for (Map.Entry<String,String> entry:
             entrySet) {
            System.out.println("key:"+entry.getKey()+"   value:"+entry.getValue());
        }

    }

得到的就是:

java jvm metrics 采集 java数据采集框架_System_12

当然这里我们用的是HashMap,如果是用TreeMap也是一样的,不同的地方就是TreeMap中是有序的,而两者得到的结果也会有可能相同。


五、实现 classes

这里展示的是具体的某一个接口分别有哪些实现类:

interface

顺序表

链表


红黑树

哈希表

Set

TreeSet

HashSet

List

ArrayList

LinkedList

Queue

LinkedList

PriorityQueue

Deque

LinkedList

Map

TreeMap

HashMap


这就是本篇Java集合与数据结构篇1的全部内容啦。欢迎关注。一起学习,共同努力!也可以期待下个系列接下来的博客噢。

还有一件事:

java jvm metrics 采集 java数据采集框架_数据结构_13


java jvm metrics 采集 java数据采集框架_java jvm metrics 采集_14