集合、set、list、map、所有集合基本知识使用方法总结

1.集合的概述
集合概述:就是一个专门存放多个引用数据类型对象的容器【重点::只能存放引用数据类型】
特点:1.它可以存放多种数据类型对象2.集合的长度可变的3.支持泛型
面试题:集合和数组的对比
数组:创建后只能存放单一数据类型【所有的数据类型】创建前可以存放任意数据类型,创建后长度不可变,基本没有方法可以使用
集合:属于类和接口体系【本身也是引用数据类型 】 集合只能存放引用数据类型,不能存放基本数据类型,集合长度自动维护,所以可变,集合拥有自己的方法体系
集合的体系
概述:集合的内容组成结构
根据集合位置上存放的数据个数不同分为:
单列集合【collection】:每个位置存放的是单一数据类型
双列集合【Map】:每个位置存放的是一对有关系的 数据
单列集合根据存放和取出的顺序是否一致分为:
有序集合:list,存数据和取数据顺序一致的单列集合 实现类:ArrayList,linkedList,Vector【基本被淘汰】
无序集合:set :存数据和取数据顺序不一致的单列集合 实现类:HashSet、linkedHashSet
双列集合:map:
实现类:HashMap、LinkedHashMap

2.Collection
概述:是单例集合的顶层接口,在定义所有单列集合的一些共性功能。要想使用里面的资源必须找他的实现类,接下来学习他的资源使用ArrayList这个实现类来调用
常用方法:add(E e):添加数据e到集合中【增加】 remove(E e):删除集合中指定大的元素e【删除单一元素】 clear():一次性清空集合【删除全部】 contains【E e 】:判断集合中是否包含元素 e[查询] size():获取集合当前的长度【获取当时集合的内容的长度】 isEmpty:判断集合是否存放数据
addAll:(Collection c):把参数集合c中的内容从调用集合中删除 removeAll(Collection c):把参数集合c中的内容从调用集合中删除 containsAll(Collection c):判断调用集合中是否包含参数集合c中的内容 retainAll(Conllection c):在调用集合中保留参数集合的内容其他的删除
遍历
1.数组法
原理:想办法把集合转变成数组,利用for循环对数组进行遍历
集合转数组:Collection中提供方法toArray():可以把集合转变为数组
2.迭代器遍历
迭代器(Iterator):是一个接口,它里面的功能可以对集合进行遍历
iterator的方法:hashNext():判断下一个位置是否有元素【判断】 next():有元素取出该位置的元素【获取元素】remove():删除正在便利的那个元素

3.list
概述:是单列集合中的有序集合的顶层接口,属于Collection的子接口,除了拥有Collection的通用方法,还有自己的特有方法【有序集合的共性功能】
特点:1.存取有序【存放数据的顺序和取出数据的顺序一致】2.有索引【和数组相似,底层使用数组结构构成的】3.存放数据可以重复
特有方法:
add(int inde,E e):在指定的索引位置上添加元素e
remove(int index):删除指定索引位置的元素
set(int index,E e):修改指定索引围着值
get(int index):获取指定索引位置的值
面试题
add方法和set方法对比:
add方法是一个插入方法,会使集合的的元素增加而不是覆盖行为,set方法是一个修改方法,不会使集合的元素增加是一个覆盖行为
遍历方式:
1.转变为数组,进行遍历
2.使用迭代器进行遍历
1.hasNext():只有判断的行为
2.next():取值,同时移动迭代器的指针,指针就是迭代器用来指向下一个位置的 并发修改异常:java.util.ConcurrentModificationExcrption产生的原因就是迭代器在遍历的过程中使用集合的对象进行元素的增删。注意:::迭代器遍历的时候不允许使用集合的对象对元素进行增删操作
解决并发修改异常的方案:
1.使用迭代器对象进行增删操作,删除:直接使用iterator删除,增加:使用子类ListIterator的对象增加 2.
2.不适用迭代器去遍历增删操作
直接使用for循环遍历
List的子类:常用的实现类:ArrayList,LinkedList
ArrayList:概述:是List接口的典型的实现类,他的出现就是为了实现List接口的所有共嗯,他没有自己的特有功能
ArrayList的特点:有序集合 ,查询比较快,增删比较慢,【底层是数组构成的】
LinkedList:概述:他是有序集合的一个实现类,但是这个类主要提供对集合首尾进行操作功能的一个类,共性方法可以使用,但是实际不怎么用,基本使用自己首位操作特有方法
LinkedList的特点:有序集合,查询比较慢,增删比较快【底层是链表结构组成】
特有方法
addFirst(E e):在集合的头部添加元素
addLast(E e):在集合的尾部添加元素
removeFirst():删除集合头部元素
removeLast():删除集合尾部的元素
getFIrst():获取集合头部的元素
getLast():获取节尾部的元素
pop():弹出头部的元素
push(E e):在集合的头部增加元素

