JAVA教程之细说Java之util类
IDE是好。java中的IDE更是百花齐放,你用jbuilder能说jbuilder赶不上vs吗?用eclipse,netbeans也很舒服啊。我就不明白“稍微差一些”那一些是从哪里差来的。关头字javautilcollectionlistmapsethashmap汇合链表哈希
线性表,链表,哈希表是经常使用的数据布局,在举行Java开辟时,JDK已为我们供应了一系列响应的类来完成基础的数据布局。这些类均在java.util包中。本文试图经由过程复杂的形貌,向读者论述各个类的感化和怎样准确利用这些类。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection接口
Collection是最基础的汇合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection同意不异的元素而另外一些不可。一些能排序而另外一些不可。JavaSDK不供应间接承继自Collection的类,JavaSDK供应的类都是承继自Collection的“子接口”如List和Set。
一切完成Collection接口的类都必需供应两个尺度的机关函数:无参数的机关函数用于创立一个空的Collection,有一个Collection参数的机关函数用于创立一个新的Collection,这个新的Collection与传进的Collection有不异的元素。后一个机关函数同意用户复制一个Collection。
怎样遍历Collection中的每个元素?不管Collection的实践范例怎样,它都撑持一个iterator()的办法,该办法前往一个迭代子,利用该迭代子便可一一会见Collection中每个元素。典范的用法以下:
Iteratorit=collection.iterator();//取得一个迭代子
while(it.hasNext()){
Objectobj=it.next();//失掉下一个元素
}
由Collection接口派生的两个接口是List和Set。
List接口
List是有序的Collection,利用此接口可以准确的把持每一个元素拔出的地位。用户可以利用索引(元素在List中的地位,相似于数组下标)来会见List中的元素,这相似于Java的数组。
和上面要提到的Set分歧,List同意有不异的元素。
除具有Collection接口必备的iterator()办法外,List还供应一个listIterator()办法,前往一个ListIterator接口,和尺度的Iterator接口比拟,ListIterator多了一些add()之类的办法,同意增加,删除,设定元素,还能向前或向后遍历。
完成List接口的经常使用类有LinkedList,ArrayList,Vector和Stack。
LinkedList类
LinkedList完成了List接口,同意null元素。别的LinkedList供应分外的get,remove,insert办法在LinkedList的首部或尾部。这些操纵使LinkedList可被用作仓库(stack),行列(queue)或双向行列(deque)。
注重LinkedList没有同步办法。假如多个线程同时会见一个List,则必需本人完成会见同步。一种办理办法是在创立List时机关一个同步的List:
Listlist=Collections.synchronizedList(newLinkedList(...));
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,即恣意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
很分明,Set的机关函数有一个束缚前提,传进的Collection参数不克不及包括反复的元素。
请注重:必需当心操纵可变对象(MutableObject)。假如一个Set中的可变元素改动了本身形态招致Object.equals(Object)=true将招致一些成绩。
Map接口
请注重,Map没有承继Collection接口,Map供应key到value的映照。一个Map中不克不及包括不异的key,每一个key只能映照一个value。Map接口供应3种汇合的视图,Map的内容能够被看成一组key汇合,一组value汇合,大概一组key-value映照。
Hashtable类 Hashtable承继Map接口,完成一个key-value映照的哈希表。任何非空(non-null)的对象都可作为key大概value。
增加数据利用put(key,value),掏出数据利用get(key),这两个基础操纵的工夫开支为常数。
Hashtable经由过程initialcapacity和loadfactor两个参数调剂功能。一般缺省的loadfactor0.75较好地完成了工夫和空间的平衡。增年夜loadfactor能够节俭空间但响应的查找工夫将增年夜,这会影响像get和put如许的操纵。
利用Hashtable的复杂示比方下,将1,2,3放到Hashtable中,他们的key分离是”one”,”two”,”three”:
Hashtablenumbers=newHashtable();
numbers.put(“one”,newInteger(1));
numbers.put(“two”,newInteger(2));
numbers.put(“three”,newInteger(3));
要掏出一个数,好比2,用响应的key:
Integern=(Integer)numbers.get(“two”);
System.out.println(“two=”+n);
因为作为key的对象将经由过程盘算其散列函数来断定与之对应的value的地位,因而任何作为key的对象都必需完成hashCode和equals办法。hashCode和equals办法承继自根类Object,假如你用自界说的类看成key的话,要相称当心,依照散列函数的界说,假如两个对象不异,即obj1.equals(obj2)=true,则它们的hashCode必需不异,但假如两个对象分歧,则它们的hashCode纷歧定分歧,假如两个分歧对象的hashCode不异,这类征象称为抵触,抵触会招致操纵哈希表的工夫开支增年夜,以是只管界说好的hashCode()办法,能加速哈希表的操纵。
假如不异的对象有分歧的hashCode,对哈希表的操纵会呈现意想不到的了局(等候的get办法前往null),要制止这类成绩,只必要切记一条:要同时复写equals办法和hashCode办法,而不要只写个中一个。
Hashtable是同步的。
HashMap类
HashMap和Hashtable相似,分歧的地方在于HashMap长短同步的,而且同意null,即nullvalue和nullkey。,可是将HashMap视为Collection时(values()办法可前往Collection),其迭代子操纵工夫开支和HashMap的容量成比例。因而,假如迭代操纵的功能相称主要的话,不要将HashMap的初始化容量设得太高,大概loadfactor太低。
WeakHashMap类
WeakHashMap是一种改善的HashMap,它对key实施“弱援用”,假如一个key不再被内部所援用,那末该key能够被GC接纳。
总结
假如触及到仓库,行列等操纵,应当思索用List,关于必要疾速拔出,删除元素,应当利用LinkedList,假如必要疾速随机会见元素,应当利用ArrayList。
假如程序在单线程情况中,大概会见仅仅在一个线程中举行,思索非同步的类,其效力较高,假如多个线程大概同时操纵一个类,应当利用同步的类。
要出格注重对哈希表的操纵,作为key的对象要准确复写equals和hashCode办法。
只管前往接口而非实践的范例,如前往List而非ArrayList,如许假如今后必要将ArrayList换成LinkedList时,客户端代码不必改动。这就是针对笼统编程。
比如模式、敏捷方法什么的,这些思想好,但是实施的人没有理解而且没有正确运用这些知识导致了开发周期的延长。比如说对象,通过getName()方法不能获取对象的名字。 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 是一种为 Internet发展的计算机语言 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 是一种使网页(Web Page)产生生动活泼画面的语言 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 是一种将安全性(Security)列为第一优先考虑的语言 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
页:
[1]