[数据结构篇]深入了解java集合框架

Posted 追枫。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[数据结构篇]深入了解java集合框架相关的知识,希望对你有一定的参考价值。


前言:java语法基础,博主已经更完了,接下来就要进入数据结构这新的篇章了,紧跟博主,从此让数据结构变得简单,让你爱上数据结构。
前期文章:
[java篇]包,继承,组合
[java篇]多态,抽象类,接口
[java篇]图书管理系统,是你的期末大作业吗?
[java篇]一次性帮你搞定String,StringBuffer,StringBuilder类
[java篇]一口气搞定异常处理
[数据结构]线性表之顺序表
[数据结构]线性表之单链表
[数据结构]双链表的实现,以及双链表和单链表之间的比较,链表和顺序表的优劣
冰冻三尺,非一日之寒。学习数据结构是一个漫长的过程,有一句话所得好,不会数据结构的程序员,肯定进不了大厂。所以所谓了大厂梦,兄弟们,卷起来吧。

java集合框架简单介绍

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

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

集合框架一览图

看到上面的这张图,大家肯定会想,要学会数据结构可真不简单呀,是的,在图中每个类都要实现相应的接口中的抽象方法,至于怎么实现(类似于一个双向链表的实现,顺序表的实现(点此链接),ps:其实这两个在以前的博客中有专门的介绍。还类似于实现一个栈,一个堆),这些博主以后都会陆续更新。
我们要学会数据结构的背后实现,同时我们也要会用数据结构。学习明白之后,你肯定会有一种站在巨人的肩膀上编程的感觉。

java集合框架的优点和作用

1.我们学习了集合数据结构背后是怎样实现的,就会知道在怎样的情况下应该使用怎样的数据结构,哪个数据结构有着怎样的优缺点。
2.我们学了数据结构之后,我们可以写出高效的代码。

基本关系说明

集合框架关于各种接口的描述

接口名称概念
collection接口用来存储管理一组对象 objects(Object是所有类的祖先类,所以说在collection中可以用来存储管理所有的类的对象),这些对象一般被成为元素 elements
List接口线性表,继承于collection接口,线性表分为顺序表和链表
Queue接口队列,特性:先进先出
Set接口元素不能重复,背后隐含着查找/搜索的语义
ShortSet接口一组有序的不能重复的元素
Deque接口双端队列,继承于Queue 双端队列是与队列类似的项的有序集合。双端队列有两个端部,首部和尾部,并且项在集合中保持不变。双端队不同的地方是添加和删除项是非限制性的可以在前面或后面添加新项;同样,可以从任一端移除现有项
Map接口键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义
SortedMap接口一组有序的键值对

集合框架关于各种类的描述

相关类名称描述
vector该类的作用和ArrayList类很像,它的默认增容为原来的两倍,而ArrayList类的增容效果为1.5倍增容。我们一般不常用vector类
Stack继承于vector,实现了一个先进后出的栈
ArrayList是一个顺序表,底层依靠数组实现,能很快的在顺序表中查找到某个元素。
LinkedList是一个双向链表,又来实现队列,队列,先进先出
PriortyQueue是一个优先队列,它和普通队列的不同,是因为优先队列,不是先进先出的,优先队列分为大顶堆和小顶堆,每次弹出的是堆中最大和元素或最小的元素。底层依靠数组实现
TreeSet是一个有序的集合,它的作用是提供有序的Set集合。
HashSetHashMap 来实现的,是一个不允许有重复元素的集合.HashSet 允许有 null 值。HashSet 是无序的,即不会记录插入的顺序HashSet 不是线程安全的
HashMap可以理解为多了一层指向关系,可以用指定Key找到指定Value。
TreeMapTreeMap存储K-V键值对,通过红黑树(R-B tree)实现;

collection接口的一些常用方法

方法名称方法内容
boolean add(E e)将元素e放到集合中
void clear()删除集合中的所有元素
boolean isEmpty()判断集合是不是空集合
boolean remove(object e)如果元素e在集合中,删除其中一个
int size()返回集合中的元素个数
object[] toArray()返回一个装有一个所有元素的数组

勤奋的博主,在这里为大家一一展示方法的使用哈!!!

1.关于add()方法:

 public static void main(String[] args) {
        Collection<Integer>collection = new ArrayList<>();
        collection.add(1);
        collection.add(2);
        System.out.println(collection);
    }
    //运行结果:[1,2]

