Object与集合.ppt_第1页
Object与集合.ppt_第2页
Object与集合.ppt_第3页
Object与集合.ppt_第4页
Object与集合.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java语言基础类库,类库是Java语言的重要组成部分;Java语言是由语法规则和类库两部分组成的。语法规则确定了java的书写规范;类库(或称运行时库)提供了Java程序与JVM之间的接口,它是java编程的API(Application Program Interface)。 JDK中提供的基础类库又称为JFC(Java Foundation Class), 包含多个包,分别提供针对不同功能的类和接口。,JFC(Java Foundation Class),java.lang 基本(核心)语言包 java.util 常用工具包 java.awt 图形做图包 java.io 输入输出包 网络

2、功能包 java.sql 数据库访问包 java.applet java小程序应用包,Part 1java.lang包,java.lang,Java.lang是Java语言的常用核心包,包含了运行java程序时最常用的类,包括: 封装类、Math、String、Object、System、Throwable类,等等;接口包括Comparable等等。 每个java程序运行时,系统会自动引入这个包,所以这个包是默认加载的,编写程序时不需要import,Object 类(1),类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 类

3、Object尽管是一个具体类,但是实际它主要是为了扩展。它所有的非final方法(equals, toString,finalize,clone,hashCode),都有明确的约定,因为都是为了改写而设计的。,Object 类(2),Object类的方法: protected Object clone() throws CloneNotSupportedException /生成一个对象备份 public boolean equals(Object o) public int hashCode() /返回该对象的哈希码值 ;将该对象的内部地址转换成一个整数 public String toSt

4、ring() protected void finalize() public final Class getClass() public final void notify() / thread public final void notifyAll() / thread public final void wait() / thread,Object 类: equals(),用来比较两个对象的引用是否相等。 何时改写equals()呢?当一个类有自己特有的逻辑相等的概念。一些类已经改写了此方法,比如,Date。 /JDK中,Date类的源代码如下: public boolean equal

5、s(Object obj) return obj instanceof Date java.util.Date 两个构造方法: Date( ) 分配 Date 对象并初始化此对象,以表示分配它的时间(精确到毫秒)。 Date ( long date ) 自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。,Object 类: equals(),import java.util.Date; public class TestDate public static void main(String args) Date d1 =

