weakhashmap在Java中ArrayList、LinkedList、HashMap的区别是什么
weakhashmap 时间:2021-07-01 阅读:(
)
java中什么是集合框
集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。
任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。
接口:即表示集合的抽象数据类型。
接口提供了让我们对集合中所表示的内容进行单独操作的可能。
实现:也就是集合框架中接口的具体实现。
实际它们就是那些可复用的数据结构。
Java集合框架的操作的方法有哪些?怎么用?
浅谈JAVA集合框架
Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection classes)。
集合在java中非常重要,在讨论之前,先来看几个面试中的经典问题。
1 Collection 和 Collections的区别。
2 List, Set, Map是否继承自Collection接口。
3 ArrayList和Vector的区别。
4 HashMap和Hashtable的区别。
篇尾有答案,我们开始正题。
集合Collection接口
--Collection 是任何对象组,元素各自独立,通常拥有相同的套用规则。
Set List由它派生。
基本操作 增加元素add(Object obj); addAll(Collection c);
删除元素 remove(Object obj); removeAll(Collection c);
求交集 retainAll(Collection c);
删除元素 remove(Object obj); removeAll(Collection c);
求交集 retainAll(Collection c);
访问/遍历集合元素的好办法是使用Iterator接口(迭代器用于取代Enumeration)
Public interface Iterator{
Public Boolean hasNext(};
Public Object next(};
Public void remove(};
}
集set
--没有重复项目的集合
有三种特定类型的集可用
HashSet-基于散列表的集,加进散列表的元素要实现hashCode()方法
LinkedHashSet-对集迭代时,按增加顺序返回元素
TreeSet-基于(平衡)树的数据结构
清单List
--位置性集合。
加进清单的元素可以加在清单中特定位置或加到末尾
有两个特定版本
ArrayList(数组表)-类似于Vector,都用于缩放数组维护集合。
区别:
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
LinkedList(链表)-是双向链表,每个节点都有两个指针指向上一节点和下一节点。
用在FIFO,用addList()加入元素 removeFirst()删除元素
用在FILO,用addFirst()/removeLast()
ListIterator提供双向遍历next() previous(),可删除、替换、增加元素
映射表Map
--用于关键字/数值对,像个Dictionary
处理Map的三种集合
关键字集KeySet()
数值集value()
项目集enrySet()
四个具体版本
HashMap-散列表的通用映射表
LinkedHashMap-扩展HashMap,对返回集合迭代时,维护插入顺序
WeakHashMap-基于弱引用散列表的映射表,如果不保持映射表外的关键字的引用,则内存回收程序会回收它
TreeMap-基于平衡树的映射表
HashMap-散列表的通用映射表
LinkedHashMap-扩展HashMap,对返回集合迭代时,维护插入顺序
WeakHashMap-基于弱引用散列表的映射表,如果不保持映射表外的关键字的引用,则内存回收程序会回收它
TreeMap-基于平衡树的映射表
Collections类,用于同步集合,还能改变集合只读方式的类
e.g.:
Map mp=new HashMap();
mp=Collections.synchronizedMap(mp); //生成线程安全的映射表
mp=Collections.unmodifiableMap(mp); //生成只读映射表
Comparable 自然顺序的排序类 Comparator 面向树的集合排序类
容器分类学(Container taxonomy)
集合接口: Collection List Set;Map Iterator ListIterator。
抽象类: AbstractCollection AbstractList AbstractSet AbstractMap AbstractSequentiaList。
老版本中的集合类型
Vector类
Vector,就是向量。
一种异构的混合体,可以动态增加容量。
对它的操作简要如下
比如我们有一个Vector: Vector myVec=new Vector(a_Array.length)
取得vector的长度:myVec.size();
赋值:set(int position,Object obj) / setElementAt(Object obj, int position) –不支持动态增长
add(Object obj )/ addElement(Object obj) 在Vector末尾加入对象
e.g.:myVec.add(new a_Array[0]);
取出元素:get(int position) / getElement(int position)
Stack类
是Vector的子类。
就是数据结构里讲滥了的堆栈(这个词可简称栈,不要混淆于heap-堆)。
后进先出的存取方式。
Stack()构造空栈
Empty()叛空
Search()检查堆栈是否有元素
Peek()取得栈顶元素
Pop()弹栈
Push()入栈
Enumeration接口
Dictionary类
字典。
关键字/数值方式存取数据,如果映射没有此关键字,取回null。
Hashtable类
是Dictionary结构的具体实现。
面试题答案
Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口
List, Set, Map是否继承自Collection接口? List,Set是 Map不是
ArrayList和Vector的区别。
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
HashMap和Hashtable的区别
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或valuejava中什么是强引用,弱引用和软引用
我自己也复习下概念。
强引用:就是普通引用。
比如 A o1=new A(); A o2=o1;
强引用只有当所有对这个对象的所有引用(o1,o2)失效后,new A()的内存才会被回收。
残影引用、弱引用、软引用都用来引用随时可能被回收的对象。
类似o1,o2即使未失效也会回收。
区别是被回收器回收的激烈程度,由强到弱。
残影引用是对象已经finalize或者执行完析构函数,只等内存马上回收了,最容易被回收。
非常接近回收时机,就像残影会随物体消失而消失,故名。
弱引用的对象是在正常情况下,回收器遇到就回收,是被积极回收的对象。
软引用是仅在内存不够时才回收,属于消极回收。
HashTable和ArrayList的主要区别是什么
hash是键值映射,简单的说就是一个键对应一个值,我们可以认为给每个值都起一个名字,键就是所谓的名字,我们通过这个名字来寻找值,而arraylist是一个集合,它以线性结构存储数据,在集合中存储的内容都是值,并且我们给每个值用索引做一个编号,所以在遍历的过程中我们用的是索引,arraylist是有序的,而hash是无序的Java中的强引用,软引用,弱引用,虚引用有什么用
这两天在看 Reference 相关的东西,虽然接触到的场景不多,但感觉还是比较有用的。
在非常关心内存的情况下,有可能能派上用场。
在涉及到某一个对象被 GC,需要得到通知,然后再做某些相关处理的时候,有可能派得上用场。
对于第一点,目前接触到的就是 WeakHahsMap。
像我们平常写缓存的时候,最简单的就是在一个类中
public static Map<String,String> user_map = new HashMap<String, String>();
然后再在全局使用它。
这里就可以参考下 Tomcat 实现的这个 LRU 缓存:tomcat/ConcurrentCache.java at trunk · apache/tomcat · GitHub,它就用到了 WeakHashMap,WeakHashMap也用到了 WeakReference,可以参考下。
WeakHahsMap 的实现原理简单来说就是里面的 Entry 使用继承了 WeakReference,那么当 Entry 的 key 不再被使用的时候,也就是被 GC 的时候,那么该 Entry 就会进入到 ReferenceQueue 中, WeakHashMap 在你调用相关方法的时候,那么就会把这个 Entry 从 ReferenceQueue 中删除,并且做相关处理(也就是把这个 key 删除)。
这时候你就会发现,你的一个键值对没有了。
对于第二点,目前接触到的就是一个 FileCleaningTracker,它的作用是,把一个文件和一个对象关联起来,当这个对象被 GC 的时候,文件也帮我们删除掉。
FileCleaningTracker 的实现简单来说就是用了一个虚引用。
它里面有一个 Tracker 的内部类,他继承自 PhantomReference,你可以理解成 WeakHashMap中的 Entry(其实也很像了)。
这个 Tracker 就和我们的关联对象 marker 关联起来(你可以理解成 WeakHashMap 中的 Entry 的 key),那么当 marker 被回收的时候,Tracker 就会被GC 弄到 ReferenceQueue 中,那么 FileCleaningTracker 就会把 Tracker 从 ReferenceQueue 移除出来,并且执行相关操作(delete file)。
最后:
自己理解的引用(强,软,弱虚)是和 GC 比较相关的,能够在一个 对象被 GC 的时候,应用程序得到通知,然后执行相关操作。
像 WeakHashMap 就是这样,底层发现 key 没了,上层就把 entry 删了。
ps:
第6条:消除过期对象的引用(WeakHashMap的缓存应用):愿无岁月可回首
第6条:WeakHashMap扩展知识1(原理与Reference相关):愿无岁月可回首
第6条:Reference应用-FileCleaningTracker:愿无岁月可回首
最后的最后补充。
。
。
突然想起,之前自己在工作中涉及到这样一种情况,我需要对用户投资的钱进行一个每日的加息,有一天客户忘了把加息的数据给我,然后给了我一份 csv 文件,让我加上。
我当时的做法是,让运维把文件放在固定的地方,程序读取,执行逻辑,然后运维再手动删除。
这个时候,其实也可以通过这种 FileCleaningTracker,当读取完之后,自动的删除这个文件,就不用运维来做了。
(这可能是一种应用场景)在Java中ArrayList、LinkedList、HashMap的区别是什么
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
LinkedList类
LinkedList实现了List接口,允许null元素。
此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。
这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。
如果多个线程同时访问一个List,则必须自己实现访问同步。
一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...));
ArrayList类
ArrayList实现了可变大小的数组。
它允许所有元素,包括null。
ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。
但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。
其他的方法运行时间为线性。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。
这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。
当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
HashMap类
HashMap继承Map接口,实现一个key-value映射的哈希表。
任何非空(non-null)的对象都可作为key或者value。
总结
如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
前几天有关注到Megalayer云服务器提供商有打算在月底的时候新增新加坡机房,这个是继美国、中国香港、菲律宾之外的第四个机房。也有工单询问到官方,新加坡机房有包括CN2国内优化线路和国际带宽,CN2优化线路应该是和菲律宾差不多的。如果我们追求速度和稳定性的中文业务,建议还是选择CN2优化带宽的香港服务器。这里有要到Megalayer新加坡服务器国际带宽的测试服务器,E3-1230配置20M国际带...
Hostodo是一家成立于2014年的国外VPS主机商,现在主要提供基于KVM架构的VPS主机,美国三个地区机房:拉斯维加斯、迈阿密和斯波坎,采用NVMe或者SSD磁盘,支持支付宝、PayPal、加密货币等付款方式。商家最近对于上架不久的斯波坎机房SSD硬盘VPS主机提供66折优惠码,适用于1GB或者以上内存套餐年付,最低每年12美元起。下面列出几款套餐配置信息。CPU:1core内存:256MB...
如今我们网友可能较多的会选择云服务器、VPS主机,对于虚拟主机的话可能很多人不会选择。但是我们有些外贸业务用途的建站项目还是会有选择虚拟主机的。今天看到的Stablehost 商家虚拟主机在黑五期间也有四折优惠,对于这个服务商而言不是特别的喜欢,虽然他们商家和我们熟悉的老鹰主机商有些类似,且在后来老鹰主机改版和方案后,Stablehost 商家也会跟随改版,但是性价比认为不如老鹰主机。这次黑色星期...
weakhashmap为你推荐
显卡挖矿啥意思挖矿主板、挖矿显卡是什么意思?appcan怎样做手机软件g2gB2E和G2E分别是什么意思akflol中 akf学习还剩5次是什么意思?showwindowShowWindow和EnableWindow区别索引超出了数组界限索引超出了数组界限51信用卡论坛51信用卡怎么样?数据分析报告范文如何做一个好的数据分析报告基础设施即服务城市基础设施、公共服务设施、市政设施有什么区别?toolstripWinOperationClass是什么来的,什么用
域名管理 谷歌香港 个人空间申请 好看qq空间 双线主机 isp服务商 重庆双线服务器托管 微软服务器操作系统 免费私人服务器 vul 国内空间 97rb 删除域名 nano 免费网络电视软件 web服务器安全配置 护卫神主机管理系统 灵动:鬼影实录3 gg广告联盟 彩虹云点播不能用了 更多