java集合笔记

1.集合 
集合、数组是对多个数据进行数据存储操作(在内存) 简称Java容器
数组特点
①一旦初始化后长度确定
②数组一旦定义好 其元素的类型确定,只能操作固定类型
③数组提供的方法非常有限,对增删改查效率不高
④获取数组中实际元素个数的需求没有现成的属性和方法可用
④数组存储特点:有序可重复 对于无序不可重复的需求不能满足。

Collection和Map体系
一、Collection接口:单列集合 用于存储一个一个对象
list:元素有序 可重复集合 动态数组
Arraylist:
Linkedlist:
Vector:
Set:元素无序、不可重复集合
 HashSet:
LinkedHashSet:
TreeSet:
二、Map接口 :双列集合用于存储一对(key-value)一对数据
HashMap:
LinkedHashMap:
TreeMap:
Hashtable:
Properties:
--------------------------------------------------------------------------------------------------------
collectoin常用方法:
add:添加对象
boolean 类型的contain(object j)方法:判断当前集合是否包含object对象,调用equals方法。
remove():移除对象 同样调用equals方法。
removeall():移除两个集合所有差集对象。
retainall():移除两个集合的交集对象。
equals(object obj):要想返回ture 需要当前集合和形参集合相同。
hashcode  :返回当前对象的hash值。
toArrary():集合转化为数组
arrary.aslist :数组转化为集合。
迭代器interator:返回interator接口的实例  用于遍历collection集合元素,interator不是容器只是方法 迭代器每次使用需要新构造对象,原因是需要指针恢复正常。
迭代器模式 提供一种方法或容器 不暴露内部细节的情况下遍历各个元素。
遍历的方式:next和hashnext()
①interator.next方法:演示集合内元素 不推荐
②for循环 不推荐
③while(iterator.hasNext()){
   sout('输出')}循环  推荐
迭代器执行原理  通过指针遍历下移 next()一次 指针下移一次 然后返回相应元素。
④移除迭代器的元素:remove()方法 如果未调用next()或者之前已经调用过remove() 再remove就会报错.
⑤增强for循环:可以遍历集合和数组jdk5.0新增 本质上还是迭代器
  for(  集合中元素类型 局部变量:集合对象)
for(object obj:coll){
 sout(obj)
}
增强for循环string对象是把string对象拿出来新生成一个 对原string对象没有影响
------------------------------------------------------------------------------------------------
list接口:比较Arraylist 、LInkedlist、vector三者异同
相同:三者都实现list接口,存储数据特点相同有序、可重复。
不同:
Arrarylist:1.2版本实现,线程不安全的 底层使用object【】elementData数组存储。
Vector: 1.0版本实现 线程安全  底层使用object【】elementData数组存储。
Linklist:1.2版本实现 底层使用双向链表存储 对于频繁插入和删除使用操作比arrarylist效率高。
①Arrarylist源码分析:
jdk7版本:
初始化容器底层长度为10 若长度不够则自动扩容为 (old+old>>1)=1.5倍若再不够则已对象长度为准。
建议开发中使用带参数构造器 应避免自动扩容; 像单例模式饿汉式
jkd8版本:
底层初始化为【】并没有创建长度为10的数组,当调用添加操作的时候,底层会进行比较,最小长度为10,后续添加扩容和jdk7一致。目的是降低内存消耗 像单例模式懒汉式。
②LinkList源码分析:
数据查询,添加用数组比较快。内部声明了node类型的first和last属性 默认为null
node定义为双向链表
③Vector源码分析:
底层默认长度为10,扩容默认为数组的二倍。

list接口常用方法:
list会关联索引
增:add(object obj)
删:remove(int index)/remove(object obj)
改 :set(int index,object obj)
查:get(int index)
插:add(int index)
长度:size()
遍历① iterator迭代器遍历
       ②增强for循环
       ③普通循环。
-------------------------------------------------------------------------------------------------------
Set接口:无序 不可重复的,比较Hashset、LInkedHashset、TreeSet三者异同。
HashSet:作为set常用接口,线程不安全,可以存储null值。
LinkedHashSet:linkedhashset是在hashset的基础上添加链表,
              是hashset子类,遍历其内部时可以按照添加的顺序遍历。
