所谓容器,就是“放东西的东西”。数组可以看作是一种容器,但是数组的元素个数一旦确定就无法改变,这在实际使用中是很大的不足。一般意义上的容器,是指具有自动增长容量能力的存放数据的一种数据结构。在面向对象语言中,这种数据结构本身表达为一个对象。所以才有“放东西的东西”的说法。
Java具有丰富的容器,Java的容器具有丰富的功能和良好的性能。熟悉并能充分有效地利用好容器,是现代程序设计的基本能力。
本章讲的是顺序容器,即放进容器中的对象是按照指定的顺序(放的顺序)排列起来的,而且允许具有相同值的多个对象存在。
```java
import java.util.ArrayList; //ArrayList是一个泛型类(容器)
public class NoteBook {
private ArrayList<String> notes = new ArrayList<String>();
//用来存放 String(<String>)类型数据的ArrayList(容器)
//定义容器的时候要定义两个类型:容器的类型(ArrayList),元素的类型(<String>)
public void add(String s)
{
notes.add(s);
}
public void add(String s, int index)
{
notes.add(index, s); //.add将对应类型的元素s放入容器类型(notes)的index位置
}
public int getSize()
{
return notes.size(); //.size获得notes中存放了多少东西
}
public String getNote(int index)
{
return notes.get(index); //.get获取index位置的东西(从0开始)
}
public void removeNote(int index)
{
notes.remove(index); //.remove删除index位置的元素(从0开始),并返回删除的东西
}
public String[] list()
{
String[] a = new String[notes.size()];
// for(int i=0; i<notes.size(); i++)
// {
// a[i] = notes.get(i);
// }
notes.toArray(a); //.toarray的作用和被注释大代码相同,都是将notes中的每一个元素存入a对应的位置
return a;
}
public static void main(String[] args) {
NoteBook nb = new NoteBook();
nb.add("first");
nb.add("second");
nb.add("third", 2);
System.out.println(nb.getNote(1));
System.out.println(nb.getSize());
nb.removeNote(1);
String[] a = nb.list();
for(String s : a)
{
System.out.println(s);
}
}
}
结果:
second
3
first
third
容器中只能存入对象类型,无法存入值类型(会报错),如果要用值类型(int),可以使用对应的对象类型
原始类型 封装类
boolean Boolean
char Character
byte Byte
short Short
int Integer
long Long
float Float
double Double
容器的类型参数也允许自定义的对象类型:
```java
//主类(主java文件)
import java.util.ArrayList;
public class Database {
private ArrayList<CD> listCD = new ArrayList<CD>();
private ArrayList<DVD> listDVD = new ArrayList<DVD>();
public void add(item item)
{
listItem.add(item);
}
public void add(CD cd)
{
listCD.add(cd);
}
public void add(DVD dvd)
{
listDVD.add(dvd);
}
public void list()
{
for(CD cd : listCD)
{
cd.print();
}
for(DVD dvd : listDVD)
{
dvd.print();
}
}
public static void main(String[] args) {
Database db = new Database();
db.add(new CD("ab", "cd", 4, 60, "..."));
db.add(new CD("ef", "gh", 4, 60, "..."));
db.add(new DVD("hi", "jk", 60, "..."));
db.list();
}
}
//CD类
public class CD{
private String title;
private String artist;
private int numofTracks;
private int playintTime;
private boolean gotIt = false;
private String comment;
public CD(String title, String artist, int numofTracks, int playintTime, String comment) {
super();
this.title = title;
this.artist = artist;
this.numofTracks = numofTracks;
this.playintTime = playintTime;
this.comment = comment;
}
public static void main(String[] args) {
}
public void print() {
System.out.println("CD:" + title + ":" + artist);
}
}
//DVD类
public class DVD{
private String title;
private String director;
private int playintTime;
private boolean gotIt = false;;
private String comment;
public DVD(String title, String director, int playintTime, String comment) {
super();
this.title = title;
this.director = director;
this.playintTime = playintTime;
this.comment = comment;
}
public static void main(String[] args) {
}
public void print() {
System.out.println("DVD:" + title + ":" + director);
}
}
如上代码中,ArrayList使用的对象类型是自定义的,使用for-each循环遍历。