- 浏览: 59794 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
xuhang1128:
http://www.ihacklog.com/linux/m ...
Linux下安装memcached -
greatghoul:
常用的功能挺全面的。
vim使用技巧两篇
http://www.cnblogs.com/huangfox/archive/2010/10/09/1846758.html Java集合类 一、 概述 集合类是java中常用的工具,使用频率最多的是Collection和Map两个接口的实现类,Collection存放多个单对象,而Map存放多个Key-value形式的键值对。 Collection又分成两大接口:List和Set,其最大的区别就是List容许存放重复的对象,而Set不行。常见的实现类参见下图: 图——Collection常见的实现类 在集合类的应用当中,我们需要注意以下几点: 二、 ArrayList 2.1 创建ArrayList() public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; } super()为一个空方法,因此在创建ArrayList的最重要的语句是: this.elementData = new Object[initialCapacity]; 他实例化了一个Object数组,并且将该数组赋给了当前实例的elementData属性,此数组的大小由initialCapacity指定。因此可知ArrayList是由对象数组存放数据的。 2.2 添加对象:add(E) 添加一个对象即将该对象插入到elementData数组当中,但是当数据满时,需要对其进行扩容。 public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity= minCapacity; // minCapacity is usually close to size, so this is awin: elementData = Arrays.copyOf(elementData, newCapacity); } } 当add(E)时,首先将当前ArrayList中的对象数量加1,赋值给变量minCapacity,然后将其与Object数组的大小进行比较,如果minCapacity大,先将Object数组赋值给一个新的数组对象(oldData),然后生成一个新的数组容量值。新数组容量值为当前容量的1.5倍再加1。最后调用Arrays.copyOf来生成新的数组对象。 如果想修改ArrayList的扩容策略,可继承ArrayList,并覆盖ensureCapacity方法。 2.3 添加对象:add(int,E) 将对象添加的到指定位置,那么就必须将该位置以后的所有数据向后移动一个位置。在这个过程中需要考虑数组容量的问题。 public void add(int index, E element) { if (index > size || index < 0) throw new IndexOutOfBoundsException( "Index: "+index+",Size: "+size); ensureCapacity(size+1); // Increments modCount!! System.arraycopy(elementData,index, elementData, index + 1, size - index); elementData[index] = element; size++; } 首先将指定位置后的数据移动一个位置: System.arraycopy(elementData, index, elementData, index + 1, size - index); 然后见预添加的对象插入到指定位置: elementData[index] = element; ※知识点扩充※ arraycopy publicstatic void arraycopy(Object src, int srcPos, Object dest, int destPos,int length) 从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于 length 参数。源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。 如果参数 src 和 dest 引用相同的数组对象,则复制的执行过程就好像首先将 srcPos 到 srcPos+length-1 位置的组件复制到一个带有 length 组件的临时数组,然后再将此临时数组的内容复制到目标数组的 destPos 到 destPos+length-1 位置一样。 2.4 删除对象:remove(E) public boolean remove(Object o) { if (o == null) { for (int index = 0; index < size; index++) if (elementData[index] == null) { fastRemove(index); return true; } } else { for (int index = 0; index < size; index++) if (o.equals(elementData[index])) { fastRemove(index); return true; } } return false; } 重点关注: fastRemove(index); private void fastRemove(int index) { modCount++; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData,index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work } 获得预删除对象的位置(index),传入fastRemove,将index后所有数据向前移动一个单位,并且将最后一个数据设置为null,然gc对其进行回收。 Remove(E)比较耗时的步骤是:遍历数组与目标数据进行比较。 2.5 删除数据:remove(int) public E remove(int index) { RangeCheck(index); modCount++; EoldValue = (E) elementData[index]; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Letgc do its work return oldValue; } 虽然remove(int)多了一步 RangeCheck(index);范围检测 但是不用对数据进行比较,因此remove(int)的效率比remove(E)的效率要高。 2.6 遍历对象:iterator() 关于iterator实例: public Iterator<E> iterator(){ return new Itr(); } 每次调用iterator方法返回一个Itr实例,该实例包含属性 Cursor, Cursor起到光标的作用,在hasNext中与当前数据的长度进行比较,如果相等则说明遍历完成,返回false。 public boolean hasNext() { return cursor != size(); } Iterator实例还包含属性 expectedModCount expecteModeCount描述了在创建iterator时ArrayList实例的状态,即获取那时modCount的值。 public E next() { checkForComodification(); try { Enext = get(cursor); lastRet = cursor++; return next; } catch (IndexOutOfBoundsException e) { checkForComodification(); throw newNoSuchElementException(); } } 对ArrayList实例中对象数组的大小产生影响的动作将会影响实例的modCount属性,在next方法中,需要iterator持有的expecteModeCount与当前的modCount进行比较,若不相同则说明在iterator遍历的过程中ArrayList实例发生了变化(对象数组长度发生变化)。该功能由checkForComodfication方法执行: final void checkForComodification() { if (modCount != expectedModCount) throw newConcurrentModificationException(); } } 因此在使用iterator对ArrayList实例进行遍历的过程中,不能使用add、remove等方法。 2.7 判断存在或获取位置 Contains(E)、indexOf、lastIndexOf无非都是对对象数组的遍历和数据之间的比较,不做过多说明。 2.8 注意点
发表评论
-
JVM内存分析及导致内存溢出的不健壮代码及解决办法
2011-01-30 14:10 832关键字: Jvm , 内存 ... -
Java集合类--LinkedList
2011-01-30 13:58 666http://www.cnblogs.com/huangf ... -
Java集合类--HashMap
2011-01-30 13:57 642关键字: java , collec ... -
Java运行时绑定探讨
2011-01-30 13:46 544关键字: java , 多态 , 重载 , 重写 , 动 ... -
浅谈equals和hashcode
2011-01-30 13:45 569关键字: equals , hashcode 转 ... -
Junit4参数化测试
2011-01-30 13:45 608关键字: junit , 参数化 转自:http ... -
Java线程安全总结
2011-01-30 13:39 589关键字: java , 线程安全 , synchroni ... -
《软件开发沉思录》之对象健身操
2011-01-30 13:28 666关键字: 编码规范 最近看了一部分《软件开发沉思 ... -
Sun HotSpot JVM内存管理及垃圾收集
2011-01-30 13:21 1053关键字: jvm , 内存管理 , 垃圾收集 ...
相关推荐
set list ArrayList等java集合类详述
day14-ArrayList集合 1.ArrayList 1.1ArrayList类概述【理解】 什么是集合 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变 ArrayList集合的特点 底层是数组实现的,长度可以变化 泛型的使用 ...
java集合类ArrayList简单雇员管理系统.doc
java集合类ArrayList总结共9页.pdf.zip
java 集合源码 JDK-Collection集合入门 总的list和set类结构大致如下所示 Map不继承Collection,其结构如下 首先介绍下迭代器的概念 迭代器无非是一个接口,假设我们有一个数组,如果我们要实现迭代器,只需要根据该接口...
掌握List集合、Set集合、Map集合的使用以及Iterator迭代器和foreach循环的使用 了解常用的集合类 熟悉泛型的使用
java集合类arraylist循环中删除特定元素的方法.docx
java集合类 Java中有哪些容器(集合类)? 线程安全和线程不安全的分别有哪些? Map接口有哪些实现类? 描述一下Map put的过程 如何得到一个线程安全的Map? HashMap有什么特点? ConcurrentHashMap是怎么分段分组...
我写的关于set集合和list集合相关性能测试,linkedList ArrayList HashSet 等类的增删改查性能测试
超全Java集合框架讲解 - 超全Java集合框架讲解 - 集合框架总览 - Iterator Iterable ListIterator - Map 和 Collection 接口 - Map 集合体系详解 - HashMap - LinkedHashMap - TreeMap - WeakHashMap - ...
3)了解List接口及主要实现类(ArrayList、LinkedList、Vector) 4)了解Map接口及主要实现类(HashMap、TreeMap、HashTable) 二、实验内容及步骤 1、编写程序练习将以下5个Person类的对象放在一个HashSet中。 姓名...
java.util 中的集合类包含 Java 中某些最常用的类。 最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List ...
Java类集框架 最大单值操作父接口Collection及其子接口、子类: List接口、ArrayList类、Vector类、栈操作类Stack、链表操作类LinkList、队列操作接口Queue、Set接口、HashSet类、TreeSet类、SortedSet接口 双值操作...
集合类的使用如ArrayList,HashMap ◦对这些集合类的操作包括:遍历、添加、排序,得到集合的大小、判断集合里是否已存在指定元素 第三是熟悉对象的序列化和反序列化 作为类的方法来实现下面二个方法 ◦public ...
在Java中,CopyOnWriteArrayList(写入时复制数组列表)是线程安全的集合类,它实现了List接口,并使用了"写入时复制"的策略来保证线程安全性。 CopyOnWriteArrayList的主要特点是:在进行修改操作(例如添加、修改...
JAVA集合类的一些总结 collection,vector,arraylist,list,hashtable...
详细描述了Java提供的集合类:HashMap/CurrentHashMap/ArrayList/LinkedList核心原理及版本升级差异。
下面小编就为大家带来一篇Java集合类ArrayList循环中删除特定元素的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
2、ArrayList类可以实现可变长数组。在实验四和实验五中,在银行类中使用数组存放客户,在客户类中使用数组存放帐号,客户和帐号的数量受到了限制,不能随意增加。修改程序,改用ArrayList来存放客户和帐号,最后...