形成天才的决定因素应该是勤奋。——郭沫若
本讲内容:List结构的集合类:ArrayList类、LinkedList类、Vector类、Stack类
一、ArrayList是一个可变长的数组实现,读取效率很高,是最常用的集合类型。
1、ArrayList的创建
在Java5版本之前我们使用:List list = new ArrayList();
在Java5版本之后,我们使用带泛型的写法:List<String> list = new ArrayList<String>();
上面的代码定义了一个只允许保存字符串的列表,尖括号括住的类型就是参数类型,也成泛型。带泛型的写法给了我们一个类型安全的集合。
2、基本数据类型的的自动装箱:
我们知道集合中存放的是对象,而不能是基本数据类型,在Java5之后可以使用自动装箱功能,更方便的导入基本数据类型。
下面我们通过二个例子感受一下
例一:
<span style="font-size:18px;">import java.util.*;
public class T {
public static void main(String[] args) {
ArrayList<Student> al=new ArrayList<Student>();
System.out.println("大小为"+al.size());
Student stu1=new Student("惠琳",1,90);
Student stu2=new Student("丹妹",2,100);
Student stu3=new Student("开妥",3,60);
al.add(stu1);
al.add(stu2);
al.add(stu3);
System.out.println("大小为"+al.size());
al.remove(2);
System.out.println("大小为"+al.size());
Student stu4=new Student("开权", 4, 70);
al.add(stu4);
for(int i=0;i<al.size();i++){
Student b=al.get(i);
System.out.println("第"+(i+1)+"学生的姓名是"+b.getName());
}
}
}
class Student{
private String name;
private int on;
private int score;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getOn() {
return on;
}
public void setOn(int on) {
this.on = on;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public Student(String name,int on,int score) {
this.name=name;
this.on=on;
this.score=score;
}
}</span>
<span style="font-size:18px;">大小为0
大小为3
大小为2
第1学生的姓名是惠琳
第2学生的姓名是丹妹
第3学生的姓名是开权</span>
例二:一个学生管理系统(同一个包下建三个java文件)
主文件
<span style="font-size:18px;">package a;
import java.util.*;
public class Text {
public static void main(String[] args) {
StudentGL x=new StudentGL();//执行构造方法
Scanner in=new Scanner(System.in);
while(true){
System.out.println("请按提示选择以下功能");
System.out.println("添加学生请按1");
System.out.println("查找学生信息请按2");
System.out.println("修改学生分数请按3");
System.out.println("删除学生请按4");
System.out.println("退出请按0");
String a=in.next();
if(a.equals("1")){
System.out.println("请输入学生编号");
String on=in.next();
System.out.println("请输入学生名称");
String name=in.next();
System.out.println("请输入学生分数");
String score=in.next();
Student stu=new Student(on,name,score);
x.addStu(stu);
}else if(a.equals("2")){
System.out.println("请输入学生编号");
String on=in.next();
x.stuxx(on);
}else if(a.equals("3")){
System.out.println("请输入学生编号");
String on=in.next();
System.out.println("请输入新的分数");
String score=in.next();
x.stufs(on, score);
}else if(a.equals("4")){
System.out.println("请输入学生编号");
String on=in.next();
x.studel(on);
}else if(a.equals("0")){
System.out.println("感谢你的使用,再见");
System.exit(0);//正常退出整个程序(-1非正常)
}else{
System.out.println("输入有误");
}
}
}
}
</span>
<span style="font-size:18px;">package a;
public class Student {
private String on;
private String name;
private String score;
public String getOn() {
return on;
}
public void setOn(String on) {
this.on = on;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getScore() {
return score;
}
public void setScore(String score) {
this.score = score;
}
public Student(String on,String name,String score) {
this.on=on;
this.name=name;
this.score=score;
}
}
</span>
<span style="font-size:18px;">package a;
import java.util.*;
public class StudentGL {
private ArrayList al=null;
public StudentGL() {
al=new ArrayList();
}
public void addStu(Student stu) {
al.add(stu);
System.out.println("添加新学生成功!");
}
public void stuxx(String on) {
int i;
for(i=0;i<al.size();i++){
Student stu=(Student) al.get(i);
if(stu.getOn().equals(on)){
System.out.println("该学生的信息为:");
System.out.println("学生编号:"+on);
System.out.println("学生名称:"+stu.getName());
System.out.println("学生分数:"+stu.getScore());
break;
}
}
if(i==al.size()){
System.out.println("对不起,无此学生");
}
}
public void stufs(String on,String score) {
int i;
for(i=0;i<al.size();i++){
Student stu=(Student) al.get(i);
if(stu.getOn().equals(on)){
stu.setScore(score);
System.out.println("修改学生价格成功");
break;
}
}
if(i==al.size()){
System.out.println("对不起,没有找到相应的学生,修改失败");
}
}
public void studel(String on) {
int i;
if(al.size()==0){
System.out.println("对不起,系统中已没有任何学生");
}
for(i=0;i<al.size();i++){
Student stu=(Student) al.get(i);
if(stu.getOn().equals(on)){
al.remove(i);
System.out.println("删除学生成功!");
break;
}
}
if((i==al.size())&&(al.size()!=0)){
System.out.println("对不起,没有该学生");
}
}
}
</span>
二、LinkedList类、Vector类、Stack类
1、LinkedList、Vector、Stack与ArrayList基本相同
2、LinkedList类特有的方法addFirst()、addLast()增加对象先进后出。
3、Vector与ArrayList的区别:
Vector与ArrayList都是java的集合类,都可以用来存放java对象,这也是它们的相同点,但它们也有区别:
a、同步性:
Vector是同步的,这个类中的一些方法保证了Vector中的对象是线程安全的,而ArrayList是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程集合那么使用ArrayList是一个很好的的选择,这样可以避免由于同步带来的不必要的性能开销。从而提高效率。
b、数据增长:
从内部实现机制来讲Vector与ArrayList都是使用数组来控制集合中的对象,当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来的一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合保存大量的数据那么使用Vector更好,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
本讲就到这里,Take your time and enjoy it