大数据的学习路程(java基础学习集合篇)

1.集合
概念:简易:放数据对象引用的容器
来历:因为数组长度固定,类型单一,所以有了集合
整体的接口架构图:
接口 Iterable
|
Collection(无序)
接口 List Set

类: ArrayList vector LinkedList HashSet TreeSet

1.类继承了list这层的接口,list实现了上一层接口.类又继承了Iterable接口,为什么呢?
说明了:1.类即重写了List这层的接口自身的方法,也重写了collection的方法;
	   2.另外更重要的说明:类可以扩展List层以外的继承的接口
	   3.以外List这层接口,改变了,或者没有了,类这层也能保持重写集合的方法



底层原码:
有什么好处:弥补了数组的长度固定,存储类型单一的不足,比数组更灵活,提高了开发的效率.
为什么有这好处:
对什么进行操作:集合的对象
范型作用:是用来规定集合数据的类型(因为不规定时,集合可以什么都存储)
集合里面存的是什么:对象,不能存基本类型---->包装类可以哟

2.集合的包含接口类
List , Set, May
概念:
整体的接口架构图:
底层原码:
有什么好处:
为什么有这好处:
对什么进行操作:
常用的:ArrayList,linkedList,HashSet,HashMap

3.集合中的contains(包含).要判断是传进来的对象,是否重写了equals方法,不然地址会不同(基本类型除外)
并不是contains方法重写了equals,而是传进来的对象,是否重写了equals

4.equals的方法重要性:
1.集合里面的增删改查,都要重写equals; 原理:通过equals方法去查找这个对象
2.对象的比较,对象也要重写equals

--------------------------------------------List特性--------------------------------------------------------------

5.List的有序:是指插入的顺序,并不是值的大小排序-------->所以有种用法,就是List转数组,用工具类大小排序,再转回List

6.List的删除时候,如果有基本类型,那么默认是调用索引去删除,而不是把基本类型装箱成对象类型
例子:主要声明的接口,remove的转入的参数,删除的东西是不一样的
1.如: Collection collection = new ArrayList();
collection.remove(Ojbect o);---->找的是集合的对象删除,并不是索引

		  List list = new ArrayList();
		  list.remove(o);------>这就是索引,根据索引去删除
		  list.remove(new Integer)();-----这样也是根据对象,删除对应的值

--------------------------------------------ArrayList------------------------------------------

7.增加,删除慢:因为其中增加个元素的,后面的元素都要往后移动.删除,后面的元素都要往前移动,所以慢
查询快:因为底层是数组,随机访问,所以速度快

------------------------------------------- LinkedList-----------------------------------------

8.增加,删除快:因为底层是双向链表数据结构,无论增加,还是删除,操作就一步,就可以了
查询慢:因为每次查找,都是从头开始

-------------------------------------------- Iterable------------------------------------------
9.Iterable(迭代器用来遍历的):不需要下标,也不需要长度,就可以把集合遍历出来.
好处:(给我一个集合,我就能帮你遍历出来.
缺点:依赖于现有的集合–给他,不然它没用)new不出来----寄生模式
作用:将集合的元素遍历出来
为什么:
场景:

9.1.Iterator iterable = list.iterator();//迭代器iterator
9.2.hasNext()----判断是否有下个值,有则返回true,没用则返回false
9.3.iterator.next();---->不仅将值返回,还将下标往下走
9.4.坑:
//是值跳着输出,因为上一次拿来比较了,没有输出
while(iterator.next() != null){
system.out.println(iterator.next());
}
//严禁直接集合调用.iterator(每调一次,就是个新的迭代器):无限循环
while(list.iterator.hasNext()){---->这是第一个迭代器
System.out.println(list.iterator.next);----->这是第二个迭代器
}

---------------------------------------------范型----------------------------------------------
10.范型:在集合<对象类型>,就规定只能放这种类型
好处:省去了类型转换
事项:1.左右范型里面对象类型,没有没有父子类的关系---->要一样的类型
2.右边的对象类型填了,左边可填可不填
3.集合里面的对象值,可以填写范型定义的子类
如:List list
list.add(“string”);