TreeSet:底层使用红黑树,添加元素必须是同一类new的对象,可以按照添加对象的指定属性排序。
无序性:无序性不等于随机,是存储位置的无序性,数据不是按照底层数组索引顺序添加
不可重复性:equals比较,涉及到equals和hashcode方法,保证添加的元素equals方法判断是不返回ture
hashset添加元素的过程:
①我们向hashset添加元素a 首先调用元素a 所在类的hashcode方法计算元素a 的hash值
②此哈希值通过哈希算法计算 出底层数组中存放位置(即索引位置)
③判读此位置上是否有元素,如果没有直接插入,如果有(以链表形式的多个元素)则比较元素a和b的哈希值,如果哈希值不同则添加成功,如果哈希值相同则调用equals方法,返回ture则添加失败,返回false则添加成功,并以链表的形式存储。jdk7中,元素a放到数组中指向原来元素,jdk8中原来元素在数组中指向a 总结'七上八下'
要求:向set添加数据一定要重写hashset和equals方法
          重写hashcode和equals的方法 相等的对象必须拥有相同的散列码。
linkedhashSet:对于频繁遍历,linkedhashset效率高于hashset
treeset:比较用compareto比较
自然排序中比较两个对象是否相同标准为compareto()返回0 不再是equals方法。
定制排序中比较两个对象是否相同标准为compareto()返回0 不再是equals方法。
-----------------------------------------------------------------------------------------------------------
Map 接口 :
Hashtable--->线程安全效率低,不能存储null的key和vaule
Hashtable子类properties:常用于处理配置文件 key-value用string存储
HashMap--->为Map主要实现类,线程不安全 效率高 可以存null的key和vaule
hashMap子类LinkedHashMap:频繁遍历用这个
SortedMap--TreeMap:使用红黑树 按照key_value进行排序,考虑key的定制排序或自然排序。
1.面试题
Hashmap底层原理?
Hashmap和Hashtable异同?
CurrentHashmap和Hashtable的异同?
MAP结构理解:
Map中的key:无序的、不可重复的 使用set存储所有的key
Map中的value:无序的、可重复的,使用collection存储所有的value
一个键值对 :key-value构成一个entry对象
Map中的entry:无序不可重复使用 set存储entry
HashMap底层:
JKD7:
在实例化后 底层创建一个长度为16的entry[] table 经过hash算法 得到entry数组的的存放位置,
①如果此位置为空,则key1-value1添加成功
②如果此位置不为空,意味着此时存在一个或多个数据(链表):
     1.若key1的hash值和已存在数据的hash值不相同,则添加成功;
    2.若key1的hash值和已存在的某一条数据hash相同,则会被set替换掉。
    3.数据以链表方式存储。
JDK7扩容:默认扩容为原来的2倍,并将原有数据复制过来。
JDK8与JDK7的异同:
1.new hashmap:底层没有创建长度为16的数组;懒加载
2.jdk8底层的数组为node[] 
3.首次调用put()方法时 创建底层长度为16的数组
4.jdk底层只有数组+链表 jdk8底层是数组+链表+红黑树
   当数组在某一个索引位置的元素以链表形式存在的数据个数>8 且当前数组的长度>64,此时索引位置的数据改为使用红黑树。
Default_initial_capacity hashmap默认容量16
Maxximum_capcity hashMap 最大支持容量2^30
Default_load_factor 默认加载因子0.75
threshold 扩容临界值 =容量*填充因子=16*075=12
treeify_threshold Bucket中链表长度大于该默认值 转化为红黑树:8
Min_treeify_capacity 桶中的node 被树化时最小的Hash表容量:64
--------------------------------------------------------------------------------------------------
linkedhashmap底层:继承hashmap 然后再基础上new linkedhashmap对象 增加指针;
Map常用方法:
添加 put :
删除 remove:
清空 clear:
查询get():获取指定value
      containskey :是否包含指定key
      containsvalue: 是否包含指定value
      size:获取key_value 对的个数
      isempty:是否为空
      equals:判断当前map的参数对象的obj是否相同
元视图的操作方法:
遍历key:
keyset方法:map调用keyset方法,然后再用迭代器遍历
遍历所有value
value方法:map调用value方法,然后再用迭代器遍历
遍历所有key-value:
entryset方法:map调用entryset方法,然后再用迭代器遍历
总结:增删改查 没有插入 长度遍历    
tree map添加的两种方式 put,
------------------------------------------------------------------------------------------------
properites hashtable子类 用于加载文件配置
Collections 是操作集合的工具类
Collection和Collections的区别?
Collection是操作单列集合的接口  包含list 和set
Collection是操作集合的工具类
reverse()翻转list元素顺序
shuffle()随机排序
sort(list)自然排序
sort(list,comparator)定制排序
swap()交换索引位置上的元素
max()
min()
frequency()找元素出现次数
copy(现在的,原来的) 将原来的复制现在的里面
replace ALL 替换
Arrarylist和hashmap是线程不安全的 
-------------------------------------------------------------------------------------------------------
集合数据结构

  

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值