Java基础-集合框架

一、集合
集合看做一个容器,用来存放对象信息,所有的集合都位于java.util包下
二、数组和集合
数组存放数据类型是相同的:基本数据类型的数据,对象
集合可以存放不同类型的数据:只能存储对象
三、集合包含的主要接口:Collection接口和Map接口
1.Collection接口
①.List接口:存储有序的,可以重复的元素
–ArrayList:主要实现类
–LinkedList:基于链表的实现方式,主要用于频繁的插入、删除操作
②.Set接口:存储无序的,不可重复的元素(添加相同元素只能存储一份)
–HashSet:主要实现类
–LinkedHashSet:HashSet一个子类,具有hashset的特性,是根据元素的hashcode值来决定元素的存储顺序的
–TreeSet:是SortedSet接口的实现类,可以保证排序元素处于排序状态(默认是自然排序)
自然排序:TreeSet会调用集合元素的CompareTo(Object)方法比较元素的大小关系,然后将元素按照升序排序
2.Map接口:数据以键值对<key,value>的方式进行存储
key:不可重复的,使用set存储
value:可以重复,使用Collection存储
实现类:
HashMap
LinkedHashMap
TreeMap
HashTable

Collection coll = new ArrayList(); --接口指向实现类
–如果存入的集合元素是自定义对象,需要重写hashcode()和equals()
方法:add,size,addAll(Collection coll),isEmpty()判断集合是否为空,clear()清空集合元素
contains(Object o):判断集合中是否包含指定的元素,remove(Object o) :删除集合中的元素,toArray() 将集合转化为数组,removeAll(Collection c):从当前集合中删除另外一个集合(https://blog.csdn.net/Tracycater/article/details/60955299?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param)
遍历集合:
1.迭代器Iterator实现集合遍历 2.增强for循环 3.for循环

List接口:
Collection接口的子接口,List是有序集合,可以存储相同的元素,存储元素和取出元素的顺序一致
有索引,包含了一些带索引的方法(底层实现是使用数组,它是一个可变数组)
方法:add()
add(int index, Object ele):在指定的索引位置添加元素
addAll(int index, Collection coll):在指定的索引位置添加一个集合
get(int index):获取指定索引位置的元素
indexOf(Object o):返回o在集合中首次出现的所以位置,没有找到返回-1
lastIndexOf(Object obj):返回obj在集合中最后一次出现的索引位置,如果没有找到索引,则返回-1
remove(int index):删除指定索引位置的元素
set(int index, Object ele):设置指定索引位置的元素(update)
List集合中常用的实现类
1.ArrayList(重要)
①.底层实现是使用数组的方式来实现(动态数组),允许包含所有的元素类型(null)
②.可以根据索引位置对集合进行快速的随机访问(优点)
③.向指定索引的位置插入元素或者删除元素速度比较慢(缺点)
2.LinkedList
①.底层实现是采用双向链表的方式来操作数据(通过next和prev可以移动指针)
②.便于向集合中插入和删除元素,效率非常高(优点)
③.使用链表的形式操作数据,访问速度是比较慢(缺点)

ArrayList和LinkedList
1.ArrayList是基于数组的方式实现,LinkedList是基于双向链表的数据结构实现,这是两种不同的技术,决定了各自的应用场景
2.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针
3.对于频繁的新增和删除操作(add,remove),LinkedList优于ArrayList,因为ArrayList要移动数据

Map接口:Map是用于保存具有映射关系的数据,Map中保存着两组值(一组是key,一组是vaue)
优点:类似于字典一样通过Key可以得到对应的value,使用这种映射关系方便查找数据
①.key:Map中的键 它是不能重复的,底层采用的技术是Set
②.value:Map中的值 它是可以重复的,底层实现采用Collection(List)
③.Map实际上是提供了一个Entry内部类封装了key-value
内部类 Map.Entry
①.Map中包含一个内部类Entry,它是封装了一个键值对
②.常用方法
– getKey()
– getValue()
Map的常用方法
Object put(Object key,Object value):添加元素|更新元素
Object remove(Object key):移动元素 删除一个key-value
void putAll(Map t):添加一个Map元素
void clear():清空元素
Object get(Object key):根据key获得指定的value,如果没有找到对应的key,则返回null
boolean containsKey(Object key):是否包含指定的key 如果包含则返回true,如果不包含返回是false
boolean containsValue(Object value):是否包含指定的value
int size():集合长度
boolean isEmpty():是否为空
boolean equals(Object obj)
Set keySet():返回Map所有key组成的集合Set
Collection values():返回Map所有的value组成的集合 Collection
Set entrySet():返回Map中所有的键值对组成的集合(每个集合元素又是Entry对象)

Set集合:Set接口继承与Collection,存储的数据是无序的(内部有序,外部无序),不可重复的
添加进set中的元素一定要重写equals和hashCode()方法
–set中元素的存储使用的是哈希算法,当向set中添加元素时,首先会调用该对象所在类的hashcode方法计算哈希值,计算后的哈希值决定了元素在set中的存储位置。再通过equals方法比较两个对象是否相同,如果相同,则后面的对象不能添加,如果不同,则都可以添加
实现类:
HashSet(主要实现类) LinkedHashSet(基于链表的实现方式) TreeSet(采用排序的方式)
HashSet:采用哈希算法存储集合的元素,更利于存储和查询(底层数据结构是哈希表)
哈希表:综合了数组和链表的优点,可以看做一个链表的数组
HashSet不能保证元素的排列顺序,顺序和添加的顺序是不一致的
内部存储机制:HashSet集合判断两个元素是相同对象的标准:通过equals方法比较相等,并且两个对象的hashCode值也是相同的
为什么不适用数组而使用HashSet?
HashSet通过哈希值确定存储位置,可以*的增加长度,并根据哈希值访问元素,不用挨个遍历索引去访问
LinkedHashSet:输出集合元素时元素顺序和添加顺序是一致的
List和Set区别(面试题)
①.List和Set都是Collection接口的子接口
②.List是存储有序的 可以重复的数据
③.Set是存储无序的 不可重复的数据
④.底层存储机制不同

Java基础-集合框架