泛型
概述:提前使用未知的数据类型,即占位置的符号
可以代表任意的引用数据类型
好处:1.可以把一些异常提到编译的时候,这样提升编写代码的速度 2.避免了强转的工作
特点:1.泛型只能是引用数据类型2.泛型没有继承之说3.泛型一旦确定保持一致4.如果没有指定泛型,具体化的时候默认Object类型
泛型的使用范围
1.使用在类上【泛型类】
格式:修饰符 class 类名 《E》{类的内容}
举例:ArrayList{类的内容}
说明:类中使用的一些不确定的数据类型就可以使用
泛型实例化:让类中的泛型具体化
泛型实例化时机:创建该类的对象的时候实例化泛型【必须实例化】
注意:1.泛型实例化的时候只能给定引用数据类型2.创建对象的时候如果对象要赋值给变量,保证左右的泛型类型一致
2.使用在方法上
概述:因为方法体中使用到不确定的数据类型,需要在方法上要使用泛型 格式:修饰符<泛型>返回值类型 方法名(泛型参数列表){方法体}
说明:返回值类型前面的泛型只是用来声明泛型的 泛型实例化时机:该方法被调用的时候才会被实例化
注意事项:1.在方法体中泛型就是一个数据类型2.泛型一旦确定整个方法中的泛型就是确定的数据类型3.方法定义的时候声明了泛型,方法体和参数列表中的泛型符号要全程一致
3.使用在接口上
概述:接口中使用到不确定的数据类型,需要使用泛型
格式:修饰符 interface 接口名 <泛型>{接口的内容}
例如:List 泛型接口
泛型实例化时机
1.在定义接口的实现类的时候可以让接口的泛型实例化 创建实现类对象之前就已经确定
2.定义实现类的时候用的也是相同的泛型,创建实现类对象的时候必须去欸的那个数据类型
4.泛型通配符
概述:我们使用别人写好泛型的类、接口进行传递数据的时候,里面的不确定数据类型被动在接受,这个不确定的数据类型也得一个符号来暂时替代,我们使用<?>来暂时代替被动接受的数据类型 <?>:就是泛型通配符
高级使用:泛型通配符可以设置泛型的使用范围的。
通配符的上限:格式:<?extends 类名>
意义:泛型的数据类型只能是类本身或者它的子类类型
通配符的下限:格式:,<?super类名>
意义:泛型的数据类型只能是类本身或者它的父类类型

5.Set
概述:他是单列集合的无序集合,他是所有无序集合的顶层接口,里面的所有功能就是无序集合的共性功能;但是他没有独有的功能,它的功能都是Collection里面的功能,使用的时候就是用Collection接口里面的功能。
特点:1.存取的数据的顺序不一致【无序】
2.没有索引【无索引】 3.存放的元素要唯一,不可重复。【元素唯一】 常使用于去重
Set的子类:HashSet:概述:就是单纯体现无序集合的功能,没有自己的特有的功能,体现无序集合的特点。
HashSet
概述:就是单纯的体现无序集合的功能,没有自己特有的功能,体现无序集合的特点。
HashSet的遍历:
1.数组法
使用HashSet的对象set调用toArray()方法形成数组arr,然后再用for循环或foreach遍历
2.迭代器遍历
1.获取迭代器对象,iterator:在遍历的时候可以删除元素,但是不能增加元素。ListIterator:在遍历的过程中既可以删除元素,也可以增加元素。
3.增强for遍历
for(数据类型名 变量名:容器对象名){拿到元素的处理逻辑}
LinkedHashSet
概述:他是set集合的一个实现类,同时也是HashSet的子类。他是无序集合中的有序集合,体现无序集合的另外两个特点【在存取顺序上LinkedHashSet是Set集合的叛徒】
特点:1.存取有序2.没有索引3.元素还是唯一不能重复【元素唯一不重复】
没有自己特有的功能,它的功能和HashSet一样都是Collection的功能,遍历也是HashSet一样:数组法、迭代器、foreach
HashSet:无序,无索引,元素唯一 LinkedHashSet:有序 无索引 元素唯一 他们都没有自己的独有方法,都是Collection中的方法和遍历方式
set如何保证存放对象的属性值唯一
1.重写hashCode hashCode方法是Object类中的一个方法,含义:返回调用对象的十进制哈希值,哈希值是对象地址值得一部分【地址值:全限定类名+@+哈希值】,重写之后的hashCode方法可以保证两个对象的哈希值一样
2.重写equals方法:equals方法用来比较两个对象的属性值是否相同的方法
3.不重写hashcode和equals方法:属性值相同的对象的哈希值不一样 equals方法比较的结果:false【没有比较属性值】 ==比较的结果:false set集合添加的结果是:全部添加
4.只重写equals方法:属性值相同的对象的哈希值不一样 equals方法比较的结果:true【属性值进行了比较】==比较的结果:false set集合添加的结果是:全部添加
5.只重写hashcode方法:属性值相同的对象的哈希值一样 equals方法比较的结果:false【内容值没有比较】==比较的结果:false set集合添加的结果是:全部添加
6.两个方法全部重写:属性值相同的对象的哈希值一样 equals方法比较的结果:true【进行了属性值的比较】==比较的结果:false set集合添加的结果是:只添加了一个对象

