Thinking in java-11

来源:互联网 发布:python input函数 编辑:程序博客网 时间:2024/06/10 01:35

/*************************************************

function:java language Technology
author  :chinayaosir   QQ:44633197 
blog    :http://blog.csdn.net/chinayaosir
note    :禁止其它网站转载此文章

**************************************************/

第11章 对象的集合(数据结构和算法类库介绍)
11.1数组
11.2容器简介
11.3容器缺点
11.4迭代器
11.5容器分类
11.6Collection
11.7List
11.8set
11.9Map
11.10引用
11.12选择接口
11.13List排序与查找
11.14实用方法
**********************************************************************
11.1数组
数组是一种效率最高的存储和随机访问对象的序列对象,大小被固定.
11.1.1数组是第一级对象
数组标识符其实只是一个引用,如同C++中的数组名一样,
Length是数组对象的一个成员,下标[]是访问数组的唯一方式.
11.1.2充许返回一个数组
只要你需要数组,它就会一直存在,当你使用完之后,垃圾回收器会清理它
代码例子:
public static String[] flavorSet(int n){
 String[] results=new String[n];
 //...
 
 return results; //返回一个数组
}

11.1.3Arrays类
import java.util.Arrays;
toString()转换为字符串
Arrays提供了数组的实用功能
equals()判断两个数组是否相等
fill()填充数据
sort()排序方法
binarySearch()二分查找法
asList()数组转为list
System.arraycopy()快速复制数组

**********************************************************************
11.2容器简介
容器类对于新的开发是最强大的工具之一,可以提高编程能力.
由于java1.0/1.1容器非常少,在java2.0扩展了大量的容器.

11.2.1容器的打印
打印容器非常方便,见如下代码
import java.util.*;
import java.io.*;
public class InputFile {
 static Collection fill(Collection c){
  c.add("dog");
  c.add("cat");
  return c;
 }
 static Map fill(Map m){
  m.put("dog", "bosoc");
  m.put("dog", "bill");
  m.put("dog", "jame");
  return m;
 } 
 public static void main(String[]args){
  System.out.println(fill(new HashMap())); 
  System.out.println(fill(new HashSet()));
 }
}
运行结果:
{dog=jame}
[cat, dog]

11.2.2容器的填充
容器的填充fill方法不是非常好用.fill只对List有用,对Map,Set不起作用.

11.3容器缺点
JAVA容器有一个缺点,在把对象加入容器的时候,就丢失了类型信息.
所以在读取和存入容器时,都得自己设置类型转换功能.

**********************************************************************
11.4迭代器
迭代器是一个对象,它的工作是遍历并选择序列中的对象,以方便客户程序人员.
iterator四个主要方法:
iterator的工作方式和C++的iterator差不多.
next()第一次调用返回第一个对象,其它时候是下一个元素.
hasNext()是否还有下一个元素
remove()将返回的元素删除

//file name Iterator.java
//迭代器接口
package dsa.datastruct;
public interface Iterator {
 public void first();//第一个元素
 public void next();//下一个元素
 public boolean isDone();//检查是否还有剩余的元素
 public Object currentItem();//返回当前元素
}

//file name LinkedListIterator.java
//链式迭代器实现
package dsa.datastruct;
import dsa.datastruct.*;

public class LinkedListIterator implements Iterator {
 private LinkedList list;//链式表
 private Node current; //当前结点
 //0.构造器
 public LinkedListIterator(LinkedList llist){
  this.list=llist;
  if (list.isEmpty())  //若列表为空
   current=null;  //则当前元素置空
  else
   current=list.first();//否则从第一个元素开始
 } 
 //1.移动到第一个元素
 public void first() {
  if(list.isEmpty())
   current=null;
  else
   current=list.first();
 }
 //2.移动到下一个元素
 public void next() throws OutOfBoundaryException{
  if (isDone())
   throw new OutOfBoundaryException("错误:已经没有元素。");
  if (current==list.last())
   current = null;
  else
   current = list.getNext(current);
 }
 //3.检查迭代器中是否还有剩余的元素
 public boolean isDone() {
  return current==null;
 }
 //4.返回当前元素
 public Object currentItem() throws OutOfBoundaryException{
  if (isDone()) throw new OutOfBoundaryException("错误:已经没有元素。");
  return current.getData();
 }
}


