java容器类

 
Collection
  List
  │├ LinkedList
  │├ ArrayList
  │└ Vector
  │ └ Stack
  Set
 Map
  Hashtable( 同步 )
  HashMap
  WeakHashMap
 
//*******************************************************
ArrayList, HashMap,Vector,Stack support null
Hashtable not support null
//***********************************************
一些 Collection 允许相同的元素而另一些不行。
list( 允许相同的元素 ):LinkedList ArrayList Vector Stack
map( 允许相同的元素 )
set( 不允许相同的元素 )
 
一些能排序而另一些不行。
一般采取 Collection.sort(list)
Collection.sort(list,comparable)
来排序
 
也可以让某个类 implaments comparable
Java SDK 不提供直接继承自 Collection 的类,
Java SDK 提供的类都是继承自 Collection 的“子接口”如 List Set
所有实现 Collection 接口的类都必须提供两个标准的构造函数:
无参数的构造函数用于创建一个空的 Collection
有一个 Collection 参数的构造函数用于创建一个新的 Collection
这个新的 Collection 与传入的 Collection 有相同的元素。
后一个构造函数允许用户复制一个 Collection
 
arraylist--Vector
1, 同步
2, 增加的幅度
3, 进行平移的时间
 
Hashtable--Hashmap
1, 同步
2,Enumeration; 迭代
3,null
Java.util.Vector 提供了向量 (Vector) 类以实现类似动态数组的功能。在 Java 语言中。正如在一开始就提到过,是没有指针概念的,但如果能正确灵活地使用指针又确实可以大大提高程序的质量,比如在 C C++ 中所谓“动态数组”一般都由指针来实现。为了弥补这点缺陷, Java 提供了丰富的类库来方便编程者使用, Vector 类便是其中之一。事实上,灵活使用数组也可完成向量类的功能,但向量类中提供的大量方法大大方便了用户的使用。
  创建了一个向量类的对象后,可以往其中随意地插入不同的类的对象,既不需顾及类型也不需预先选定向量的容量,并可方便地进行查找。对于预先不知或不愿预先定义数组大小,并需频繁进行查找、插入和删除工作的情况,可以考虑使用向量类。
  向量类提供了三种构造方法:
   public vector()
   public vector(int initialcapacity,int capacityIncrement)
   public vector(int initialcapacity)
  使用第一种方法,系统会自动对向量对象进行管理。若使用后两种方法,则系统将根据参数 initialcapacity 设定向量对象的容量 ( 即向量对象可存储数据的大小 ) ,当真正存放的数据个数超过容量时,系统会扩充向量对象的存储容量。参数 capacityIncrement 给定了每次扩充的扩充值。当 capacityIncrement 0 时,则每次扩充一倍。利用这个功能可以优化存储。
  在 Vector 类中提供了各种方法方便用户使用:
  ■插入功能
   (1)public final synchronized void addElement(Object obj)
  将 obj 插入向量的尾部。 obj 可以是任何类的对象。对同一个向量对象,可在其中插入不同类的对象。但插入的应是对象而不是数值,所以插入数值时要注意将数值转换成相应的对象。
  例  要插入一个整数 1 时,不要直接调用 v1.addElement(1) ,正确的方法为:
   Vector v1=new Vector();
   Integer integer1=new Integer(1);
   v1.addElement(integer1);
   (2)public final synchronized void setElementAt(object obj,int index)
  将 index 处的对象设成 obj ,原来的对象将被覆盖。
   (3)public final synchronized void insertElementAt(Object obj,int index)
  在 index 指定的位置插入 obj ,原来对象以及此后的对象依次往后顺延。
  ■删除功能
   (1)public final synchronized void removeElement(Object obj)
  从向量中删除 obj 。若有多个存在,则从向量头开始试,删除找到的第一个与 obj 相同的向量成员。
   (2)public final synchronized void removeAllElement()
  删除向量中所有的对象。
   (3)public final synchronized void removeElementlAt(int index)
  删除 index 所指的地方的对象。
  ■查询搜索功能
   (1)public final int indexOf(Object obj)
  从向量头开始搜索 obj , 返回所遇到的第一个 obj 对应的下标,若不存在此 obj ,返回 -1
   (2)public final synchronized int indexOf(Object obj,int index)
  从 index 所表示的下标处开始搜索 obj
   (3)public final int lastIndexOf(Object obj)
  从向量尾部开始逆向搜索 obj
   (4)public final synchronized int lastIndexOf(Object obj,int index)
  从 index 所表示的下标处由尾至头逆向搜索 obj
   (5)public final synchronized Object firstElement()
  获取向量对象中的首个 obj
   (6)public final synchronized Object lastelement()
  获取向量对象中的最后一个 obj
  了解了向量的最基本的方法后,我们来看一下例 8.3VectorApp.java
  例 1.3 VectorApp.java
   import java.util.Vector;
   import java.lang.*;// 这一句不应该要,但原文如此
   import java.util.Enumeration;
   public class VectorApp{
    public static void main(String[] args){
     Vector v1=new Vector();
     Integer integer1=new Integer(1);
     v1.addElement("one");
     // 加入的为字符串对象
     v1.addElement(integer1);
     v1.addElement(integer1);
     // 加入的为 Integer 的对象
     v1.addElement("two");
     v1.addElement(new Integer(2));
     v1.addElement(integer1);
     v1.addElement(integer1);
     System.out.println("The vector v1 is:/n/t"+v1);
     // v1 转换成字符串并打印
     v1.insertElementAt("three",2);
     v1.insertElementAt(new Float(3.9),3);
     System.out.println("The vector v1(used method insertElementAt()) is:/n/t "+v1);
     // 往指定位置插入新的对象,指定位置后的对象依次往后顺延
     v1.setElementAt("four",2);
     System.out.println("The vector v1(used method setElementAt()) is:/n/t "+v1);
     // 将指定位置的对象设置为新的对象
     v1.removeElement(integer1);
     // 从向量对象 v1 中删除对象 integer1 由于存在多个 integer1 所以从头开始
     // 找,删除找到的第一个 integer1
     Enumeration enum=v1.elements();
     System.out.print("The vector v1(used method removeElement())is:");
     while(enum.hasMoreElements())
     System.out.print(enum.nextElement()+" ");
     System.out.println();
     // 使用枚举类 (Enumeration) 的方法来获取向量对象的每个元素
     System.out.println("The position of object 1(top-to-bottom):"
      + v1.indexOf(integer1));
     System.out.println("The position of object 1(tottom-to-top):"
      +v1.lastIndexOf(integer1));
     // 按不同的方向查找对象 integer1 所处的位置
     v1.setSize(4);
     System.out.println("The new vector(resized the vector)is:"+v1);
     // 重新设置 v1 的大小,多余的元素被行弃
    }
   }
  运行结果:
   E:/java01>java VectorApp
   The vector v1 is:
      [one, 1, 1, two, 2, 1, 1]
   The vector v1(used method insertElementAt()) is:
      [one, 1, three, 3.9, 1, two, 2, 1, 1]
   The vector v1(used method setElementAt()) is:
      [one, 1, four, 3.9, 1, two, 2, 1, 1]
   The vector v1(used method removeElement())is:one four 3.9 1 two 2 1 1
   The position of object 1(top-to-bottom):3
   The position of object 1(tottom-to-top):7
   The new vector(resized the vector)is:[one, four, 3.9, 1]
   E:/java01>
  从例 1.3 运行的结果中可以清楚地了解上面各种方法的作用,另外还有几点需解释。
   (1) Vector 定义了方法
   public final int size()
  此方法用于获取向量元素的个数。它的返回值是向是中实际存在的元素个数,而非向量容量。可以调用方法 capactly() 来获取容量值。
  方法:
   public final synchronized void setsize(int newsize)
  此方法用来定义向量大小。若向量对象现有成员个数已超过了 newsize 的值,则超过部分的多余元素会丢失。
   (2) 程序中定义了 Enumeration 类的一个对象
   Enumeration java.util 中的一个接口类,在 Enumeration 中封装了有关枚举数据集合的方法。
  在 Enumeration 中提供了方法 hawMoreElement() 来判断集合中是束还有其它元素和方法 nextElement() 来获取下一个元素。利用这两个方法可以依次获得集合中元素。
   Vector 中提供方法:
   public final synchronized Enumeration elements()
  此方法将向量对象对应到一个枚举类型。 java.util 包中的其它类中也大都有这类方法,以便于用户获取对应的枚举类型。