我们是否想一下如果我们在使用collection集合的时候,没有规定要添加的元素是哪种类型即不写<>里面的包装类 ,那是怎样的呢?请看一下代码!!

 public static void main(String[] args) {
        Collection collection = new ArrayList<>();
        collection.add(1);
        collection.add("hello world");
        System.out.println(collection);
    }
    //运行结果:[1,hello world]

看到了吗?它可以打印!!那是因为我们没有规定包装类。我们在以后解题的过程中,尽量不要使用collection。

2.关于clear()方法:

 public static void main(String[] args) {
        Collection collection = new ArrayList<>();
        collection.add(1);
        collection.add("hello world");
        collection.clear();
        System.out.println(collection);
    }
    //运行结果:[]

这个方法的使用,直接就把添加到collection集合中的元素全部清除。

3.关于isEmpty()方法:

//秉承上述2.的代码,我们已经把集合中的元素清空自然检查为空的时候肯定是true
         System.out.println(collection.isEmpty());

4.关于remove(object o)方法

 //还是关于代码3.的添加,我们在这里删除字符串"hello world",但是删除的是原来集合中有的元素,如果没有我们有一个(布尔类型)值去接受,会返回一个false 
        collection.remove("hello world");
        System.out.println(collection);
        //运行结果:[1]

5.关于size()和toArray()方法:

     public static void main(String[] args) {
        Collection<Integer> collection = new ArrayList<>();
        collection.add(1);
        collection.add(2);
        collection.add(3);
        collection.add(4);
        collection.add(5);
        System.out.println(collection.size());
        System.out.println(Arrays.toString(collection.toArray()));
    }
    //运行结果:5
    //[1,2,3,4,5]

Map接口的一些常用方法

方法名称方法说明
get(Object o)根据指定key查找指定的value值
getDeFault(Object o ,void defaultValue)根据指定key去查找对应的value值,如果没有找到就返回默认值
put(k key,v value)指定key-value值,添加到map中
boolean containsKey(Object key)在map中看是否存在key
boolean containsValue(Object value)在map中查找是否存在value
Set<Map.Entry<k,v>> entrySet()将所有键值返回
boolean isEmpty()判断map是否为空
int size()返回键值对的数量

博主还是在这里一一介绍哈!!
建立一个map对象 ,如下它的键值对,都为字符串型

 Map<String,String>map = new Hashmap<>()

如下它的键值对,键值为整形,value值为字符串型

 Map<Integer,String>map = new Hashmap<>()

所以我们可以根据基本类型和引用类型所对应的包装类去限制键值对的类型。
1.关于put(k key,v value)方法和get()方法

     public static void main(String[] args) {
        Map<String,String>map = new HashMap<>();
        map.put("三国演义","罗贯中");
        map.put("水浒传","施耐庵");
        map.put("西游记","吴承恩");
        map.put("红楼梦","曹雪芹");
        System.out.println(map.get("三国演义"));
        System.out.println(map.getOrDefault("java","zhangsan"));
    }
    //运行结果:罗贯中
    //zhangsan

在我们使用put()方法的时候,依次在map中依次存放相应的键值对
在使用get()方法的时候,向方法里边传入key值,它就会返回相应的value值。

2.关于containsKey()和containsValue方法的使用:

 //同样还是上面的添加代码
  //我们在这里查找
         System.out.println(map.containsKey("三国演义"));//查找key值
        System.out.println(map.containsValue("罗贯中"));//查找value值
        //运行结果:true true

3.在这里我们重点介绍一下Set<Map.Entry<k,v>> entrySet()方法:
它的作用是返回键值对,这个方法,把本来在图中无序的键值对,添加到了集合中。

         Set<Map.Entry<String,String>>  entrySet = map.entrySet();
        for(Map.Entry<String,String> entry : entrySet  ){
            System.out.println(entry);
        }
        //运行结果: 看吧,说图里边的键值对是无序的,它添加集合中的顺序也不是我们添加键值对的顺序
        //水浒传=施耐庵
        //三国演义=罗贯中
       //红楼梦=曹雪芹
       //西游记=吴承恩

以上是关于[数据结构篇]深入了解java集合框架的主要内容,如果未能解决你的问题,请参考以下文章

自己动手写集合框架决心篇

大数据必学Java基础(五十二):集合的深入了解

Java中的集合和线程安全

java集合类深入分析之Queue篇

JAVA 笔记 从源码深入浅出集合框架

深入理解java合集之框架总览