Java基础5

Java基础五

一.Map

特点

1.Map设计为一个接口
2.Map针对的是键和值有一定的映射关系
3.键应该是唯一的,无序的,类似于Set接口
4.值应该是可重复,类似于Collection
5.Map也应该具备集合应该有的方法
6.值的顺序取决于键的顺序,map的数据结构完全取决于键的数据结构,与值无关

1.HashMap

特点:

1.存储数据格式为key value

2.集合里面数据是无序的

3.key不可以重复,value可以

HashMap是一个散列桶(数组和链表),它存储的内容是键值对(key-value)映射HashMap采用了数组和链表的数据结构,能在查询和修改方便继承了数组的线性查找和链表的寻址修改HashMap是非synchronized,所以HashMap很快HashMap可以接受null键和值,而Hashtable则不能(原因就是equlas()方法需要对象,因为HashMap是后出的API经过处理才可以)

HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来储存Node 对象。这里关键点在于指出,HashMap是在bucket中储存键对象和值对象,作为Map.Node 。

img

2.TreeMap

基于红黑树(Red-Black tree)的 NavigableMap 实现。
该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

特点
1.键可排序,唯一,
2.值可重复
3.底层数据结构是自平衡的二叉树,可排序
4.排序方式类似于TreeSet,分为自然排序和比较器排序,具体取决于使用的构造方法

3.HashTable

底层数据结构也是哈希表和HashMap是完全兼容的,但是 Hashtable是线程安全的,效率低,不可以存储null值,null键

二.Set

特点: 无序(没有下标) 集合中的元素不重复

1.HashSet

HashSet底层数据结构是哈希表。

依赖于 hashCode 和 equals 方法实现元素唯一。

因为hashcode值和哈希表索引相关,所以能保持随机做到无序。

2.TreeSet

特点
1.无序
2.唯一
3.可排序
4.线程不安全的,效率高
5.可以存储null值
6.底层数据结构是二叉树

3.EnumSet

三.List

特点:

1.value的类型可以不固定,放任何类型

2.不固定长度

3.集合里面数据有序,可以通过下标访问

1.list中添加,获取,删除元素;
  添加方法是:.add(e);  获取方法是:.get(index);  删除方法是:.remove(index); 按照索引删除;  .remove(Object o); 按照元素内容删除;

2.list中是否包含某个元素;

方法:.contains(Object o); 返回true或者false

3.list中根据索引将元素数值改变(替换);

注意 .set(index, element); 和 .add(index, element); 的不同;

4.list中查看(判断)元素的索引;

注意:.indexOf(); 和 lastIndexOf()的不同;

5.利用list中索引位置重新生成一个新的list(截取集合);

方法: .subList(fromIndex, toIndex);  .size() ; 该方法得到list中的元素数的和

6.对比两个list中的所有元素;

//两个相等对象的equals方法一定为true, 但两个hashcode相等的对象不一定是相等的对象

7.判断list是否为空;

//空则返回true,非空则返回false

8.返回Iterator集合对象;x.iterator

9.将集合转换为字符串;toString()

1.ArrayList

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现
List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector类,除了此类是不同步的。

特点

1.底层数据结构是数组
2.增加和删除的效率低,查询和修改的效率高
3.能够存储 null 值
4.线程不安全,效率高 可以通过 Collections.synchronizedList();变安全
5.有索引,能够方便检索
6.元素可重复,我们自己可以通过 选择排序去重复
7.不可以排序,但是可以通过 Collections.sort();方法排序
ArrayList中常用方法来自父类Collection,List,Object

2.LinkedList

​ LinkedList是一个双向链表, 当数据量很大或者操作很频繁的情况下,添加和删除元素时具有比ArrayList更好的性能。但在元素的查询和修改方面要弱于ArrayList。LinkedList类每个结点用内部类Node表示,LinkedList通过first和last引用分别指向链表的第一个和最后一个元素,当链表为空时,first和last都为NULL值。

特点

  1. 底层数据结构是数组
  2. 有索引,能够方便检索
  3. 增加和删除的效率低,查询和修改的效率高
  4. 线程安全,效率低
  5. 能够存储 null 值
  6. 元素可重复【我们自己可以通过选择排序思想去除重复元素】
  7. 不可以排序,但是可以通过 Collections.sort();方法排序

3.Vector

Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。

4.Stack

Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。

特点

  1. 基于栈结构的集合,先进后出
  2. Stack 类是 Vector类的子类,所以该类也是线程安全的,效率低,建议使用 Deque接口的实现类

常用方法
E push(E item) 将元素压入栈底
E pop() 将元素从栈结构中弹出,并作为此函数的值返回该对象,此方法会影响栈结构的大小
E peek() 查看堆栈顶部的对象,但不从栈中移除它。
boolean empty() 测试栈是否为空。
int search(Object o) 返回对象在栈中的位置,以 1 为基数。

5.区别

1.ArrayList和Vector的区别

1) Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

2.ArrayList和LinkedList的区别

1)对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

2) 各自效率问题。因为ArrayList是数组,而LinkedList是链表操作,其相应方法的时间复杂度和对应操作都不相同。

四.Queue

​ 在处理元素前用于保存元素的 collection。除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或
false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。

特点

1.Deque是一个Queue的子接口,是一个双端队列,支持在两端插入和移除元素
2.deque支持索引值直接存取。
3.Deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。
4.插入、删除、获取操作支持两种形式:快速失败和返回null或true/false
5.不推荐插入null元素,null作为特定返回值表示队列为空
常用方法

1.boolean add(E e)
将指定的元素插入此队列(如果立即可行且不会违反容量限制),在成功时返回 true,如果当前没有可用的空间,则抛出 IllegalStateException

2.E element()
获取,但是不移除此队列的头。

3.boolean offer(E e)
将指定的元素插入此队列(如果立即可行且不会违反容量限制),当使用有容量限制的队列时,此方法通常要优于 add(E),后者可能无法插入元素,而只是抛出一个异常。

4.E peek()
获取但不移除此队列的头;如果此队列为空,则返回 null。

5.E poll()

获取并移除此队列的头,如果此队列为空,则返回 null。

6.E remove()
获取并移除此队列的头。

五.线程安全

线程安全

Vector

HashTable

StringBuffer

线程不安全

ArrayList :

LinkedList

HashMap

HashSet

TreeMap

TreeSet

5.E poll()

获取并移除此队列的头,如果此队列为空,则返回 null。

6.E remove()
获取并移除此队列的头。

五.线程安全

线程安全

Vector

HashTable

StringBuffer

线程不安全

ArrayList :

LinkedList

HashMap

HashSet

TreeMap

TreeSet

StringBulider

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值