栈类 Stack
   Stack 类是 Vector 类的子类。它向用户提供了堆栈这种高级的数据结构。栈的基本特性就是先进后出。即先放入栈中的元素将后被推出。 Stack 类中提供了相应方法完成栈的有关操作。
  基本方法:
   public Object push(Object Hem)
  将 Hem 压入栈中, Hem 可以是任何类的对象。
   public Object pop()
  弹出一个对象。
   public Object peek()
  返回栈顶元素,但不弹出此元素。
   public int search(Object obj)
  搜索对象 obj, 返回它所处的位置。
   public boolean empty()
  判别栈是否为空。
  例 1.4 StackApp.java 使用了上面的各种方法。
  例 1.4 StackApp.java
   import java.lang.*;
   import java.util.*;
   public class StackApp{
    public static void main(String args[]){
     Stack sta=new Stack();
     sta.push("Apple");
     sta.push("banana");
     sta.push("Cherry");
     // 压入的为字符串对象
     sta.push(new Integer(2));
     // 压入的为 Integer 的对象,值为 2
     sta.push(new Float(3.5));
     // 压入的为 Float 的对象,值为 3.5
     System.out.println("The stack is,"+sta);
     // 对应栈 sta
     System.out.println("The top of stack is:"+sta.peek());
     // 对应栈顶元素,但不将此元素弹出
     System.out.println("The position of object Cherry is:"
     +sta.search("cherry"));
     // 打印对象 Cherry 所处的位置
     System.out.print("Pop the element of the stack:");
     while(!sta.empty())
     System.out.print(sta.pop()+" ");
     System.out.println();
     // 将栈中的元素依次弹出并打印。与第一次打印的 sta 的结果比较,可看出栈
     // 先进后出的特点
    }
   }
  运行结果 ( )


