1、第7章 对象群体的组织,郑莉,JAVA语言程序设计,本讲内容,对象数组 容器类,数组,在Java提供的存储及随机访问对象序列的各种方法中,数组是效率最高的一种。 类型检查 边界检查 优点 数组知道其元素的类型 编译时的类型检查 大小已知 代价: 数组对象的大小是固定的,而且不可在那个数组对象的“存在时间”内发生改变。,数组类,有四个基本的方法 equals( ) fill( ) sort( ) binarySearch( ) asList( ),比较数组,equals(type a, type b) 系列方法是做两个数组的比较的,相等返回true。 注意 比较两个float数组的时候,对每个元
2、素比较,不是用=,而是用new Float(f1).equals(new Float(f2)。 这个方法认为NaN等于它本身,0.0f不等于-0.0f。对于double数组也是一样的。 对于Object数组呢,是用的 (e1=null ? e2=null : e1.equals(e2)。,填充数组,Arrays.fill(type a, type val) 给数组填充。就是简单的把一个数组全部或者某段数据填成一个特殊的值。,数组元素排序、查找,sort(type a) 对数组排序 binarySearch( ) 查找,转换,用Arrays.asList(Object a) 实现数组到Array
3、List的转换,数组的填充和复制,/ex7_1 import java.util.*; public class CopyingArrays public static void main(String args) int i = new int25;int j = new int25;Arrays.fill(i, 47);Arrays.fill(j, 99);,System.arraycopy(i, 0, j, 0, i.length);int k = new int10;Arrays.fill(k, 103);System.arraycopy(i, 0, k, 0, k.length);A
4、rrays.fill(k, 103);System.arraycopy(k, 0, i, 0, k.length);Integer u = new Integer10;Integer v = new Integer5;Arrays.fill(u, new Integer(47);Arrays.fill(v, new Integer(99);System.arraycopy(v, 0, u, u.length/2, v.length); ,数组的比较,/ex7_2 import java.util.*; public class ComparingArrays public static voi
5、d main(String args) int a1 = new int10; int a2 = new int10;Arrays.fill(a1, 47); Arrays.fill(a2, 47);System.out.println(Arrays.equals(a1, a2);/truea23 = 11;System.out.println(Arrays.equals(a1, a2);/falseString s1 = new String5;Arrays.fill(s1, “Hi“);String s2 = “Hi“, “Hi“, “Hi“, “Hi“, “Hi“;System.out.
6、println(Arrays.equals(s1, s2);/true ,数组元素的比较,/ex7_3 import java.util.*; public class CompType implements Comparable /实现Comparable接口,自定义compareTo方法int i;int j;public CompType(int n1, int n2) i = n1;j = n2;,public String toString() return “i = “ + i + “, j = “ + j + “; public int compareTo(Object rv)
7、int rvi = (CompType)rv).i;return (i rvi ? -1 : (i = rvi ? 0 : 1);,public static void main(String args) CompType a = new CompType(1,2),new CompType(2,1),new CompType(-5,6),new CompType(21,4),new CompType(-6,3),new CompType(12,45),new CompType(43,1),new CompType(-76,5),new CompType(44,33),new CompType
8、(22,11);Arrays.sort(a); ,数组排序,/ex7_4 import java.util.*; public class StringSorting public static void main(String args) String sa = “Orange“,“apple“,“pear“,“Lemon“,“peanut“;Arrays.sort(sa); ,字符串的比较,/ex7_5 import java.util.*; public class AlphabeticComparator implements Comparator public int compare
9、(Object o1, Object o2) String s1 = (String)o1;String s2 = (String)o2;return s1.toLowerCase().compareTo(s2.toLowerCase(); ,按字母次序排序,import java.util.*; public class AlphabeticSorting public static void main(String args) String sa = “Orange“,“apple“,“pear“,“Lemon“,“peanut“;Arrays.sort(sa, new Alphabeti
10、cComparator(); ,在排序数组中查找,binarySearch(byte a, byte key) binarySearch(char a, char key) binarySearch(short a, short key) binarySearch(int a, int key) binarySearch(long a, long key) binarySearch(float a, float key) binarySearch(double a, double key) binarySearch(Object a, Object key) binarySearch(Obje
11、ct a, Object key, Comparator c),Java集合框架,集合 把具有相同性质的一类东西,汇聚成一个整体,称为集合。 集合框架 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。,Java2的集合框架:容器类库,Java2的集合框架:容器类库,Collection接口提供了一组操作成批对象的方法 List接口对Collection进行了简单的扩充,它的具体实现类常用的有 ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快 LinkedList的内部
12、实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。 Set接口也是Collection的一种扩展, 在Set中的对象元素不能重复。它的常用具体实现有HashSet和TreeSet类。 SortedSet,它保持元素的有序顺序 Map接口不是Collection接口的继承。Map接口用于维护键/值对(key/value pairs)。该接口描述了从不重复的键到值的映射。,容器的实现,实现 Set HashSet (实现快速的 set) TreeSet (实现有序的 set) 实现 List ArrayList LinkedList 实现 Map HashMap (实现快速 Map) Tr
13、eeMap (实现有序 Map),多态算法 Collections类的静态方法,单元素添加、删除操作 排序 移动 数据处理 翻转 填充 复制 查找 求极值 最小值 最大值 Collection转换为Object数组,迭代器,iterator( ) 从容器得到一个Iterator next( ) 取得序列中的下一个元素 hasNext( ) 检查序列中是否还有其他元素 remove( ) 移去迭代器最近传回的元素,举例,ArrayList演示 CollectionTest.java LinkedList演示 linkListTest.java,自定义链表类,myList.java EmptyListException.java myListTest.java,Java 1.0/1.1 的容器,在Java2之前,Java是没有完整的集合框架的。它只有一些简单的可以自扩展的容器类。 Vector Hashtable,作业,编写一个程序,依次将25个0-100之间的整数插入到一个链表中,计算出它们的总合,并求出它们的平均值。 编写一个程序,读如一系列名字,并将它们存储在linkedlist中。不能存储重复的名字,并允许用户查找一个名字。(不区分英文字母大小写),