Java笔记(六) 对象群体的组织

在一般的应用系统中,同一类型的对象通常有很多,需要对这些对象进行有效的组织。本章主要介绍组织群体对象的常用数据结构、算法及面向对象的实现。
在Java中,Collection及Map是两个接口,以这两个接口为根的层次结构中有很多类,都可以用来组织群体对象。本章将概要介绍Java的集合框架。
1.对象数组
(1)用数组存储对象
数组元素可以是任何类型(只要所有的元素具有相同的类型),除了基本数据类型,数组的元素也可以是类的对象,这样的数组称为对象数组,在这种情况下,数组的每一个元素都是一个对象的引用。例如:BankAccount[] account; BankAccount account[];
与C、C++不同。Java在数组的声明中并不为数组元素分配内存,因此[]中不需要指明数组中元素的个数,即数组长度。
对象数组的初始化也分为静态初始化和动态初始化两种。
静态初始化:在声明和定义数组的同时对数组元素进行初始化。
动态初始化:使用运算符new为数组分配空间(对于基本类型的数组:type[] arrayName=new type[];对于对象数组,使用运算符new只是为数组本身分配空间,并没有对数组的元素进行初始化:type arrayName[]=new type[arraySize]; arrayName[0]=new type(paramList);arrayName[1]=new type(paramList);……arrayName[n-1]=new type(paramList);).
引用元素arrayName[index] 0<=index< length
Java对数组元素要进行越界检查以及保证安全性。同时,对于每个数组都有一个属性length指明它的长度(即数组元素的个数)。
a.查找 b.增加 c.删除
(2).对数组元素进行排序
·选择排序
选择排序的基本思想是先在未排序排序列中选一个最小元素,作为已排序子序列,然后再重复地从排序子序列中选取一个最小元素,把它加到已经排序的序列中,作为已排序子序列的最后一个元素,直到把未排序子序列中的元素处理完为止。
·插入排序
插入排序是将带排序的数据按一定的规则逐一插入到已排序列中的合适位置处,直到将全部数据都插入为止。插入的规则不同,便形成了不同的插入排序方法。其中,算法最简单的为直接插入排序方法。
直接插入排序方法先以未排序的第一个元素作为已排序子序列,然后从原来的第二个元素起,将各元素逐一插入到已排序子序列的合适位置,直到把全部元素都插入为止。
·在已排序的数组中查找
在未排序的数组中进行查找,只能使用顺序查找方法。对于已排序的数组,也可以用顺序查找方法,但对算法进行一定的改进,使其效率有所提高。
2.二维数组
数组元素的类型不仅可以是基本数据类型个、类的对象。前面介绍了一维数组,如果一维数组的元素又是一维数组,则称此数组为二维数组,二维数组常用来表示二维表。
二维数组的声明方式如下:type arrayName[][]; 或 type[][] arrayName;
与一维数组一样,这时还没有给数组分配空间,对于对象数组,好需要给数组元素分配空间。(静态初始化:在声明和定义数组的同时为数组分配空间;动态初始化:两种方法:a.直接为每一维分配空间:type arrayName[][]=new type[arraylength][arraylength];b.从最高维开始,分别为每一维分配空间)。
3.集合(Collection、Map)
数组是Java提供的随机访问对象序列的最有效方法。(优点:简单的线性序列,访问元素的数度较快;缺点:大小自创建以后就固定了,在数组对象的整个生存期内其大小不可改变)
集合类:存储不同类型的数据,或动态改变其大小。集合类允许将很多对象收集到一起,并作为一个对象进行存储。
在Java2中有很多与集合有关的接口及类,他们被组织在以Collention及Map接口为根的层次结构中,称为集合框架。
(1)Java集合框架
Java集合框架提供了一些现成的数据结构可供使用。集合框架是为表示和操作集合而规定的一种统一的标准体系结构,包含三大块内容:(对外的接口、接口的实现、对集合运算的算法)。
·接口是表示集合的抽象数据类型,使集合的操作为表示分开。Java的集合接口具有层次结构。
·实现是指实现集合接口的Java类,是可重用的数据结构。
·算法是指执行运算的方法,算法是可重用的功能。
从Java5开始,集合框架全部采用泛型实现。
a.接口
集合框架接口声明了各种集合类型执行的一般操作。
Java集合框架接口的基本结构:
Collention-|-Set-SortedSet
|-List
Map-SortedMap
(a)Collention接口
Collection接口及其层次:(4个接口、4个抽象类、6个具体类),都在java.util包中,Collention声明时可以使用一个参数类型,即Collenction.
Collection |-List->AbstractList->AbstractSequentitalList->LinkedList
| ->Vector->Stack
| ->ArrayList
|
|-AbstracCollection
|
|-Set->SortedSet
->AbstractSet->HashSet
->TreeSet(SortedSet)
Collenction接口中声明了许多抽象方法:
查询方法:(int size(); boolean contains(Object obj); boolean containsAll(Collection c);)
修改方法:(boolean add(E obj);//将给定的参数对象增加到集合对象中 boolean addAll(Collection< ?extends E> c); boolean remove(Object obj); boolean removeAll(Collection< ?> c);//在接受者集合中保留参数集合中的所有元素,其他元素都删除 void clear();)
Collection的两个子接口为列表(List)及集合(Set)。
(b)Set接口
Set接口是一个不含重复元素的集合,是数学中“集合”的抽象。
实现集合(Set)接口的两个主要类是哈希集合(HashSet)及树集合(TreeSet),Set接口在声明时也可以带一个参数,即Set.
(c)List接口
实现接口List的类中的元素是有顺序的,可以包含重复元素,且每一个元素都有一个index值(从0开始)标明元素在列表中的位置。
有四个主要的类实现List集合,他们是向量(Vector、ArrayList),链表(LinkedList)及栈(Stack),List接口在声明时也可以带一个参数,即List.
(d)Map接口
Map是一个从关键字到值的映射对象,Map中不能有重复的关键字,每个关键字最多能映射到一个值,Map接口在声明时,可以带有两个参数,即Map< K,V>,其中K为键,V为值,键值对。
(e)SortedSet接口
SortedSet是一种特殊的Set,其中的元素是升序排列的,并且还增加了与次序相关的操作,SortedSet接口在声明时也可以带一个参数,即SortedSet< E>.
(f)SortedMap接口
SortedMap是一种特殊的Map,其关键字是升序排列的,它是与SortedSet对等的Map,SortedMap接口在声明时也可以带一个参数,即SortedMap< K,V>.
b.实现
在JDK中,除Collection以外,每个接口都有实现,而Collection没有直接的实现,主要的实现有HashSet、ArrayList和HashMap。
SortedSet的实现是TreeSet,SortedMap的实现是TreeMap。
c.算法
所有这些算法的形式都是静态方法,其第一个参数都是算法操作的集合对象。Java平台提供的大多数算法都是用于操作List对象,有两个(min和max)可用于任意对象。
(a)排序算法sort
排序算法对List重新排序。
两种形式:(简单形式只将元素按照自然次序排列,第二种形式需要一个附加的Comparator对象作为参数,用于规定比较规则)。
(b)洗牌算法shuffle
算法shuffle的作用与排序算法恰好相反,他打乱List中的任何次序,使其随机排列。
(c)常规数据处理算法
集合类提供三种常规数据处理算法(1.reverse:将一个List中的元素反向排列。2.fill:用指定的值覆写List中的每一个元素。3.copy:接受两个参数,目标List和源List,将源中的元素复制到目标List,目标List必须至少与源一样长,如果更长,则多余的部分内容不受影响。)。
(d)查找算法binarySearch
binarySearch算法二分法在一个有序的List查找指定元素。
算法有两种形式:(假定List提供按自然顺序升序排列的,第二种,增加一个Comparator对象,表示比较规则,并假定按照这种规则排序的)。
(e)寻找最值
min和max算法返回指定集合中的最小值和最大值。
算法有两种形式:(假定List提供按自然顺序升序排列的,第二种,增加一个Comparator对象,表示比较规则,并假定按照这种规则排序的)。
这两个算法是Java平台提供的仅有的用于任何集合对象的方法。
d.数组使用方法
Java集合框架中提供了一套专门用于操作数组的使用方法,作为静态方法存在与Arrays类中,此外Arrays类中还包括可以将数组视为列表(List)的静态工厂。
Arrays类中常用方法:(equal(type[] a,type[] b); Arrays.fill(type[] a,type val); sort(type[] a); binarySearch(); Arrays.asList(Object[] a);)
(2)向量(Vector、ArrayList)
Vector及ArrayList都是实现了Collection接口的具体类。
Vector及ArrayList类的功能:(能够存储任意对象,不能存储基本类型的数据,其容量能够根据空间需要自动扩充,增加元素方法的效率较高,除非空间已满,在这种情况下,在增加之前需要花费一定的时间先扩充容量。)
ArrayList中声明的方法基本上与Vector相同,除了elements()方法不能应用于ArrayList对象,其他方法都可以应用于ArrayList对象。
(3)Enumeration及Iterator类
使用Enumeration或Iterator类会使遍历方法得到简化。这两个类对象提取每一个元素,并提供了用于遍历元素的方法。
Enumeration类不能用于ArrayList对象,而Itrerator类既可以用于ArrayList对象,也可以用于Vector对象。
Enumeration类提供的两个实例方法:(hasMoreElements()判断是否还有剩余元素;nextElement()取的下一个元素。)
如果需要在遍历的过程中去除对象,就不要使用Enumeration类,为解决这个问题,可以使用Iterator类,他是一个遍历集合元素的工具,但与Enumeration不同的是,它具有从正在遍历的集合中去除对象的能力。
Iterator的三个实例方法:(hasNext();//判断是否还有元素 next();//取得下一个元素 remove();//去除一个元素,注意是从集合中去除最后调用的next()返回的元素,而不是从Iterator类中去除)
(4)增强for循环遍历集合
除了Enumeration及Iterator类外,可以使用增强for循环来遍历集合类对象中的每一个元素,增强for循环的缺点是无法像Iterator一样在遍历中删除对象。
(5)Map接口及其类层次
以Map接口为根的集合用于存储“键-值”对,其中每个关键字映射到一个值。Map接口声明时可以带有两个参数类型,即Map< K,V>,以Map接口为根的层次结构:
Map接口|-SortedMap接口-TreeMap
|-HashTable
|-Attributes
|-RenderingHints
|-AbstractMap-(TreeMap)
-IdentityHashMap
-WeakHashMap
-HashMap
Map接口的两个主要实现类HashTable及HashMap
(6)哈希表(HashTable、HashMap)
哈希表也成为散列表,是用来存储群体对象的集合类结构,这里介绍两个常用的类:HashTable及HashMap类。
哈希表存储对象的方式与前面所讲的Vector及ArrayList的不同:前面所讲的数组,Vector和ArrayList都可以存储对象,但对象的存储位置是随机的,即对象本身与其存储位置之间没有必然的联系,而哈希表的对象存储位置和对象的关键属性k之间建立一个特定的对应关系f,是每一个对象与一个唯一的存储位置相对应。
Java中使用HashTable(HashMap)来实现哈希表,哈希表相关的概念:(容量(capacity)、关键字/键、哈希码、哈希函数、项、装填因子)
·项:HashTable中的每一项都有两个域–关键字域与值域。
·装填因子:哈希表的装填因子定义为(表中填入的项数)/(表的容量)。
HashMap类与HashTable类很相似,只是HashTable类不允许有空的关键字,而HashMap类允许。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值