JAVA08-Maven与集合

Maven 是一个基于项目对象模型(POM,Project Object Model)的项目管理工具,主要用于 Java 项目的构建、依赖管理和项目信息管理。它简化了项目的构建过程,提供了一种标准化的方式来管理项目的构建、报告和文档。

Maven的约定

  • groupId 组织
  • artifactId 功能(jar包)
  • version 版本

Maven 通过以上3个属性就能唯一定位一个jar

1
2
3
4
5
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

Maven自动解决冲突的原则

距离最近的胜出

1
2
3
4
5
6
7
假如你的项目中出现了包冲突

         -> A  -> B -> C:0.0.2
你的项目 
         -> D  -> C:0.0.1
         
根据距离最近的策略Maven会选择C:0.0.1版本

手动解决Maven冲突的办法

  1. 分析它们的依赖关系,了解谁被Maven自动解决掉了,然后手动修改正确包的距离
  2. 如何修改包的距离?

答: 直接在项目中引用需要的依赖包,例如上面的例子,我们可以直接引用C:0.0.2这个包

  1. 手动指定排除某个依赖包
  2. 通过exclusions标签指定排除某个依赖包
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<dependency>
    <groupId>com.github.hcsp</groupId>
    <artifactId>test-library-d</artifactId>
    <version>0.1</version>
    <exclusions>
        <exclusion>
            <groupId>com.github.hcsp</groupId>
            <artifactId>test-library-c</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Maven查看依赖关系树的命令

1
mvn dependency:tree

Maven包的作用域

  • <scope>compile</scope> 测试和生产中都有效
  • <scope>test</scope> 只在测试时有效,不会发布出去
  • <scope>provided</scope> 只在编译时有效
1
2
3
4
5
6
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
    <scope>test</scope>
</dependency>

Collection接口

Collection是整个Collection继承体系的根接口,一个Collection代表一组对象,它们被称作元素,有些Collection允许重复的元素出现,有的不允许,有些是有序的,有些事无序的,JDK不提供任何对这个接口的直接实现,而是提供了很多对它的子接口的实现,比如SetList,说白了Collection代表一堆东西的集合

List接口

有序集合,元素可以重复,List接口可以根据索引想取哪个就取哪个

ArrayList底层是数组结构

因为是数组,所以在插入新元素的时候,会判断是否需要扩容

那么ArrayList是怎么实现动态扩容的呢?

  1. 答:每当发现容量不够的时候,就创建一个更大的空间,然后把原先所有的数据拷贝过去
  2. 另外在进行元素插入的时候,需要移动插入位置之后的所有元素,位置越靠前,需要位移的元素越多,开销越大

因此ArrayList的特点是查询速度快增删改速度很慢

LinkedList底层是双向链表结构

它比ArrayList多提供了4个不同位置的添加数据的方法

为什么链表结构比数组结构查询效率低,但更新效率比数组结构高?

  1. 顺序存储可以想象成吃饭排队,每个人领的号都是按顺序来的,服务员只要喊号就里立即可以找到对应的人,新来的人都自动加到队尾,如果有人想插队,那么从他插队的位置后面所有的人都要挪动位置。
  2. 链接存储可以想象成手拉手做游戏,每个人只知道自己手拉的是谁,想要找到某个人必须从一个节点开始往一个方向按顺序一个一个查,直到查到这个人,新来的人可以插到任意两个人之间,只要原来的那两个人把手放开和新来的拉起手即可,不需要其他人都跟着挪动

因此LinkedList的特点是查询速度慢,但增删改速度快

Set接口

无序集合,并且不能包含重复元素,Set接口没有索引,因此只能通过迭代器来取出元素

HashSet底层是K,V结构

实际上他就是包装了一层HashMap,当程序向HashSet中添加元素时,HashSet会根据元素的hashCode值来计算它的存储位置,从而快速找到该元素,而添加元素时,实际上就是把元素作为MapKvalue是一个固定的Object对象

因此HashSet的特点是查询速度快增删改速度也还不错

LinkedHashSet底层是双向链表结构

它拥有和LinkedList几乎一样的特性,由于是链表结构它的取出顺序和添加数据时的顺序一致

因此LinkedHashSet的特点是查询速度快增删改速度更快

TreeSet

TreeSet和HashSet唯一不同就是TreeSet可以对元素进行排序,但前提是元素要实现Comparable接口

Map接口

K,V键值对集合,K是不能重复的,Map集合有K,因此可以根据K,想取哪个就取哪个

HashMap底层是K,V结构

HashMap是非线程安全的(它在多线程扩容的情况下可能会出现死循环)

ConcurrentHashMap

ConcurrentHashMap和HashMap唯一不同点是,它是线程安全的,如果你想保证线程安全,无脑用它就可以了

TreeMap

TreeMap和HashMap唯一不同就是TreeSet可以对元素进行排序,但前提是元素要实现Comparable接口

一些需要了解下的东西

  • Arrays
  • Collections
  • Lists
  • Sets
  • Maps
  • Queue(队列)
  • Deque(双端队列)
  • PriorityQueue(优先级队列)
  • Vector(被ArrayList代替)
  • Stack(被Deque代替)
  • Guava(Google)
updatedupdated2025-03-012025-03-01