Java 集合框架
Java集合框架大致可以分为五个部分:List列表,Set集合、Map映射、迭代器、工具类
List 接口通常表示一个列表(数组、队列、链表
栈),其中的元素 可以重复 的是:ArrayList 和LinkedList,另外还有不常用的Vector。LinkedList实现来Queue接口,因此也可以作为队列使用。
Set接口通常表示一个集合,其中的元素 不可以重复 (通过hashcode和equals函数保证),常用的实现类有HashSet和TreeSet
Map是一个 映射接口 ,其中的每个元素都是一个 key-value键值对 ,同样抽象类AbstractMap通过适配器模式实现了Map接口中的大部分函数,TreeMap
HashMap、WeakHashMap等实现类都通过继承AbstractMap实现的,另外,不常用的HashTable直接实现了Map接口。
Iterator是遍历集合的迭代器(不能遍历Map,只用来遍历Collection),Collection的实现类都实现了iterator()函数,它返回一个Iterator对象,用来遍历集合,ListIterator则专门用来遍历List。
ArrayList
ArrayList的内部实现是基于基础的对象数组的
特点:
- 顺序表
- 大小可变
- 允许null元素
- 线程不同步、查询速度快、增删满
LinkedList
LinkedList: 内部采用链表来存储元素,支持快速插入/删除元素,但不支持高效地随机访问
一般大家都知道ArrayList和LinkedList的大致区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 ArrayList的内部实现是基于基础的对象数组的 , LinkedList中的get方法是按照顺序从列表的一端开始检查,直到另外一端。对LinkedList而言,访问列表中的某个指定元素没有更快的方法了。 它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doubly LinkedList) ,因为Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。
public class ArraylistandLinkedlist { public static final int N = 50000; public static List values; static { Integer vals[] = new Integer[N]; Random r = new Random(); for (int i = 0, currval = 0; i < N; i++) { vals[i] = new Integer(currval); currval += r.nextInt(100) + 1; } values = Arrays.asList(vals); } static long timeList(List lst) { long start = System.currentTimeMillis(); for (int i = 0; i < N; i++) { int index = Collections.binarySearch(lst, values.get(i)); if (index != i) System.out.println("***错误***"); } return System.currentTimeMillis() - start; } public static void main(String args[]) { System.out.println("ArrayList消耗时间:" + timeList(new ArrayList(values))); System.out.println("LinkedList消耗时间:" + timeList(new LinkedList(values))); } }
HashSet
HashSet实现了Set接口,它 不允许 集合中有 重复的值 ,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前, 要先确保对象 重写equals()和hashCode()方法 ,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。
特点
- 线程同步
- 不允许重复的值
HashMap
HashMap实现了Map接口,Map接口对键值对进行映射。 Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。 HashMap允许键和值为null。 HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。
HashMap是一种<key,value>的存储结构,能够快速将key的数据put方式存储起来,然后很快的通过get取出来”,“HashMap不是线程安全的, HashTable是线程安全的,通过synchronized实现的
简单的说HashMap的存储结构是由 数组和链表 共同完成的
HashMap是Y轴方向是数组,X轴方向就是链表的存储方式
HashTable
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value), 而Hashtable则不行)。 HashMap是非synchronized,而Hashtable是synchronized ,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。HashMap不能保证随着时间的推移Map中的元素次序是不变的。
public class HashmapAndHashTable { public static void main(String... args) { HashMap<String, String> hashMap = new HashMap<String, String>(); hashMap.put("cn", "中国"); hashMap.put("us", "米国"); hashMap.put("en", "英国"); hashMap.put("",""); System.out.println(hashMap); System.out.println("cn" + hashMap.get("cn")); System.out.println(hashMap.containsKey("cn")); System.out.println(hashMap.keySet()); System.out.println(hashMap.isEmpty()); Hashtable table = new Hashtable(); table.put("key1", "value1");//键 和 值, table.put("key2", "value2"); table.put("key3", "value3");//相当于堆栈 后进先出 Enumeration e = table.keys();//创建枚举 while (e.hasMoreElements()) {//是否有元素 String key = (String) e.nextElement(); System.out.println(key + " : " + table.get(key)); } } }
学习Java的同学注意了!!!
学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:454297367 我们一起学Java!
Java 集合框架的更多相关文章
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Java集合框架之map
Java集合框架之map. Map的主要实现类有HashMap,LinkedHashMap,TreeMap,等等.具体可参阅API文档. 其中HashMap是无序排序. LinkedHashMap是自 ...
- 22章、Java集合框架习题
1.描述Java集合框架.列出接口.便利抽象类和具体类. Java集合框架支持2种容器:(1) 集合(Collection),存储元素集合 (2)图(Map),存储键值对.
- Java集合框架实现自定义排序
Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...
- (转)Java集合框架:HashMap
来源:朱小厮 链接:http://blog.csdn.net/u013256816/article/details/50912762 Java集合框架概述 Java集合框架无论是在工作.学习.面试中都 ...
- Java集合框架
集合框架体系如图所示 Java 集合框架提供了一套性能优良,使用方便的接口和类,java集合框架位于java.util包中, 所以当使用集合框架的时候需要进行导包. Map接口的常用方法 Map接口提 ...
- Java集合框架(常用类) JCF
Java集合框架(常用类) JCF 为了实现某一目的或功能而预先设计好一系列封装好的具有继承关系或实现关系类的接口: 集合的由来: 特点:元素类型可以不同,集合长度可变,空间不固定: 管理集合类和接口 ...
随机推荐
- 浅谈算法和数据结构: 十 平衡查找树之B树
前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种 ...
- 扫描仪API接入大全:Twain, WIA 或 两者不具有.[换个思路 春暖花开]
最近做和扫描仪接入的扫描应用程序,深深感觉到了来自底层设备和WINDOWS协议的恶意.软件专业,对计算机深层次通知机制和协议,以及与之相连接的机器的接入协议和一些参数,当时并木有认真学习和了解,前一阵 ...
- Azure PowerShell (8) 使用PowerShell设置Azure负载均衡器规则
<Windows Azure Platform 系列文章目录> 注意:如果Azure面对的客户只是企业级客户,企业级客户使用NAT设备访问Internet的话,因为多个客户端使用相同的So ...
- 【VC++技术杂谈003】打印技术之打印机状态监控
在上一篇博文中我主要介绍了如何获取以及设置系统的默认打印机,本文将介绍如何对打印机状态进行实时监控,记录下所打印的文档.打印的份数以及打印时间等打印信息. 1.打印机虚脱机技术 在正式介绍如何对打印机 ...
- Android开发学习之路-Handler消息派发机制源码分析
注:这里只是说一下sendmessage的一个过程,post就类似的 如果我们需要发送消息,会调用sendMessage方法 public final boolean sendMessage(Mess ...
- Spring学习记录(三)---bean自动装配autowire
Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系,少写几个ref autowire: no ---默认情况,不自动装配,通过ref手动引用 byName---根据 ...
- 实战MEF(4):搜索范围
在前面的文章中,几乎每个示例我们都会接触到扩展类的搜索位置,我们也不妨想一下,既然是自动扩展,它肯定会有一个或者多人可供查找的位置,不然MEF框架怎么知道哪里有扩展组件呢? 就像我们用导航系统去查找某 ...
- jQuery控制tabs打开的数量
- 【基础进阶】URL详解与URL编码
作为前端,每日与 URL 打交道是必不可少的.但是也许每天只是单纯的用,对其只是一知半解,随着工作的展开,我发现在日常抓包调试,接口调用,浏览器兼容等许多方面,不深入去理解URL与URL编码则会踩到很 ...
- iOS开发之多表视图滑动切换示例(仿"头条"客户端)---优化篇
前几天发布了一篇iOS开发之多表视图滑动切换示例(仿"头条"客户端)的博客,之所以写这篇博客,是因为一位iOS初学者提了一个问题,简单的写了个demo做了个示范,让其在基础上做扩展 ...