6、 new Date(800); Date d2 = new Date(800); System.out.println(d1.toString(); System.out.println(d2.toString(); /Thu Jan 01 08:00:00 CST 1970 if (d1.equals(d2) System.out.println(d1 equals d2); ,Object 类: equals(),class MyDate int day,month,year; public MyDate(int i,int j,int k) day = i; month = j; yea

7、r = k; ,/自定义的Date类,重写equals(),class MyNewDate extends MyDate public MyNewDate(int i,int j,int k) super(i,j,k); /重写 equals() 方法 public boolean equals (Object obj) if (obj instanceof MyNewDate) MyNewDate m = (MyNewDate) obj; if (m.day = day / ? ,hashcode(),返回该对象的哈希码值 ;将该对象的内部地址转换成一个整数 返回对象的散列值,在使用散列表(

8、Hashtable)存储对象时是必须的。 Object类的hashCode方法实现是将对象内存地址转换成一个整数,所以,不同对象的散列值不同。 实现的规则(一些类已重写了此方法,如String): 对象使用equals比较返回“真”时,散列值应该相等。 equals方法返回“假”时,散列值不必不等。但不等的散列值会带来效率的提高。 举例:TestHashCode.java,Object 类: toString(),对象的toString方法返回对象的文本表示。 Object类的实现: /JDK源代码 public String toString() return getClass().getN

9、ame() + + Integer.toHexString(hashCode(); Eg: PhoneNumber163b91/hardly understand 一般情况,给出toString方法的实现。 public String toString() return areaCode +”-”+ num; ,clone(),JDK中Object类中clone()方法的定义如下: protected native Object clone() throws CloneNotSupportedException; protected 此方法是专门为继承而设计的; native 用来修释方法,表

10、示该方法不是用java写成,通常是C,C+或者汇编 应用clone()方法 :TestClone1.java 应用该方法的对象必须实现Cloneable接口,否则异常。 必须重写clone() 方法。 在该方法中必须使用super.clone(); 注意shallow clone与deep clone : TestClone2.java,Object 类: getClass(),该方法返回一个对象的运行时类信息。 除了instanceof可以对运行时类进行判断外,Object类的getClass()方法也可以获得运行时信息。这种获得对象运行时信息的方法叫作反射(reflection)。 Run

11、TimeClassInfo.java Class类的主要方法: getFields() getMethods() getName() getPackage() isArray() isInterface(),JAVA反射机制(1),Reflection 是Java被视为动态(或准动态)语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的

12、反射机制。 Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法。,JAVA反射机制(2),一个例子让大家更直观的了解反射的使用方法: /通过类名来构造一个类的实例Class cls_str = Class.forName(java.lang.String);Object str = cls_str.newInstance();/相当于 String str = new String();,Part 2,java.util包 包含集合框架、日期和时间设施、国际化和各种实用

13、工具类(字符串标记生成器、随机数生成器和位数组),数组 vs Collection,通常,程序在运行时才知道具体的条件去创造对象。不到运行时,不知道所需对象的数量,甚至类型,所以不能希望创建引用来持有每一个对象。因为不可能知道有多少个这样的对象。Java 提供了多种方式来保存这些对象。 数组(Array),是java内置的类型 集合(Java Collections Framework):java的实用类库提供了一套相当完整的容器类。,Arrays类(java.util.Arrays),在java.util库中Arrays类有多个static方法,提供操作数组的实用功能排序、搜索。 五个基本静

14、态方法: equals( Objecta, Objecta2) 比较两个数组是否相等。 fill()用某值填充某一部分的数组。 sort()对数组进行排序。 binarySearch() 在已经排序的数组中二分法查找元素。 toString()数组内容的字符串表示形式。字符串表示形式由数组的元素列表组成,括在方括号(“ ”)中。相邻元素用字符 “, ”(逗号加空格)分隔。 Example: (UsingArrays .java ),Java集合类介绍,集合对象就是一组对象的表示,不同的集合可以采用不同的数据结构算法进行元素的存储管理。 与数组不同 集合中的元素都是对象,基本数据类型要使用其包装

15、类才能作为集合的元素。 集合类容纳的都是Object类的实例,一旦把一个对象置于集合类中,它的类信息将丢失。 原集合类(jdk1.1)5种基本数据结构:Array、Vector、Hashtable、Bitset、Stack 新集合类(jdk1.2)庞大的集合体系:Java提供了Collection,Set,List来表示各种不同的集合。,数据结构-向量Vector,Vector对应于类似数组的顺序数据结构。 它是允许不同元素共存的可变数组。 Vector vs Array Vector:处理对象数目不定,序列的元素都是对象;将不同类的对象组成一个数据系列;经常需要定位序列中的对象或查找操作。

16、Array:序列中的元素都是简单数据类型;序列中的元素的数目相对固定,插入、删除和查找操作较少。,向量Vector,Vector有3个构造方法,最复杂的一个: public Vector (int initCapacity,int capacityIncrement) 缺省参数的构造方法,向量的初始容量为10 主要方法: public int capacity() /返回容量 public int size() /返回元素的数量 public boolean contains(Objectelem)/测试指定的对象是否在此向量中 public void addElement(Objectobj

17、) /将指定的组件添加到此向量的末尾 public boolean removeElement(Objectobj) /从此向量中移除变量的第一个(索引最小的)匹配项 举例:CatsandDogs.java,数据结构-堆栈Stack,线性数据结构,遵循后进先出原则。 Stack是java用来实现栈的工具。Stack类是Vector的子类. Stack只能在一端输入输出,“压栈”,“弹栈”。 主要方法:public void push (Object item) public Object pop () public Object peek () public boolean empty() /

18、栈是否为空 public int search () 可以使用Vector类的方法: addElement(); elementAt();,import java.util.*; public class TestStack static String months = Jan,Feb,Mar; public static void main(String args) Stack s = new Stack(); for(int i = 0; imonths.length; i+) s.push(monthsi+); System.out.println(Stack = +s); while

19、(!s.empty() System.out.println(s.pop(); ,Hashtable类,Hashtable类没有序列的概念,通过key查找对象。 Hashtable类是Dictionary(抽象类)的子类,使用key寻找value。 Dictionary的方法: int size() / 返回元素个数 boolean is Empty() /是否为空 public void put (Object key,Object value) /放入一对public Object get (Object key) /通过key检索一个值 public void remove (Objec

20、t key) /通过key移除一个值 Enumeration keys()/得到键的枚举器 Enumeration elements()/得到值的枚举器 Hashtable类的key是一个特殊值,Hashcode对象的相对唯一整数。 boolean containsKey(Object key)/检查是否散列表的键 Hashtable中,键和值都不可以为 null 举例:使用Math.random()产生10000个0-19的随机整数,判断是否是平均分布的。,import java.util.*; public class TestHashTable public static void ma

21、in(String args) Hashtable ht = new Hashtable(); ht.put(one,new Integer(1); ht.put(two,new Integer(2); ht.put(three,new Integer(3); Enumeration em = ht.keys(); while (em.hasMoreElements() Object key = em.nextElement(); Object value = ht.get(key); System.out.println( +key+ = +value); ,新集合类Java Collect

22、ions Framework,Collection是集合类的根接口,java没有提供任何类来直接实现此接口,而是给出了一些更为专门的子接口(如Set,List),然后再提供一些类来实现这些子接口。 有的集合允许元素重复(List),有的集合不允许(Set);有的集合有序(List),有的没有(Set)。 Map接口不是集合,它是映射表。,Java集合类,Set(集):不记录元素的保存顺序,而且不允许有重复元素。所谓不重复,是指两个对象不满足a.equals(b)。Set中可以包含null对象,但最多只能有一个null对象。 List(列表):记录元素的保存顺序,而且允许有重复元素。,List接

23、口,List接口是Collection的子接口 ArrayList, Vector,LinkedList是实现List接口的两个重要实现 List表示的是对象可重复的集合 ArrayList,Vector实际上是Java中的“动态数组”, 元素是有序的; Array在用new创建之后,length是不可变的,而ArrayList和Vector的元素个数(size())是可变的。 Vector是线程安全的(synchronized),ArrayList举例,import java.util.*; public class TestArrayList public static void main

24、(String arg) ArrayList h = new ArrayList(); h.add(1st); h.add(2nd); h.add(3rd); h.add(new Integer(6); h.add(2nd);/ repeat?. print(h); public static void print(List s) System.out.println(s); ,LinkedList及队列,队列(queue),遵循“先进先出”的原则。固定在一端输入数据(加队),另一端输出数据(减队)。 Java中,用LinkedList来实现队列。它实现了list接口,也是一种线性结构。 Li

25、nkedList提供了序列的头尾操作。 主要方法:public void addLast (Object item) public Object removeFirst (),import java.util.*; public class TestHashTable public static void main(String args) Queue q = new Queue(); for(int i = 0; i5; i+) q.enqueue( +i); while (!q.isEmpty() System.out.println(q.dequeue(); class Queue ex

26、tends LinkedList void enqueue(Object obj) addLast(obj); Object dequeue() return removeFirst(); public boolean isEmpty() return super.isEmpty(); ,Set接口,Set接口是Collection的子接口 HashSet, TreeSet是实现List接口的两个重要实现 Set表示的是对象不可重复的集合,也就是会使用equals()方法进行判断。 TreeSet是一种有序的集合,元素会按照升序排列。 注意Comparator()的构造。 first()/获取

27、排在最低位的一个 last()/最后一个(最大)元素。,Set 接口及HashSet类(例子),import java.util.*; public class TestHashSet public static void main(String arg) HashSet h = new HashSet(); h.add(1st); h.add(2nd); h.add(3rd); h.add(new Integer(6); h.add(2nd);/ repeat?. print(h); public static void print(Set s) System.out.println(s);

28、 / use toString(). ,Map接口,Map接口提供了一组“关键字-值”的集合 Map接口的重要实现类有:Hashtable, HashMap, TreeMap, Properties等。其中,Properties是Hashtable的子类(其键值只能是String) HashMap允许使用 null 键和 null 值。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。),Iteration遍历器,存取集合中的元素:ArrayList和Vector的元素与索引有关。可以用位置来取得元素。例如:elementAt(int index),

29、removeElementAt(int index), insertElementAt(Object obj, int index). 除此以外,每个集合(Collection)对象都提供一个遍历器,遍历器对象实现Iterator接口,支持前向遍历,而ListIterator支持双向遍历。Iterator的方法有: public boolean hasNext(); /是否还有下一元素 public Object next(); / 得到下一元素 public remove(); / 移除当前元素 对于“传统的”的Vector和Hashtable类,还提供了另外一种遍历手段Enumeration,该接口基本上被Iterator取代。 只能单向遍历。 Example:TestListAllElements.java,Collections类,该类可用来排序和搜索一个列表(List)。 静态方法:sort() 和 binarySearch()。 具体方法与Arrays的方法类似。,与集合类相关的Java新特性,在JDK 5.0 中,Java借鉴其他语言的优点,增加了许多新特性,包括: 泛型 增强for循环 自动装包与拆包,泛型(Generic),泛型是JDK5.0增加的最重要的Java语言特性。可以解决下面问题: Vector v = new Vector(); v.addEl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论