11.toArray:集合转数组 数组转集合:asList

---------------------------------------------HashSet-----------------------------------------------
Set的加入对象时,是没有下标索引的.需要哈希算法之后,才产生下标值排序
12.什么是哈希算法?

13.Set是否能重复?(因为Set的特性,无序,不重复)
答:有种场景:可实现重复
①往集合放入对象,没有重写HashCode的时候

14.Set是否真的无序?(因为Set的特性,无序,不重复)
答:Set的对象排序.是根据对象的hashcode值来比较大小,排序的,所以当存入新的对象时,就会比较hashcode,之后,若无加入,则还是一样固定的位置.

15.HashSet(内部是HashMap),HashMap,Hash等,本质是用数组实现的
结构:
HashSet(Hash前缀的) —> 数组,链表(超过64位)–>二叉树

	            数组    ----> 生成下标:根据Hash算法
		
			  Hash算法  ----->根据HashCode来生成下标
			  
1.Hash前缀的集合,本质是数组
2.数组的下标由Hash算法生成
3.Hash算法是根据HashCode生成下标(存储的位置)

16.Hash碰撞—>HashCode相同,equals不相同,相同的值怎么存放? |
答: 因为HashCode相同–>则哈希算法相同—>生成下标相同
equals不同,则以链表的形式存放( jdk7以下的jdk,放到链表,jdk8,当超过64位后,会用红黑树代替链表) | equals比较大是对象地址
| hashCode的比较的是hashcode的值(独有的)
如:①–>②–>③
| |
/
② |
所以:在对象类中,要养成复写equals,HashCode

17.HashCode相同,equals相同,相同的值怎么存放?
答:存储失败,只存先进来(已存在的),后来的存储失败

18.HashSet是无下标的,而底层有下标,通过哈希算法计算的出来的下标

-------------------------------------------------treeSet----------------------------------------------------------------------------------------

19.TreeSet:的底层是二叉数.,插入有序,不重复
优点:方便遍历

20.①TreeSet,存一个对象时(如:new Student()),需要对象实现comparable接口,重写compateTo方法,用来指定排序规则
如果不加入,则报错类型转换异常(ClassCastException)

记住:TreeSet,存对象,对象需要实现comparable接口,重写compateTo方法来定义排序规则(相同,为0;大于为1;小于为-1)

21:②种定制排序,也就无污染,对排序的对象不做任何修改,在TreeSet的构造器中传入(new comparetor())重写compare方法方法
return Integer.compare(o.XX,…);
降低耦合度

21.1.实现Comparable的接口,是自然排序.  实现comparetor是定制排序

22.TreeSet集合存入对象,一定要重写Comparable(单独的类实现它),comparetor(在TreeSet new)接口
------------------------------------------------ HashMap ---------------------------------------------

22.添加相同的key时,后面的把前面的覆盖

23.Map数据分为两部分:
key:是不可重复,可以为null. 可以用Set存储
value:可以重复,无序 可以用Collection存储

24.不能直接遍历,要么遍历key,要么遍历values

25.底层是数组

26.Map的有序,说的是 key的排序

27.凡是Hash的集合,都要重写equals,hashcode,防止发生hash碰撞

-------------------------------------------------Hashtable---------------------------------------------
28.命名:table是小写,没有驼峰命名,说明很老了,还没有驼峰命名…证明过时了---->不建议使用
(从jdk1.1就已经有的类,所以没有驼峰命名)
注意:1.key ,value,不允许为null,不然报空指针异常
2.线程安全,有synchronized修饰


问题:
1.为什么aslist一个集合,里面的数据删不了?
答:生成的list是可读,但不能修改
因为底层的没有add方法,也没有remove的方法,长度一旦确定就就改不了,并且内容也修改不了,因为底层的问题,Set传入参,返回的是传入下标的值,不会改

2.collection集合本身找不到一个元素:因为没有下标,无顺序---->但是List有

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值