**********************************************************************
11.5容器分类
一级容器:linked链式结构,hash()散列函数,array数组,tree树,iterator迭代器
二级容器:list(表),set(集合),map(映射),maptree,settree(树)

**********************************************************************
11.6Collection容器类

Collection ADT操作方法
boolean add(Object)
boolean addAll(Collection)
boolean contains(Object)
boolean containsAll(Collection)
boolean isEmpty()
int  size()
Object[] toAarray()
Object[]
toArray(Object[]a)
Iterator iterator()
void clear()
boolean remove(Object)
boolean removeAll(Collection)
boolean retainAll(Collection)


**********************************************************************
11.7List
List(interface):表的接口
ArrayList:数组结构组装成表
LinkedList:链式结构组装成表

11.7.1 List(interface):表的接口
//file name:List.java
//list接口
package dsa.datastruct;
import dsa.datastruct.OutOfBoundaryException;
public interface List {
 //1.返回数据元素的个数。
 public int getSize();
 //2.判断是否为空表
 public boolean isEmpty();
 //3.判断是否包含数据元素e
 public boolean contains(Object e);
 //4.返回数据元素e在线性表中的序号
 public int indexOf(Object e);
 //5.1将数据元素e插入到线性表中i号位置
 public void insert(int i, Object e) throws OutOfBoundaryException;
 //5.2将数据元素e插入到元素obj之前
 public boolean insertBefore(Object obj, Object e);
 //5.3将数据元素e插入到元素obj之后
 public boolean insertAfter(Object obj, Object e);
 //6.1删除线性表中序号为i的元素,并返回之
 public Object remove(int i) throws OutOfBoundaryException; 
 //6.2删除线性表中第一个与e相同的元素
 public boolean remove(Object e);
 //7.替换线性表中序号为i的数据元素为e,返回原数据元素
 public Object replace(int i, Object e) throws OutOfBoundaryException;
 //8.返回线性表中序号为i的数据元素
 public Object get(int i) throws OutOfBoundaryException;
}

详情见我的BLOG文章http://blog.csdn.net/chinayaosir/archive/2008/09/01/2860602.aspx
它们完整的模仿了LIST,并分别用数组和链式结构实现了LIST接口定义功能.
**********************************************************************
11.7.2 stack堆栈
分别用数组和链式结构模仿stack
详情见我的BLOG文章
http://blog.csdn.net/chinayaosir/archive/2008/09/01/2860976.aspx

**********************************************************************
11.8Set
Set(interface)接口
HashSet实现
TreeSet实现
LinkedHashSet实现
省略...
**********************************************************************
11.9Map
Map(iterface)接口
HashMap实现
LinkedHashMap实现
TreeMap实现
SortedMap实现
WeakHashMap实现
IdentityHashMap实现
Hash()哈希函数
省略...
**********************************************************************
11.10持有引用
java.lang.ref类为包含了一组类,这些类为垃圾回收提供了更大的灵活性.

**********************************************************************
11.12选择接口

实际上有三种容器Map,List,Set,但是每种接口都有N种实现版本.
如何根据需要去选择何种容器,首先得了解它们的特征,优缺点.

**********************************************************************

11.13List排序与查找
CollectionList.sort(list)

11.14实用方法
Collection还有许多实用的方法:
max(Collection)
min(Collection)
max(Collection,comparator)
min(Collection,comparator)
reverse()
swap(list,list,int n)
copy(list dest,list src)
fill(list,Object)

**********************************************************************