8.1 顺序容器
容器是现代程序设计非常基础而重要的手段。
所谓容器,就是“放东西的东西”。数组可以看作是一种容器,但是数组的元素个数一旦确定就无法改变,这在实际使用中是很大的不足。一般意义上的容器,是指具有自动增长容量能力的存放数据的一种数据结构。在面向对象语言中,这种数据结构本身表达为一个对象。所以才有“放东西的东西”的说法。
Java具有丰富的容器,Java的容器具有丰富的功能和良好的性能。熟悉并能充分有效地利用好容器,是现代程序设计的基本能力。
我们首先学习的是顺序容器,即放进容器中的对象是按照指定的顺序(放的顺序)排列起来的,而且允许具有相同值的多个对象存在。
泛型类 ArrayList<>
ArrayList<String> notes = new ArrayList<String>();
ArrayList是系统类库中的一个容器类。
- 容器类有两个类型:
- 容器的类型
- 元素的类型
记事本源码如下:
package notebook;
import java.util.ArrayList;
/**
* Created by WZZ on 10/31/2016.
*/
public class Notebook {
private ArrayList<String> notes = new ArrayList<String>();
public void add(String s){
notes.add(s);
}
public void add(String s, int location){
notes.add(location, s);
}
public int getSize(){
return notes.size();
}
public String getNote(int index){
return notes.get(index);
}
public void removeNote(int index){
notes.remove(index);
}
public String[] list(){
String[] a = new String[notes.size()];
notes.toArray(a);
return a;
}
public static void main(String[] args) {
Notebook nb = new Notebook();
nb.add("First");
nb.add("Second");
nb.add("Third", 1);
System.out.println(nb.getSize());
System.out.println(nb.getNote(0));
System.out.println(nb.getNote(1));
nb.removeNote(1);
String[] a = nb.list();
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
8.1 对象数组
当数组的元素的类型是类的时候,数组的每一个元素其实只是对象的管理者而不是对象本身。因此,仅仅创建数组并没有创建其中的每一个对象!
String[] a = new String[10];
- 当我们创建了一个String数组后,String数组中的每一个元素都是指向String类对象的管理者而已。默认为"null".
- 对象数组中的每个元素都是对象的管理者而非对象本身
举例:
public static void main(String[] args) {
int[] ia = new int[10];
String[] a = new String[10];
for (int i = 0; i < a.length; i++) {
a[i] = ""+i;
}
// System.out.println(ia[0]+2);
// System.out.println(a[0]+"a");
System.out.println(a[0].length());
String s = null;
System.out.println(s.length());
}
输出结果;
1
Exception in thread "main" java.lang.NullPointerException
at notebook.Notebook.main(Notebook.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
网友评论