1.7 
哈希表类 Hashtable

  哈希表是一种重要的存储方式,也是一种常见的检索方法。其基本思想是将关系码的值作为自变量,通过一定的函数关系计算出对应的函数值,把这个数值解释为结点的存储地址,将结点存入计算得到存储地址所对应的存储单元。检索时采用检索关键码的方法。现在哈希表有一套完整的算法来进行插入、删除和解决冲突。在 Java 中哈希表用于存储对象,实现快速检索。
   Java.util.Hashtable 提供了种方法让用户使用哈希表,而不需要考虑其哈希表真正如何工作。
  哈希表类中提供了三种构造方法,分别是:
   public Hashtable()
   public Hashtable(int initialcapacity)
   public Hashtable(int initialCapacity,float loadFactor)
  参数 initialCapacity Hashtable 的初始容量,它的值应大于 0 loadFactor 又称装载因子,是一个 0.0 0.1 之间的 float 型的浮点数。它是一个百分比,表明了哈希表何时需要扩充,例如,有一哈希表,容量为 100 ,而装载因子为 0.9 ,那么当哈希表 90% 的容量已被使用时,此哈希表会自动扩充成一个更大的哈希表。如果用户不赋这些参数,系统会自动进行处理,而不需要用户操心。
   Hashtable 提供了基本的插入、检索等方法。
  ■插入
   public synchronized void put(Object key,Object value)
