分布式Java应用

Java最常用的两个包:Collection Map
Collection:存放多个单对象  Map:存放Key-Value形式的键值对
Collection分为两种类型接口:List和Set   List支持重复,Set不支持
List实现类:ArrayList  LinkedList  Vector  Stack   Set实现类:HashSet  TreeSet
Collection实现类重点掌握:增加 add()  删除remove   获取get(int index)   遍历iterator   是否存在contains  (详细见下文)
ArrayList
插入对象 add() : 已有的元素数量加1,产生名为minCapacity的变量,比较此值与object数组的大小,若大于Object,将当前的
Object数组值赋给一个数组对象,接着新的数组的容量值,此值的计算方法是当前数组值✖1.5+1.如果得出此值仍然小于minCapacity,
就以新的mincapacity作为新的容量值,调用Arrays.copyOf来生成新的数组对象。
add(int, ) 允许元素直接插入指定的int位置上  前提:插入的位置是目前的Array数组中存在的,之后确保数组够用
删除对象 remove():先判断对象是否为null,如果为null,遍历数组中已有值的元素,比较是否为null,如为null,调用fastRemove
删除;不为null,调用E的equals比较元素的值是否相同,若相同,调用fastRemove来完成对象的删除
remove 删除指定位置的对象,多了数组范围的检查
获取单个对象 get(int): 先做数组范围的检测,即可直接返回数组位于此位置的对象
遍历对象iterator() : 由ArrayList的父类AbstractList实现,每次调用iterator队徽创建新的AbstractLIst内部类Itr的实例。当调用
此实例的hasNext方法时,比较当前指向数组的位置是否和数组中已有的元素大小相等,相等则返回false
判断对象是否存在contains(E)遍历ArrayList元素,E如果为null,直接判断已有元素是否为null,如果为null,返回true;
不为null,通过E.equals和元素是否相等,相等返回true
注:indexOf:从前往后寻找   lastIndexOf:从后往前寻找
ArrayList特点:1、基于数组方式实现,无容量的限制   2、是非线程安全的   3、在执行插入元素时,可能要扩容,删除时不会减小
容量,在查找元素时要遍历数组
Vector() 与ArrayList一样,基于Object数组的方式来实现
add() 加了synchronized关键字,除此之外,和ArrayList基本相同,不同点时扩大数组的方法不同,其方式为:若capacityIncrement
大于0,将Object扩大为现有size加上capacityIncrement的值;若大于或等于0,扩大为现有size两倍
remove()  get(int)  contain()除了调用synchronized关键字外,与ArrayList完全相同
iterator()和ArrayList实现完全相同
Vector特点:1、基于  synchronized实现的线程安全的ArrayList,但在插入元素时容量扩大机制与ArrayList稍有不同(详细见上),
并可通过传入capacityIncrement来控制容量的扩充
LinkList
add() 先创建一个Entry对象,将它的next指向header,previous指向header.previous完成自己的next、previous的设置后,同时
将位于当前元素的后一元素的previous指向自己,当前元素的前一元素的next指向自己,保持双向链表的闭环。
不用考虑扩容及复制数组的问题,但每增加一个元素,都要创建一个新的Entry对象,修改相邻两个元素的属性
remove() 直接删除链表上的当前元素,并将当前元素的element、previous及next属性设置为null
get(int)  判断传入的index值是否小于0或者大于等于当前LinkList的size值,如果符合以上两个条件之一,抛出IndexOutOfBoundsException;若不符合,先判断当前要获取的位置是否小于LinkList值的一半,若小于,则从头找到index位置所
对应的next元素;如果大于,则从队列的尾部往前,一直找到index位置所对应previous元素
iterator()由父类AbstractList实现,调用时每次都会创建一个ListItr对象,负责保存cursor位置。当调用iterator返回遍历对象的
hasNext方法时,判断当前cursor位置是否等于LinkList的size变量,相等时返回true。当调用iterator返回遍历对象的next时,
调用get方法实现,传入cursor位置,若过程中LinkList中的元素增加或删除,抛出ConcurrentModificationException
∵LinkList是基于双向链实现的,因此在遍历时还可以往前遍历,通过调用hasPrevious和previous来完成遍历过程
contains(E) 采用的方法是遍历所有元素,传入E为null,判断元素是否为null,若是,返回true;若不是,判断是否由equals
元素,若有,返回true
LinkList特点:1、LinkList基于双向链表机制实现   2、非线程安全
Stack  继承于Vector 实现了Stack要求的后进先出(LIFO)的弹出和压入提供了push、pop、peek
push:调用Vector中的addElement完成
pop:调用pop获取元素,并同时删除数组的最后一个元素
peek:获取当前Object数组的大小,并获取数组上的最后一个元素
HashMap() 可通过调用HashMap另外两个构造器来控制初始的容量值及loadFactor创建的Entry大小并非传入的初始容量值
采用:int capacity = 1;
                  while(capacity < initialCapacity)
                         capacity <<=1