6.Map集合
概述:他是集合体系中的双列集合。每个位置上存放的是一对数据。而且这对数据具有映射关系
映射关系:map中存放的就是一对键值对;键:唯一不可变;值:可以有重复的。在map集合中的键值对中key比较重要【只有通过key可以扎到对应的值,不能通过值来找到对应的键】
map的特点:1.map的集合是无序的2.它的key值不能出现重复的值【key唯一】3.它的值可以重复的4.通过key可以精确的找到对应的值
map集合的常用方法:
put(K k,V v):添加键值对数据到map集合
remove(K key):根据key删除改key的键值对数据
clear():清空map集合
get(K key):根据key获取对应的value值
containsKey(K k):判断集合的所有key中是否包含参数k
containsValue(K k):判断集合的所有value值是否包含参数V
map集合的遍历
1.键找值方式:通过map的KeySet()方法把map的所有key放到一个set集合中返回。
1.通过map对象调用KeySet得到map集合所有key的set集合
2.遍历set集合
3.在遍历set集合的循环体中使用map集合对象调用get(key)得到对应到value
2.键值对方式:通过map的entrySet()方法把每一个键和值封装到一个Entry对象的属性中然后把Entry对象存放到一个set集合中返回。
1.把map集合变成entry对象的set集合
2.遍历entry对象的集合
3.在遍历的过程中通过getter方法获取对那个的keyValue
HashMap
概述:它是map集合的典型的实现类,没有自己的特有特点和功能,无非就是为了事项map接口的所有一切。
功能:
put:增加和修改元素
remove:删除单对元素
clear:删除全部元素
get:获取 指定元素
containskey:判断map集合的key中是否包含参数
containsValue:判断map集合的value中是否包含参数
Keyset:获取map集合所有key的set集合
entryset:获取所有键值对数据对应的简直对对象的set集合
values:获取map集合的所有value的单列集合遍
遍历方式和map一样
如何保证Hashmap的key存放对象的内容是唯一性:
1.对象的不一样【地址不一样就是不一样】只需要把对象当作键存入到map集合即可
2.对象的值不一样【对象的属性值不一样,不包括地址值不一样属性值不一样】
3.需要既要对地址值进行保证也要对内容之进行保证,要同时达到这样的效果,需要在对应的类中重写hashCode和equals方法
4.唯一性和hashSet原理是一样的:1.是因为Hashset底层是使用HashMap来存放数据并实现的2.都是根据hash值来存放数据的
Hashmap的Key可不可以为null,value的值可不可以为null?
可以的而且支持同时为null,null为键的时候不管 是否重写hashCode和equals方法都是唯一的一个key
HashTable
概述:是map集合早期的典型实现类,没有字独有的功能和特点,完全是为了实现map的功能而出现的,在jdk1.2版本之后逐步被Hashmap取代使用位置。使用方式和HashMap一摸一样,无非就是调用的时候换个对象。
LinkedHashMap
概述:他是HashMap的子类,同样也是Map的实现类。它的功能全部来自map的共有功能。map集合是无序的。但是这个实现类是有序的,其他的特征和map的特征一样。
9.Map和Collection的区别
相同点:都是存放引用数据类型的容器
不同点:位置上存放的元素的个数不一样:map是一对键值对数据Collection放的只有一个。map里面有序的之后linkedHashMap而COllection有list体系和LinkedHashset。 map不能直接遍历,Collection可以直接遍历,遍历方式一共有四种

Collections工具类
概述:用来处理Collection集合中数据的一些相关功能的工具类。类似于Arrays
常用方法:
1.int BinarySearch(List list,Ee):二分查找法查找e元素在list集合的第一次出现的索引 使用前提:list需要升序排好
2.fill(List list,E e):使用e填充满list【使用元素e替换list集合原有的元素】:使用前提:list集合中必须要有元素
3.int frequency(Collection c ,E e):返回集合c中的e元素的个数
max:返回最大值;min:返回最小值
replaceAll(List list,E old e,E new e):使用news将集合中的olde元素全部替换。
reverse(List list):反转list集合中的元素位置
shuffer(List list):将list集合中的元素全部打乱
swap(List list,int a,int b):将list集合中a索引的值和b索引的值进行互换
sort(List list):将list的元素进行升序排序

原理:
注意:不同的对象可能有相同的哈希值,只判断哈希值不能够完全的确定两个对象 就一定相同,进一步判断两个对象的内容值是否一致。,,,,,最终总结:::要想保证 set集合中存放的对象内容值唯一,必须重写hashCode和equals方法。set集合本身只能保证添加对象 的地址值唯一。

1.调用被添加元素的hashCode(),和HashSet中已有元素的hashCode比较是否相同 1.1 如果哈希值不相同,直接存储对象到set集合1.2如果哈希值相同,需要调用equals方法比较是否相同。不相同:直接存储元素到集合,相同,认为是同一元素,不存储。

发布了29 篇原创文章 · 获赞 9 · 访问量 823

猜你喜欢

转载自blog.csdn.net/qq_41488299/article/details/104742745