集合高级

集合框架

在这里插入图片描述

集合相关面试题
1、List接口、Set接口,Map接口
2、ArrayList和LinkedList的异同
相同点:
1)都是先List接口,可排序、重复、单独访问
2)所用方法的使用是一样的
不同点:
1)数据结构不同
ArrayList一维数组
在这里插入图片描述

		   	   LinkedList是双向链表

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

	2)性能不同
	ArrayList
		有点:查询速度快
		缺点:插入和删除速度慢,因为要移动大量的数据
	LinkedList
		优点:插入和删除速度快,因为只需要修改上一个、下一个节点的地址
		缺点:查询速度慢,因为需要一个个向后或向前查找

	LinkedList在集合开头和结束位置插入和删除比较快,在中间位置比较慢,因为定位中间位置需要大量时间。一般开发时,查询的需求远大于插入和删除,一般情况瞎都是用ArrayList。


3、ArrayList和Vector的异同
	相同点:
		数据结构和用法相同
	不同点:
		ArrayList是非线程同步(安全)的,适合单线程使用
		Vector是线程同步的,适合多线程使用
		线程同步会降低程序性能,ArrayList性能高于Vector


4、ArrayList的源码   
     数据结构是什么         
           transient Object[] elementData;    
               默认容量是多少      
                 private static final int DEFAULT_CAPACITY = 10; 
                        如何扩容的             
               private void grow(int minCapacity) {         
                      // 获得原来数组的长度    
                   int oldCapacity = elementData.length;    
       // oldCapacity >> 1 相当于除以2,新容量是原来容量的1.5倍           
                  int newCapacity = oldCapacity + (oldCapacity >> 1);        
             if (newCapacity - minCapacity < 0)       
                  newCapacity = minCapacity;     
                      if (newCapacity - MAX_ARRAY_SIZE > 0)   
                      newCapacity = hugeCapacity(minCapacity);                  
                        // 把旧数据数据复制到新数组中,替换原来数组            
                  elementData = Arrays.copyOf(elementData, newCapacity);                }

HashMap相关
HashMap的基本用法
put(键,值)
值 get(键)
将自定义类型作为键
练习:
定义司机类,属性:姓名、年龄、性别
定义汽车类,属性:品牌、颜色、价格
创建HashMap集合,将司机作为键,汽车作为值添加到集合中
测试通过司机对象从集合查找汽车
问题:默认情况下,Map集合通过键的内存地址来查找值,如何通过键对象的属性来
查找值,而不是键的内存查找。
解决方法:
给作为键的类,重写
int hashCode 返回整数,该整数是通过对象的属性值计算出来的
boolean equals 返回当前对象和参数是否相等(默认比较内存地址)重写后比较是属性值
注意:作为Map的键,必须要重写hashCode和equals方法

HashMap的原理
数据结构:
一维数组+单项链表

在这里插入图片描述

	优点:数组的查找速度快、操作方便
	
如何保存数据的:
	1、计算键的hashCode,将该整数算出数组的下标
	2、通过下标找到数组上的数据(键值对)
		哈希碰撞(通过不同的属性值,算出同一个整数)
	3、如果该位置上没有数据,直接将新数据添加到该位置
	4、如果该位置上有数据,将已有数据的键和新加数据的键调用equals方法进行比较
	5、如果equals返回true,将新的值覆盖原来的值
	6、如果equals返回false,将新键放到原来键的后面,如果之前还有数据,再往后放,直到末尾
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值