- 浏览: 149840 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
chen_zujun:
java Object生成实例的new和newInstance的区别? -
honey00125:
感谢楼主分享!
JQuery权威指南源代码整理下载 -
Jojay90:
真的不错, 谢谢此分享!
JQuery权威指南源代码整理下载 -
wjyuian:
感谢楼主,好资料,,下了看看
JQuery权威指南源代码整理下载 -
toefllitong:
感谢楼主的分享,支持越来越多的人分享
JQuery权威指南源代码整理下载
线性表,链表,集合,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。 有重复、有序
Collection
├List
│-├LinkedList
│-├ArrayList
│-└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
主要分为两个分支:Collection和Map ,其中Map中存储的对象是以名值对的方式储存的,如:<name,value>
是字典的实现。
由Collection接口派生的两个接口是List和Set 。
其中,List的特点是:有顺序而可以重复 。Set的特点是:无顺序而不可重复 。
什么是重复?
不是说容器中有两个格子装了同一个对象,重复是指:a.equals(b) == true; 所以,当我们自定义对象作为容器的储存元素时,我们必须重写 java.lang.Object的equals方法,Object的默认equals只有当比较的参数是本身时才返回true,明显不是我们想要的,所以必须重写,而且,如果重写equals就必须重写hashCode()方法,因为,当我们的对象作为字典Map的键key时,我们的定位是同过 hashCode方法,这样来提高效率。注:两个对象equals若为TRUE,hashCode一定返回同样的int;但是,如果Equals返回 FALSE,hashCode不一定不同。
List接口
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素, 还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
ArrayList(数组表)- 有重复、有顺序。类似于Vector,都用于缩放数组维护集合。
区别:
1.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
2.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
LinkedList(链表)-是双向链表,适合变更很多的List。
用在FIFO,用addList()加入元素 removeFirst()删除元素
用在FILO,用addFirst()/removeLast()
ListIterator提供双向遍历next() previous(),可删除、替换、增加元素
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)。
一般情况下使用这两个就可以了,因为非同步,所以效率比较高。
Vector类
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的 Iterator是同一接口,但是,因为Vector是同步的,当一个 Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例 如,添加或删除了一些元素),这时调用Iterator的方法时将抛出 ConcurrentModificationException,因此必须捕获该 异常。
Stack 类
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方 法,还有 peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
Set接口
Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
Map接口
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
Map用于关键字/数值对,较高的存取性能。不允许重复的key,但允许重复的Value。
处理Map的三种集合
关键字集KeySet() 数值集value() 项目集enrySet()
四个具体版本
HashMap-散列表的通用映射表,无序,可在初始化时设定其大小,自动增长。
LinkedHashMap-扩展HashMap,对返回集合迭代时,维护插入顺序
WeakHashMap-基于弱引用散列表的映射表,如果不保持映射表外的关键字的引用,则内存回收程序会回收它
TreeMap-基于平衡树的映射表
Hashtable类
Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。
Hashtable 通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
Hashtable是同步的。
HashMap类
HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回 Collection),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。
WeakHashMap类
WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
一般情况下数据结构的选择:
多查少改选ArrayList
多改少查选LinkedList
如果大量数据进行检索选Map,
详细:
如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
同步性
Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。
数据增长
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
辅助类java.lang.Collections
这个类封装了一些List的算法,包括排序,逆向,随机排序等等。
重要需要实现的接口:
Comparable接口,当两个对象涉及比较操作时,使用这个接口的compareTo方法。
Iterator接口,涉及遍历时使用。
常见问题
1、Collection 和 Collections的区别。
Collections是个java.util下的类,它包含有各种有关java集合操作的静态方法。
Collection是个java.util下的接口,它是各种java集合结构的父接口
2、List, Set, Map是否继承自Collection接口? List,Set是 Map不是
3、ArrayList和Vector的区别。
(1).同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
(2).数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
4、HashMap和Hashtable的区别
(1).历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
(2).同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
(3).值:只有HashMap可以让你将空值作为一个表的条目的key或value
发表评论
-
Struts2 action中获取web.xml中的context-param以及获取request, response对象的方法
2012-06-28 19:15 3542web.xml中的context-param参数:<co ... -
web.xml加载顺序与web.xml常用节点解析
2012-06-28 16:31 9274web.xml加载顺序 应用服务器启动时web.xml加载过 ... -
Annotation-java注解
2012-03-29 17:21 1065Java中提供3个内置注释类型 a. Overr ... -
memcache基础知识-stats参数
2012-03-22 23:53 7211安装memcache: #tar -xvf libe ... -
Log4j扩展的一个按天滚动的appender类,同时支持动态日志
2012-03-22 23:43 2290扩展的一个按天滚动的appender类 暂时不支持datePa ... -
log4j 配置说明
2012-03-01 17:03 1475Log4J 基本使用方法 l ... -
JSP下动态INCLUDE与静态INCLUDE的区别,Forward和Redirect的区别分析
2008-11-03 23:02 1485动态INCLUDE与静态INCLUDE的区别 动态inc ... -
关于switch case 语句的总结!
2008-11-12 18:03 1270最近面试过程中遇到一道试题: public class Te ... -
public ,private ,protected 及不写时的区别? final、finally和finalize的区别是什么?
2008-11-18 14:58 1047一、java 作用域public , ... -
web.xml中参数的问题:context-param和init-param的区别
2011-02-28 11:28 832web.xml里面可以定义两种参数: (1)applicat ... -
Java集合的Stack、Queue、Map的遍历
2010-11-11 17:45 1500import java.util.HashMap; impo ... -
Map--读"找出数组中重复次数最多的元素并打印"有感Map的使用
2010-10-09 11:51 3835目的:了解Map的containsKey的是用以及Map的遍历 ... -
Web应用中request获取各种获取path或URI,URL的方法
2010-08-19 17:25 6793Web应用中有各种获取path或URI,URL的方法,假设网页 ... -
Java连接各种数据库代码
2010-03-04 14:53 8451、Oracle8/8i/9i数据库(thin模式) Cla ... -
String StringBuffer StringBuilder 三者的区别
2010-02-01 10:20 967String是固定长度的字符串,如果要发生变化必须重新生成新的 ... -
java.util.date 和 java.sql.date 两者之间区别!
2010-01-13 11:32 1556今天在调用一存储过程中setDate参数过程是出错,查资料才发 ... -
java Object生成实例的new和newInstance的区别?
2009-09-09 16:15 2524在初始化一个类,生成 ... -
java里抽象类和接口的区别
2009-08-26 00:23 751对interface和abstract class之间的区别一 ... -
java之运行时异常与编译时异常区别
2009-07-27 22:45 3298JAVA中用2种方法处理异常: 1.在发生异常的地方 ...
相关推荐
Java容器讲解PPT,Collection Map(HashMap TreeMap LinkedHashMap) List (ArrayList LinkedList Vector) Set (HashSet TreeSet LinkedHashSet)
JAVA 容器用法详解,关于JAVA容器的详细讲解
java并发包讲解 可以找我要代码,qq 3341386488 ## 线程安全-并发容器JUC--原理以及分析 1.arrayList --copyonWriteArraylist 优缺点 2.HashSet,TreeSet -- CopyONWriteArraySet,ConcurrentSkipListSet 3....
主要介绍了Java多线程编程中的两种常用并发容器讲解,分别是ConcurrentHashMap与ConcurrentHashMap,需要的朋友可以参考下
java集合框架总结 Collection体系结构 ArrayList源码解读 HashMap HashSet 深入讲解java集合框架
[课堂课件讲解]Java微服务实践-Spring Boot嵌入式Web容器.pptx
java线程和容器专题课程第一部分,共两部分。详细讲解java线程的一些知识和技术原理。从性能的⻆度看,如果没有任务会阻塞,那么在单处理器机器上就没有意义使用多线程。java的线程机制是抢占式的,这表示调试 机制...
主要介绍了spring boot基于Java的容器配置讲解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
对Java容器的深刻讲解,对你会有帮助的。
《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,同时...
Java并发编程:深入讲解Java中的线程、锁、并发容器等并发编程相关的知识,帮助读者理解多线程编程的挑战和解决方案。 Java网络编程:介绍Java中的网络编程相关知识,包括Socket编程、HTTP协议、TCP/IP等,帮助读者...
java集合的详解,collection,list,set,map疑难解答,对于对容器似懂非懂的新手来说,这无疑是给你指点迷津的一个非常不错的选择,讲解内容丰富。
业务层框架spring:讲解spring的入门配置与ioc容器,并讲解使用spring进行mvc应用开发的标签库、国际化、数据校验、数据库开发技术。 多层框架集成:实现5种框架的搭配集成,分别实现ssh 1、ssi 1、ssh 2、ssi 2...
000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA...050101_〖开发实例〗_Java开发实例讲解(人员管理)笔记.pdf
主要介绍了Java 容器类源码详解 Set,Set 表示由无重复对象组成的集合,也是集合框架中重要的一种集合类型,直接扩展自 Collection 接口。,需要的朋友可以参考下
, 《Java并发编程的艺术》内容涵盖Java并发编程机制的底层实现原理、Java内存模型、Java并发编程基础、Java中的锁、并发容器和框架、原子类、并发工具类、线程池、Executor框架等主题,每个主题都做了深入的讲解,...
《疯狂Java讲义(附光盘第2版)》并不单纯从知识角度来讲解Java,而是从解决问题的角度来介绍Java语言,所以《疯狂Java讲义(附光盘第2版)》中涉及大量的实用案例开发:五子棋游戏、梭哈游戏、仿QQ的游戏大厅、MySQL...
第一部分 扎实的Java基础 (Java基础+容器+并发+JVM) 第二部分 网络知识(计算机网络技术+HTTPS中的TLS) 第三部分 Linux 第四部分 数据结构与算法 第五部分 数据库(MySQL+Redis) 第六部分 系统设计(RestFul API...