- 浏览: 462176 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xbyy123:
如果底层原理是这样的话,那么太谢谢了,瞬间明白了spring事 ...
Spring事务原理 -
欢乐逗佛:
盗取一时爽,全家火葬场
java工厂模式三种 -
ananeye:
不错不错不错不错
spring 加载过程 -
ananeye:
写的浅显易懂,不错,赞一个。
Spring事务原理 -
18289753290:
我们平时好像不是这么写的。直接就是service了,servi ...
Spring事务原理
java.util中包含了一些集合类,常用的有List,Set,Map,其中List,Set实现了Collection接口,这些集合类又称为容器,他们与数组不同,数组长度固定,集合长度是可变的;数组用来存放基本数据,集合用来存放类对象的引用(数组与集合的区别)。
List接口,Set接口,Map接口及Collection接口的主要特征如下:
1Collection接口是List接口,Set接口的父接口,通常情况下不能直接使用。
2Set接口实现了Collection接口,Set接口不允许存放重复的对象,排序方试按照自身内部排序规则。
3List接口实现了Collection接口,List接口允许存放重复的对象,排序方试按照对象的插入顺序。
4Map接口以键对值形式存放对象,其中Key对象不可以重复,Value可能重复,排序方试按照自身内部排序规则。
Collection接口是List接口,Set接口的父接口,通常情况下不能直接使用,不过Collection接口定义了一些了通用的方法,通过这些方法可以实现对集合的基本操作。因为List接口,Set接口是Collection接口的父接口,所以这些方法对List集合和Set集合是通用的。
一. List
1).ArrayList
ArrayList维护着一个对象数组。如果调用new ArrayList()后,它会默认初始一个size=10的数组。
每次add操作都要检查数组容量,如果不够,重新设置一个初始容量1.5倍大小的新数组,然后再把每个元素copy过去。
在数组中间插入或删除,都要移动后面的所有元素。(使用System.arraycopy())
2).LindedList
LinkedList的实现是一个双向链表。每个节点除含有元素外,还包含向前,向后的指针。
新建一个LinkedList,生成一个头节点(header,就是一个头指针),它的元素为null。
它自包含,next和previous指针都指向自己。
执行add(Object obj)方法后,会生成一个新节点
Header节点的next指向链表的第一个节点,previous指向链表的最后一个节点,在这里都是first。
再增加一个对象,它的形状像下面这样。
现在是一个标准的双向链表形状。每个节点都有自己的next和previous指针。
增加节点,只会对链表的指针进行操作,速度快
LinkedList实现了Deque,所以它有双向队列的特征,在链表两端可增删数据
使用index查找对象时,会以index和size/2比较,从前或从后向中间搜索
ListIterator可向前或向后迭代
比较ArrayList和LinkedList的结构,就可以得出:
1. ArrayList的remove和add(index, Object)操作代价高,需要移动后面的每个元素。
2. LinkedList的get(index)操作代价高,它要先循环遍历list,找到Object
二. Map
1).HashMap
HashMap的结构是一个散列桶,初始化时生成如下结构
每个bucket包含一个Entry(map自定义的一种结构,包含一个往后的指针)的链表。
在put(key, value)后,它的结构如下
将key的hashcode再次散列,然后用这个hash和length-1进行按位与操作,得到bucket的index,然后检查当前bucket的链表,有没有这个key,如果有替换value,没有则跟在链表的最后。
允许key和value都可以是null
Index=0的bucket存key=null的value,也可以是其它hashcode为0的项
初始容量必须为2的幂次(我的理解是,在生成index的时候有这样的代码:hase ^ (length - 1)),length – 1的二进制代码为全1,则容易进行hash的设计)
如果两个key散列后的index一样的话,第一个key生成的Entry先存在桶中,第二个key生成的Entry会将第一个Entry设为自己的next,串起来。(如图中,先put(yy, “first”),会将这个Entry设为bucket的第一项,后put(xx,”second”),则生成新Entry,它的next为key为yy的Entry,生成一个链表)
在put操作中,会比较threshold(capacity * load_factor,一个临界值),如果size > threshold的话,生成一个当前bucket两倍数量的buckets,然后把现有的数据重新散列到新bucket中
对HashMap迭代时,返回数据的顺序是:index从0到length-1,循环遍历每个bucket,把不为null的数据取出,每个bucket内的顺序由链表的顺序决定。而不是由插入数据决定。
2).LinkedHashMap
上面说过,Map的迭代不由插入顺序决定。如果要保持这种顺序呢?就要新增加一种结构来保持。
LinkedHashMap是HashMap的子类,增加一个双向链表,用来存储每个新加入的节点。在遍历时,按链表的顺序进行。其实差不多就是上面HashMap和LinkedList的和吧。
三. Set
1).HashSet
HashSet使用HashMap来保持元素。Key = 元素,value是一个公有的对象,对每个元素都一样,在HashMap里面key是惟一的,当然很适合于构造set集合。等同于用HashMap包装了次,显示Set自己的特性。
最后还要提到集合类里面一个很重要的类:Collections,它有很多自己独特的静态方法。当然它主要提供几种特殊集合(List, Map,Set),可以调用静态方法来获得:Unmodifiable*(不可修改集合,不可添加或删除元素),Synchronize*(保持同步集合,它的基本每个方法都加锁,防止并发操作),Checked*(声明之始传入特定类型,以后的操作都会验证加入元素是否属于已定类型),Singleton*(集合中只包含一个元素)。它们都是通过包装集合类中的抽象类获得,产生不同的行为。
List接口,Set接口,Map接口及Collection接口的主要特征如下:
1Collection接口是List接口,Set接口的父接口,通常情况下不能直接使用。
2Set接口实现了Collection接口,Set接口不允许存放重复的对象,排序方试按照自身内部排序规则。
3List接口实现了Collection接口,List接口允许存放重复的对象,排序方试按照对象的插入顺序。
4Map接口以键对值形式存放对象,其中Key对象不可以重复,Value可能重复,排序方试按照自身内部排序规则。
Collection接口是List接口,Set接口的父接口,通常情况下不能直接使用,不过Collection接口定义了一些了通用的方法,通过这些方法可以实现对集合的基本操作。因为List接口,Set接口是Collection接口的父接口,所以这些方法对List集合和Set集合是通用的。
一. List
1).ArrayList
ArrayList维护着一个对象数组。如果调用new ArrayList()后,它会默认初始一个size=10的数组。
每次add操作都要检查数组容量,如果不够,重新设置一个初始容量1.5倍大小的新数组,然后再把每个元素copy过去。
在数组中间插入或删除,都要移动后面的所有元素。(使用System.arraycopy())
2).LindedList
LinkedList的实现是一个双向链表。每个节点除含有元素外,还包含向前,向后的指针。
新建一个LinkedList,生成一个头节点(header,就是一个头指针),它的元素为null。
它自包含,next和previous指针都指向自己。
执行add(Object obj)方法后,会生成一个新节点
Header节点的next指向链表的第一个节点,previous指向链表的最后一个节点,在这里都是first。
再增加一个对象,它的形状像下面这样。
现在是一个标准的双向链表形状。每个节点都有自己的next和previous指针。
增加节点,只会对链表的指针进行操作,速度快
LinkedList实现了Deque,所以它有双向队列的特征,在链表两端可增删数据
使用index查找对象时,会以index和size/2比较,从前或从后向中间搜索
ListIterator可向前或向后迭代
比较ArrayList和LinkedList的结构,就可以得出:
1. ArrayList的remove和add(index, Object)操作代价高,需要移动后面的每个元素。
2. LinkedList的get(index)操作代价高,它要先循环遍历list,找到Object
二. Map
1).HashMap
HashMap的结构是一个散列桶,初始化时生成如下结构
每个bucket包含一个Entry(map自定义的一种结构,包含一个往后的指针)的链表。
在put(key, value)后,它的结构如下
将key的hashcode再次散列,然后用这个hash和length-1进行按位与操作,得到bucket的index,然后检查当前bucket的链表,有没有这个key,如果有替换value,没有则跟在链表的最后。
允许key和value都可以是null
Index=0的bucket存key=null的value,也可以是其它hashcode为0的项
初始容量必须为2的幂次(我的理解是,在生成index的时候有这样的代码:hase ^ (length - 1)),length – 1的二进制代码为全1,则容易进行hash的设计)
如果两个key散列后的index一样的话,第一个key生成的Entry先存在桶中,第二个key生成的Entry会将第一个Entry设为自己的next,串起来。(如图中,先put(yy, “first”),会将这个Entry设为bucket的第一项,后put(xx,”second”),则生成新Entry,它的next为key为yy的Entry,生成一个链表)
在put操作中,会比较threshold(capacity * load_factor,一个临界值),如果size > threshold的话,生成一个当前bucket两倍数量的buckets,然后把现有的数据重新散列到新bucket中
对HashMap迭代时,返回数据的顺序是:index从0到length-1,循环遍历每个bucket,把不为null的数据取出,每个bucket内的顺序由链表的顺序决定。而不是由插入数据决定。
2).LinkedHashMap
上面说过,Map的迭代不由插入顺序决定。如果要保持这种顺序呢?就要新增加一种结构来保持。
LinkedHashMap是HashMap的子类,增加一个双向链表,用来存储每个新加入的节点。在遍历时,按链表的顺序进行。其实差不多就是上面HashMap和LinkedList的和吧。
三. Set
1).HashSet
HashSet使用HashMap来保持元素。Key = 元素,value是一个公有的对象,对每个元素都一样,在HashMap里面key是惟一的,当然很适合于构造set集合。等同于用HashMap包装了次,显示Set自己的特性。
最后还要提到集合类里面一个很重要的类:Collections,它有很多自己独特的静态方法。当然它主要提供几种特殊集合(List, Map,Set),可以调用静态方法来获得:Unmodifiable*(不可修改集合,不可添加或删除元素),Synchronize*(保持同步集合,它的基本每个方法都加锁,防止并发操作),Checked*(声明之始传入特定类型,以后的操作都会验证加入元素是否属于已定类型),Singleton*(集合中只包含一个元素)。它们都是通过包装集合类中的抽象类获得,产生不同的行为。
发表评论
-
struts2重复提交原理
2012-11-29 09:57 1085相信都有表单提交的情况, 很多时候不希望出现重复提交原来的数据 ... -
java定时器
2012-09-07 09:51 1107在现实生活中,会出现这样的例子,比如烧水,一般烧了20分钟后, ... -
java反射机制,注解,枚举
2012-07-17 08:44 17501) 要想使用反射,首先需要获得待处理类或对象所对应的Clas ... -
java反射机制应用场景
2012-04-25 10:12 6880反射机制实现: 1)导 ... -
java面试准备
2012-01-30 12:21 909一.集合 cccccccccc 二.java 中 String ... -
java模式之 桥接模式Briage
2011-10-11 17:03 1337Bridge模式的概念 Bridge ... -
java连接池
2011-09-28 16:06 862连接池最基本的目的: 1、重用连接,节省连接资源; 2、免 ... -
java生产word文档的方法
2011-09-28 11:23 10921.jacob(windows系统) 2.通过html.vm类 ... -
ArrayList与LinkedList的区别
2011-09-06 16:33 847一般大家都知道ArrayList和LinkedList的大致区 ... -
HashMap与HashTable的区别
2011-09-06 16:26 8581 HashMap不是线程安全的 ... -
临时1111
2011-08-24 00:19 844初始化 flow=1 status=0 连接查询- 主表+ ... -
List 反序输出
2011-08-16 15:45 2761java.util.Collections.reverse(L ... -
java 调色转化
2011-08-01 17:46 931// TODO Auto-generated metho ... -
java文件拷贝
2011-08-01 17:35 1841//文件拷贝 import org.apache.common ... -
Map的三种遍历方法
2011-07-14 19:29 892集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方 ... -
java定时器在web应用
2011-06-30 14:47 1202每天某个时间点(如每晚22点)执行某一功能. 首先介绍jav ... -
环境变量配置
2011-05-16 17:56 817CLASSPATH D:\jdk1.6.0_16\lib\dt ... -
jar包冲突串调问题-jar包密封
2011-04-12 17:25 3415引用 包密封 密封 JAR 文件中的一个包意味着在这个包中定 ... -
jar包详解和META-INF作用(转)
2011-04-12 17:24 2611如果我们使用 JDK 的 jar ... -
java程序读取properties配置文件中文乱码
2011-04-08 10:59 11690java 读取properties文件时,如果包含中文,那么j ...
相关推荐
Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、...
### Java集合排序及Java集合类详解 #### 一、集合框架概述 集合框架是Java编程语言的核心组件之一,用于组织和操作数据集。Java集合框架提供了多种数据结构,包括列表(List)、集(Set)和映射(Map),这些数据结构...
Java集合类是Java编程语言中用于存储和管理对象的关键组件,它们构成了Java Collections Framework的核心。这个框架提供了一组高效、灵活的数据结构,使得开发者能够轻松地处理数据集合,而无需关心底层实现的复杂性...
### Java集合类学习笔记知识点详解 #### 一、集合框架概述 ##### 1.1.1 容器简介 在Java编程中,容器是用于存储和管理对象集合的重要工具。当我们处理大量的对象时,比如存储多个员工的信息,仅仅依赖于基本的...
所涉及的集合类不仅包括 Java SE 1.2 引入的集合类,还包括旧集合类(Java SE 1.2 前引入)和新集合类(Java SE 5 引入)。 Java 线程安全的等级定义根据 Bloch 的定义,将线程安全分为五个等级: 1. 非可变:如果...
一张图让你看清Java集合类 所有精华 集于一图 一目了然 形象易懂 十分中肯 绝对干货!
### Java集合类重要知识点 #### 一、概述 在Java编程中,集合类是一个非常重要的概念,主要用于存储和管理对象的集合。Java集合框架主要包括两大类:`Collection`和`Map`。本篇文章将着重介绍`Collection`部分,并...
### Java集合类性能分析 #### 一、Java集合框架概览 Java集合框架是一个非常重要的概念,它提供了处理数据集合的标准方法。集合框架的核心部分主要包括集合接口、抽象类以及具体的实现类。 - **集合接口**:Java...
Java集合类是Java语言中用来存储数据的结构,它们是Java开发中非常重要的组件。在Java 2平台之前,集合框架的组成较为零散,自Java 2平台的JDK 1.2版本之后,引入了集合框架(Collections Framework),为集合类提供...
### Java集合类与容器类详解 #### 一、引言 在Java编程中,集合类是一种非常重要的数据结构,用于存储一系列对象。相比于数组,集合类提供了更多的灵活性和功能,尤其是在处理未知数量的对象时更为方便。Java标准...
Java 集合类面试题总结 Java 集合类是 Java 语言中的一种重要组件,用于存储和操作数据。下面总结了 Java 集合类的一些常见问题和答案。 HashMap 和 Hashtable 的区别 HashMap 和 Hashtable 都是 Java 中的散列表...
Java 集合排序及java 集合类详解 Java 集合排序及java 集合类详解,Java里面最重要、最常用也就是集合那部分了,能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。本教程详细解释了关于Java中的集合是...
Java集合类,在图片上体现出来,为了更好的描述,本来是博客里的,不好往博客里插,所以单独弄出来了。
Java集合类矩阵图是Java编程中非常重要的一个概念,它主要涵盖了Java集合框架中的各种接口、类以及它们之间的关系。这个矩阵图可以帮助开发者更清晰地理解Java集合框架的层次结构和实现方式。在这个矩阵图中,你可以...
Java集合类是Java编程中非常重要的一个部分,它为开发者提供了灵活的数据结构,用来存储和管理数据。在Java中,集合类主要分为三大类:Set、List和Map,它们都位于`java.util`包中。 Set接口表示无序且不允许重复...
本示例主要探讨的是Java集合类的简单使用,通过一个名为`CollectionsTest.java`的文件进行演示。这篇博客文章可能详细解释了如何创建、操作和理解Java集合类的基本概念。 首先,Java集合框架主要包括接口和实现这些...
Arrays和Collections是Java集合中的两个工具类。Arrays类包含用来操作数组的各种方法,如排序和搜索等。Collections类主要提供了在collection上进行操作的方法,如排序、查找等。 学习Java集合需要掌握以下几个方面...
Java集合类是Java编程语言中一个非常重要的概念,它提供了数据结构和算法的实现,使得开发者可以方便地存储、管理和操作对象。Java集合框架包括多种接口(如List、Set、Queue)和实现这些接口的类(如ArrayList、...
集合类的框架为集合的实现者提供了大量的接口和抽象类,并对其中的某些机制给予了描述,例如,Iterator(迭代协议)。实现Comparable接口或Comparator接口,用户可以根据需要对集合中的元素进行排序。为了方便用户...