∴Capacity才是真正创建Entry对象数组的大小
put(Object key,Object Value)
key为null,HashMap获取Entry数组的第一个Entry对象,并基于Entry对象的next属性遍历,找到Entry对象的key属性为null时,
将其value赋值给新的value,然后返回。如果没有null,增加一个Entry对象,增加时先获取当前数组的第一个Entry对象:e,并
创建Entry对象,key为null,value为新传入的对象,next为之前获取的e
对于key不为null时,先获取key对象本身的hashcode,然后再对hashCode做hash操作
代码为   h ^= (h >>> 20) ^ (h >>> 12);
             return h^(h>>>7)^(h>>>4);
hash完毕后,将hash出来的值与Entry对象数组的大小减1的值按位与操作,从而得到当前key要存储到数组的位置。可能会出现不同
key找到相同存储位置的问题(经典的hash冲突问题) 解决方法如下
找到存储的目标数组的位置,获得该数组对应的Entry对象,通过调用Entry对象的next来进行遍历,寻找hash值和计算出来的hash值
相等,且key相等或equals的Entry对象,若寻找到,替换此Entry对象的值,完成put操作,并返回旧的值;如果未找到,往对应的数组
增加新的Entry对象,增加时采用的方法和key为null时采用的情况基本相同
get(Object key) 过程和put一样,也是根据key是否为null分别处理
remove(Object key) 和get类似,只是在找到匹配的key后,如果数组上的元素等于key,则将数组上的元素的值设置为next元素的值;
若不等于key,则对链表遍历,一直找到匹配的key或链表的结尾
containsKey(Object key)
通过调用getEntry方法来完成,判断返回的Entry对象是否为null,为null返回false
keySet() 在使用Map时,会用keySet遍历Map对象,调用keySet会返回一个HashMap中的keySet对象实例,此keySet对象继承了
AbstractSet。当调用Iterator时,返回一个KeyIterator对象实例;调用next方法时,遍历整个数组及Entry对象的链表
注:HashMap在遍历时是无法保证顺序的,如果要保证Map中的对象是按顺序排列的,最好使用TreeMap
HashMap特点 1、非线程安全  
2、HashMap采用数组的方式存储key、value构成的Entry对象,无容量限制   
3、HashMap基于 keyhash寻找Entry对象存放到数组的位置,对于hash冲突采用链表的方式解决
4、HashMap插入元素时,可能会扩大数组的容量,在扩大容量时要重新计算hash,并复制对象到新的数组中
TreeMap 支持排序
put(Object key,Object Value)
当调用put时,先要判断root属性是否为null,如果是,创建新的Entry对象,并赋值给root属性;如果不是,先判断是否传入指定的
Comparator实现,如已传入,则基于红黑树的方式遍历,若找到相等的key,则直接替换value,并返回结束put操作,如果没有找
到相等的key,则一直寻找左边或右边节点为null的元素
通过上面的步骤,如果未找到key,则创建一个新的Entry对象,并将其parent设置为上述所寻找到的元素,并根据和parentkey比较
的情况来设置parent的left和right属性
总结:TreeMap是典型的基于红黑树的实现,有三种情况:1、有key比较的方法  2、传入Comparator实现   3、key对象实现
Comparable接口
get(Object)
从根对象开始往下比较,一直找到相等的key,并返回其Value。和put时同样的处理方式,如果未传入Comparator实现,当传入的
Object为null时,则直接抛出NullPointerException
remove(Object  )
首先做的是getEntry从红黑树上删除,并重新调整树上的相关的节点
ContainsKey(Object)
直接判断返回的Entry是否为null,为null时返回false
keySet()
调用keySet方法后返回TreeMap的内部类KeySet对象的实例,iterator的遍历从根开始,基于红黑树顺序完成
TreeMap特点:1、TreeMap基于红黑树实现,无容量限制   2、非线程安全
HashSet  Set和List最大区别是Set不允许元素重复,List允许
add() 调用HashMap的put(Object,Object)方法来完成此操作,将需要增加的元素作为Map中的key,value则传入之前
已创建的Object对象
remove()  contains()  iterator 都调用HashMap的方法来完成操作
注:HashSet不支持通过get(int)获取指定位置的元素,只能自行通过iterator方法来获取
HashSet特点:1、基于HashMap实现,无容量限制   2、非线程安全
TreeSet
add()  调用TreeMap的put(Object,Object)方法完成此操作,用要增加的元素作为key,用之前已创建的一个final的Object
对象作为value
TreeSet和HashSet一样,完全基于Map实现,同样也不支持get(int)来获取指定位置的元素
TreeSet的特点:1、TreeSet基于TreeMap实现,支持排序,例如:传入Comparator实现descendingSet及descendingIterator等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值