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。
HostKvm是一家成立于2013年的国外VPS服务商,产品基于KVM架构,数据中心包括日本、新加坡、韩国、美国、俄罗斯、中国香港等多个地区机房,均为国内直连或优化线路,延迟较低,适合建站或者远程办公等。本月,商家旗下俄罗斯、新加坡、美国、香港等节点带宽进行了大幅度升级,俄罗斯机房国内电信/联通直连,CN2线路,150Mbps(原来30Mbps)带宽起,目前俄罗斯和香港高防节点5折骨折码继续优惠中...
CloudCone发布了2021年的闪售活动,提供了几款年付VPS套餐,基于KVM架构,采用Intel® Xeon® Silver 4214 or Xeon® E5s CPU及SSD硬盘组RAID10,最低每年14.02美元起,支持PayPal或者支付宝付款。这是一家成立于2017年的国外VPS主机商,提供VPS和独立服务器租用,数据中心为美国洛杉矶MC机房。下面列出几款年付套餐配置信息。CPU:...
racknerd当前对美国犹他州数据中心的大硬盘服务器(存储服务器)进行低价促销,价格跌破眼镜啊。提供AMD和Intel两个选择,默认32G内存,120G SSD系统盘,12个16T HDD做数据盘,接入1Gbps带宽,每个月默认给100T流量,5个IPv4... 官方网站:https://www.racknerd.com 加密数字货币、信用卡、PayPal、支付宝、银联(卡),可以付款! ...
weakhashmap为你推荐
溢出隐藏overflow:hidden用在哪里?网关和路由器的区别路由器和网关有什么区别?mindmanager破解版求mindmanager 2019 的注册机bindservice安卓里 remote service到底有什么用inode智能客户端我的电脑上inode智能客户端连接网络时,提示~服务器没有响应,请确认当前认证网卡已连接到合适的网问卷星登陆请问问卷星怎么设置答题时间?jsindexofjavascript 中indexof 的用法暴力破解密码8位密码暴力破解要多久新手怎么制作表格我是初学者、电脑上怎么制作表格国外社交网站有什么外国的交友网站?拜托各位大神
vps代理 中国域名网 seovip 服务器维护方案 速度云 东莞数据中心 个人免费主页 宏讯 架设邮件服务器 lamp架构 网页加速 rewritecond 美国代理服务器 回程 文件服务器硬件配置 好看的空间留言 个人域名如何备案 淘宝vip购优汇 北京共有产权房申请网站 怨屋本铺reboot 更多