给对象 value 设定一关键字 key, 并将其加到 Hashtable 中。若此关键字已经存在,则将此关键字对应的旧对象更新为新的对象 Value 。这表明在哈希表中相同的关键字不可能对应不同的对象 ( 从哈希表的基本思想来看,这也是显而易见的 )
  ■检索
   public synchronized Object get(Object key)
  根据给定关键字 key 获取相对应的对象。
   public synchronized boolean containsKey(Object key)
  判断哈希表中是否包含关键字 key
   public synchronized boolean contains(Object value)
  判断 value 是否是哈希表中的一个元素。
  ■删除
   public synchronized object remove(object key)
  从哈希表中删除关键字 key 所对应的对象。
   public synchronized void clear()
  清除哈希表
  另外, Hashtalbe 还提供方法获取相对应的枚举集合:
   public synchronized Enumeration keys()
  返回关键字对应的枚举对象。
   public synchronized Enumeration elements()
  返回元素对应的枚举对象。
  例 1.5 Hashtable.java 给出了使用 Hashtable 的例子。
  例 1.5 Hashtalbe.java
   //import java.lang.*;
   import java.util.Hashtable;
   import java.util.Enumeration;
   public class HashApp{
    public static void main(String args[]){
     Hashtable hash=new Hashtable(2,(float)0.8);
     // 创建了一个哈希表的对象 hash ,初始容量为 2 ,装载因子为 0.8
     hash.put("Jiangsu","Nanjing");
     // 将字符串对象“ Jiangsu ”给定一关键字“ Nanjing , 并将它加入 hash
     hash.put("Beijing","Beijing");
     hash.put("Zhejiang","Hangzhou");
     System.out.println("The hashtable hash1 is: "+hash);
     System.out.println("The size of this hash table is "+hash.size());
     // 打印 hash 的内容和大小
     Enumeration enum1=hash.elements();
     System.out.print("The element of hash is: ");
     while(enum1.hasMoreElements())
      System.out.print(enum1.nextElement()+" ");
     System.out.println();
     // 依次打印 hash 中的内容
     if(hash.containsKey("Jiangsu"))
      System.out.println("The capatial of Jiangsu is "+hash.get("Jiangsu"));
     hash.remove("Beijing");
     // 删除关键字 Beijing 对应对象
     System.out.println("The hashtable hash2 is: "+hash);
     System.out.println("The size of this hash table is "+hash.size());
    }
   }

  运行结果:
   The hashtable hash1 is: {Beijing=Beijing, Zhejiang=Hangzhou, Jiangsu=Nanjing}
   The size of this hash table is 3
   The element of hash is: Beijing Hangzhou Nanjing
   The capatial of Jiangsu is Nanjing
   The hashtable hash2 is: {Zhejiang=Hangzhou, Jiangsu=Nanjing}
   The size of this hash table is 2

   Hashtable Dictionary( 字典 ) 类的子类。在字典类中就把关键字对应到数据值。字典类是一个抽象类。在 java.util 中还有一个类 Properties ,它是 Hashtable 的子类。用它可以进行与对象属性相关的操作。

日期类 Date
   Java 在日期类中封装了有关日期和时间的信息,用户可以通过调用相应的方法来获取系统时间或设置日期和时间。 Date 类中有很多方法在 JDK1.0 公布后已经过时了,在 8.3 中我们将介绍 JDK1.0 中新加的用于替代 Date 的功能的其它类。
  在日期类中共定义了六种构造函数。
   (1)public Date()
  创建的日期类对象的日期时间被设置成创建时刻相对应的日期时间。
  例  Date today=new Date() //today 被设置成创建时刻相对应的日期时间。
   (2)public Date (long date)
   long  型的参数 date 可以通过调用 Date 类中的 static 方法 parse(String s) 来获得。
  例  long l=Date.parse("Mon 6 Jan 1997 13:3:00");
   Date day=new Date(l);
   //day 中时间为 1997  1 6 号星期一, 13:3:00
   (3)public Date(String s)
  按字符串 s 产生一日期对象。 s 的格式与方法 parse 中字符串参数的模式相同。
  例  Date day=new Date("Mon 6 Jan 1997 13:3:00");
   //day  中时间为 1997 1 6 号星期一, 13:3:00.
   (4)public Date(int year,int month,int date)
   (5)public Date(int year,int month,int date,int hrs,int min)
   (6)public Date(int year,int month,int date,int hrs,int min,int sec)
  按给定的参数创建一日期对象。
  参数说明:
   year 的值为:需设定的年份 -1900 。例如需设定的年份是 1997 year 的值应为 97 ,即 1997-1900 的结果。所以 Date 中可设定的年份最小为 1900
   month 的值域为 0 11 0 代表 1 月, 11 表代表 12 月;
   date 的值域在 1 31 之间;
   hrs 的值域在 0 23 之间。从午夜到次日凌晨 1 点间 hrs=0 ,从中午到下午 1 点间 hrs=12
   min sec 的值域在 0 59 之间。
  例  Date day=new Date(11,3,4);
   //day 中的时间为: 04-Apr-11 12:00:00 AM
