【Java中级】(二)集合框架


2.1、ArraList
1、自增长
容器的容量"capacity"会随着对象的增加,自动增长
只需要不断往容器里增加英雄即可,不用担心会出现数组的边界问题。
2、常用方法
关键字
简介
add
增加
contains
判断是否存在
get
获取指定位置的对象
indexOf
获取对象所处的位置
remove
删除
set
替换
size
获取大小
toArray
转换为数组
addAll
把另一个容器所有对象加进来
clear
清空
3、遍历
关键字
简介
for
用for循环遍历
iterator
迭代器遍历
for:
用增强for循环遍历
2.2、HashMap
1、HashMap的存储方式——键值对
2、键不可以重复,值可以重复
2.3、HashSet
1、HashSet的元素,不能重复
2、Set中的元素没有顺序
3、遍历
Set不提供get()方法来获取指定位置的元素
所以便利需要用到迭代器,或者增强for循环
4、HashMap和HashSet的关系
通过观察HashSet的源代码
可以发现HashSet本身并没有独立的实现,而是在里面封装了一个Map
HashSet是作为Map的key而存在的
而value是一个命名为PRESENT的static的Object对象,因为是一个类属性,所以只会有一个
2.4、Collection
Collection是存放一个对象的,Map是存放键值对的

2.5、Collections
Collections是一个类,容器的工具类,就如同Arrays是数组的工具类
关键字
简介
reverse
反转
shuffle
混淆
sort
排序
swap
交换
rotate
滚动
synchronizedList
线程安全化
2.5、ArrayList和HashSet的区别
1、是否有顺序
ArrayList:有顺序
HashSet:无顺序
2、能否重复
List中的数据可以重复
Set中的数据不可以重复
重复的判断标准时:
首先看hashcode是否相同
如果hashcode不同,则认为是不同的数据
如果hashcode相同,在比较equals,如果equals相同,则是相同数据,否则是不同数据
2.6、ArrayList和LinkedList的区别
ArrayList 插入,删除数据慢
LinkedList 插入,删除数据快
ArrayList是顺序结构,所以定位很快
LinkedList是链式结构,所以定位慢

2.7、HashMap和HashTable的区别
HashMap和HashTable都实现了Map接口,都是键值对保存数据的方式
区别1:
HashMap可以存放null
HashTable不可以存放null
区别2:
HashMap不是线程安全类
HashTable是线程安全类

2.8、hashcode原理
1、hashcode概念
都有一个对应的hashcode(散列值)
比如字符串“gareen”对应的是1001 (实际上不是,这里是方便理解,假设的值)
比如字符串“temoo”对应的是1004
比如字符串“db”对应的是1008
比如字符串“annie”对应的 也是1008
2、保存数据
准备一个数组,其长度是2000,并且设定特殊的hashcode算法,使得所有字符串对应的hashcode,都会落在0-1999之间
要存放名字是"gareen"的英雄,就把该英雄和名称组成一个 键值对,存放在数组的1001这个位置上
要存放名字是"temoo"的英雄,就把该英雄存放在数组的1004这个位置上
要存放名字是"db"的英雄,就把该英雄存放在数组的1008这个位置上
要存放名字是"annie"的英雄,然而 "annie"的hashcode 1008对应的位置 已经有db英雄了,那么就在这里创建一个链表, 接在db英雄后面存放annie
3、查找数据
比如要查找gareen,首先计算"gareen"的hashcode是1001,根据1001这个下标,到数组中进行定位,( 根据数组下标进行定位,是非常快速的) 发现1001这个位置就只有一个英雄,那么该英雄就是gareen.
比如要查找annie,首先计算"annie"的hashcode是1008,根据1008这个下标,到数组中进行定位,发现1008这个位置 有两个英雄,那么就对两个英雄的名字进行逐一比较( equals),因为此时需要比较的量就已经少很多了,很快也就可以找出目标英雄
这就是使用hashmap进行查询,非常快原理。

这是一种用 空间换时间的思维方式

猜你喜欢

转载自blog.csdn.net/finish_dream/article/details/79354000