黑马程序员_集合总结

-----Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一.集合的分类


1.Collection


List: 可重复, 有存储顺序(有索引),存和取有序
ArrayList 数组实现, 增删慢, 查找快
LinkedList 链表实现, 增删快, 查找慢
Vector 数组实现, 原理和ArrayList相同, 但线程安全
Set
HashSet
LinkedHashSet
TreeSet
2.Map


HashMap
LinkedHashMap
TreeMap
Hashtable
二.List的三个儿子(掌握)


(1)List的三个儿子特点:
List
ArrayList
底层数据结构是数组,查询和修改快,增删慢
线程不安全,效率高
Vector
底层数据结构是数组,查询慢(相对应ArrayList),增删慢(相对应LinkedList)
线程安全,效率低
LinkedList
底层数据结构是链表,查询和修改慢,增删快
线程不安全,效率高
(2)ArrayList(存储字符串和自定义对象)
(3)Vector(存储字符串和自定义对象)
有自己的特殊功能(方法)。
但是不用,被新功能给替代了。
(4)LinkedList(存储字符串和自定义对象)
有自己的特殊功能。可以很方便的操作头和尾。
(5)案例:
A:ArrayList存储字符串并去除重复值
B:ArrayList存储自定义对象并去除重复值
需求:我们认为同姓名和同年龄的人即为同一个人。
C:用LinkedList模拟栈数据结构
三.泛型(理解)


(1)泛型是一种把明确类型放在了创建对象或者调用方法时候才去明确的特殊的类型。
(2)格式:
<数据类型>引用数据类型
(3)好处:
A:解决了黄色警告线问题
B:把运行期间的转换异常给提前到了编译期间
C:优化了程序设计,不需要做强制类型转换了
(4)泛型的前世今生
A:泛型类
B:泛型方法
C:泛型接口
(5)泛型的使用:(掌握)
看API中的类或者接口,其后是否跟有<>,如果有,就是泛型的应用。
一般在集合中用。

四.HashSet(LinkedHashSet)


1.HashSet原理
我们使用Set集合都是需要去掉重复元素的, 如果在存储的时候逐个equals()比较, 效率较低,哈希算法提高了去重复的效率, 降低了使用equals()方法的次数
当HashSet调用add()方法存储对象的时候, 先调用对象的hashCode()方法得到一个哈希值, 然后在集合中查找是否有哈希值相同的对象
如果没有哈希值相同的对象就直接存入集合
如果有哈希值相同的对象, 就和哈希值相同的对象逐个进行equals()比较,比较结果为false就存入, true则不存
2.将自定义类的对象存入HashSet去重复
类中必须重写hashCode()和equals()方法
hashCode(): 属性相同的对象返回值必须相同, 属性不同的返回值尽量不同(提高效率)
equals(): 属性相同返回true, 属性不同返回false,返回false的时候存储
五.迭代(遍历)


1.List
a.普通for循环, 使用get()逐个获取
b.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
c.增强for循环, 只要可以使用Iterator的类都可以用
d.Vector集合可以使用Enumeration的hasMoreElements()和nextElement()方法
2.Set
a.调用iterator()方法得到Iterator, 使用hasNext()和next()方法
b.增强for循环, 只要可以使用Iterator的类都可以用
六.TreeSet


1.特点
TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
2.使用方式
a.自然顺序(Comparable)
TreeSet类的add()方法中会把存入的对象提升为Comparable类型
调用对象的compareTo()方法和集合中的对象比较
根据compareTo()方法返回的结果进行存储
b.比较器顺序(Comparator)
创建TreeSet的时候可以制定 一个Comparator
如果传入了Comparator的子类对象, 那么TreeSet就会按照比较器中的顺序排序
add()方法内部会自动调用Comparator接口中compare()方法排序
c.两种方式的区别
TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
TreeSet如果传入Comparator, 就优先按照Comparator
七.Map集合


1.Map集合的特点
Map集合一次存储两个对象, 一个键对象, 一个值对象
键对象在集合中是唯一的, 可以通过键来查找值
2.Map常用方法
put() 存储一条记录, 一个键和一个值
get() 根据键对象获取值
containsKey() 判断是否包含指定的键
containsValue() 判断是否包含指定的值
remove(key) 根据键删除一条记录
size() Map集合中的记录数
values() 得到所有的值对象组成的一个Collection集合
3.迭代Map集合
a.keySet()
先调用keySet()方法从Map集合中获取所有Key组成的一个Set集合
迭代Set集合可以得到每一个Key
然后再调用get()方法通过Key获取每一个Value
b.entrySet()
先调用entrySet()方法从Map集合中获取所有Entry(键值对)组成的一个Set集合
迭代Set集合可以得到每一个Entry
然后再调用getKey()和getValue()方法得到每一个Key和每一个Value
4.HashMap
在使用HashMap存储键值对的时候, 先调用Key对象的hashCode()方法计算一个哈希值, 在Map中查找是否有相同哈希值的Key对象
如果没有哈希值相同的Key对象, 这个键值对直接存入
如果有哈希值相同的Key对象, 那么就进行equals比较
比较结果为false就存入, true则覆盖原Value
5.LinkedHashMap
HashMap的子类, 算法相同, 但保留了存储的顺序
6.TreeMap
在使用TreeMap存储键值对的时候, 会使用Key对象和集合中已存储的Key对象进行比较, 确定二叉树上的位置
比较的方式和TreeSet指定的方式相同, Comparable和Comparator
7.Hashtable
类似HashMap, 线程安全, 效率略低, 不允许null键和null值
八.集合的迭代


1.Collection
Iteraotr: 通过iterator()方法得到迭代器, 调用hasNext()和next()方法进行迭代
ForEach: for (类型 变量名 : 容器) { 循环体 }
2.Map
keySet(): 得到所有的键组成的Set, 遍历Set得到每一个键, 然后再分别获取值
entrySet(): 得到所有的Entry组成的Set, 遍历Set得到每一个Entry, 再分别getKey()和getValue()
3.List
Iterator
ForEach
for: 根据索引定义for循环, 调用get()方法根据索引获取每一个元素
4.Vector
Iterator
ForEach
for
Enumeration: 类似Iterator, 通过elements()方法得到Enumeration, 调用hasMoreElements()和nextElement()方法进行迭代

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值