另外,还可以给出不正确的参数。
  例 设定时间为 1910 2 30 日,它将被解释成 3 2 日。
   Date day=new Date(10,1,30,10,12,34);
   System.out.println("Day's date is:"+day);
   // 打印结果为: Day's date is:Web Mar 02 10:13:34 GMT+08:00 1910
  下面我们给出一些 Date 类中常用方法。
   (1)public static long UTC(int year,int month,int date,int hrs. int min,int sec)
  该方法将利用给定参数计算 UTC 值。 UTC 是一种计时体制,与 GMT( 格林威治时间 ) 的计时体系略有差别。 UTC 计时体系是基于原子时钟的,而 GTMT 计时体系是基于天文学观测的。计算中使用的一般为 GMT 计时体系。
   (2)public static long parse(String s)
  该方法将字符串 s 转换成一个 long 型的日期。在介绍构造方法 Date(long date) 时曾使用过这个方法。
  字符串 s 有一定的格式,一般为:
   ( 星期      时间 GMT+ 时区 )
  若不注明时区,则为本地时区。
   (3)public void setMonth(int month)
   (4)public int getMonth()
  这两个方法分别为设定和获取月份值。
  获取的月份的值域为 0 11 0 代表 1 月, 11 代表 12 月。
   (5)public String toString()
   (6)public String toLocalString()
   (7)public String toGMTString()
  将给定日期对象转换成不同格式的字符串。它们对应的具体的格式可参看例子 8.1
   (8)public int getTimezoneOffset()
  该方法用于获取日期对象的时区偏移量。
  例 8.1 中对上面介绍的 Date 类中的基本方法进行了具体的应用,并打印了相应的结果。由于使用了一些过时的方法,所以编译时会有警告信息。另外,由于本例中的时间表示与平台有关,不同的 JDK 版本对此处理不完全相同,因此不同版本的 JDK 执行本例的结果可能有细微差异。
  例 1.1 DateApp.java
   import java.lang.System;
   import java.util.Date;
   public class DateApp{
    public static void main(String args[]){
     Date today=new Date();
     //today 中的日期被设成创建时刻的日期和时间,假设创建时刻为 1997 3
     //23 17 51 54 秒。
     System.out.println("Today's date is "+today);
     // 返回一般的时间表示法,本例中结果为
     //Today's date is Fri May 23 17:51:54 1997
     System.out.println("Today's date(Internet GMT)is:"
      +today.toGMTString());
     // 返回结果为 GMT 时间表示法,本例中结果为
     //Today's date(Internet GMT)is: 23 May 1997 09:51:54:GMT
     System.out.println("Today's date(Locale) is:"
      +today.toLocaleString());
     // 返回结果为本地习惯的时间表示法,结果为
     //Today's date(Locale)is:05/23/97 17:51:54
     System.out.println("Today's year is: "+today.getYear());
     System.out.println("Today's month is: "+(today.getMonth()+1));
     System.out.println("Today's date is: "+today.getDate());
     // 调用 Date 类中方法,获取年月日的值。
     // 下面调用了不同的构造方法来创建 Date 类的对象。
     Date day1=new Date(100,1,23,10,12,34);
     System.out.println("Day1's date is: "+day1);
     Date day2=new Date("Sat 12 Aug 1996 13:3:00");
     System.out.println("Day2's date is: "+day2);
     long l= Date.parse("Sat 5 Aug 1996 13:3:00 GMT+0800");
     Date day3= new Date(l);
     System.out.println("Day3's date(GMT)is: "+day3.toGMTString());
     System.out.println("Day3's date(Locale)is: "
      +day3.toLocaleString());
     System.out.println("Day3's time zone offset is:"
      +day3.getTimezoneOffset());
    }
   }

  运行结果 (JDK1.3 版,与原文不同,原文是 JDK1.0 )
   E:/java/tutorial/java01>java DateApp
   Today's date is Thu Dec 27 17:58:16 CST 2001
   Today's date(Internet GMT)is:27 Dec 2001 09:58:16 GMT
   Today's date(Locale) is:2001-12-27 17:58:16
   Today's year is: 101
   Today's month is: 12
   Today's date is: 27
   Day1's date is: Wed Feb 23 10:12:34 CST 2000
   Day2's date is: Fri Aug 12 13:03:00 CST 1996
   Day3's date(GMT)is: 5 Aug 1996 05:03:00 GMT
   Day3's date(Locale)is: 1996-8-5 13:03:00
   Day3's time zone offset is:-480

   E:/java/tutorial/java01>

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值