520怎么过?难过!
引言:
在商品管理系统的开发和迭代(前面几篇博客中提到过)中,我发现我的商品属性都是用数组储存的,虽然用数组储存可以更加直观准确得遍历和自定义方法体(当时我是这样认为的),但是一个最大的弊端就是————在数组定义的时候它的大小就已经确定了;如果数组大小远远大于商品数,就会造成内存空间的浪费;反之就会造成商品信息没有足够的空间存储。
后面在一次实验课中了解到List这个接口,它有一个实现类ArrayList,ArrayList的特点就是可以动态地调整自己的大小,而且它的子类中有很多已经写好的方法体,只需要用户自己去调用就行。
简介:
ArrayList实现了List这个接口,List接口继承了collection接口,它是声明有序存储对象(可重复)功能的公共接口。List集合中只能存引用数据类型,不能存基础数据类型;当然如果一定要存的话可以用基础数据类型的封装类。这也决定了ArrayList也只能存对象。
按我的理解,ArrayList是把每个对象的地址以数组的方式存储起来,只不过这个数组长度是可变的。
使用:
先写一个自定义类:
public class Test{
private String aString;
private double aDouble;
private int anInt;
public Test(String aString,double aDouble,int anInt){
this.aString=aString;
this.aDouble=aDouble;
this.anInt=anInt;
}
public String getaString() {
return aString;
}
public void setaString(String aString) {
this.aString = aString;
}
public double getaDouble() {
return aDouble;
}
public void setaDouble(double aDouble) {
this.aDouble = aDouble;
}
public int getAnInt() {
return anInt;
}
public void setAnInt(int anInt) {
this.anInt = anInt;
}
}
实例化对象:
这里有两种方法:
直接“Object obj=new Object()”形式
import java.util.ArrayList;
public class Testmain {
public static void main(String[]args){
ArrayList<Test> testArrayList=new ArrayList<>();
}
}
这里要注意ArrayList的构造方法,它是一个泛型类,所以<>中要填入你要存储的数据的类型。
接口的引用指向实现类
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class Testmain {
public static void main(String[]args){
List<Test> testList=new ArrayList<>();
//Collection<Test> testCollection=new ArrayList<>();
//以上两种都行
}
}
我个人推荐“接口的引用指向实现类”的写法,因为接口可以有多个实现类,万一哪天你想换个实现类玩玩,你只需要把new的部分改一下就行了。
方法体的描述和使用
1.add方法
add(Object element)方法是往ArrayList的末尾里存一个元素,它有一个重载方法add(int index,Object element)在指定位置添加一个元素,如果该位置有一个元素就把它替换掉
import java.util.ArrayList;
import java.util.List;
public class Testmain {
public static void main(String[]args){
List<Test> testList=new ArrayList<>();
testList.add(new Test("lihua",10.9,100));
testList.add(1,new Test("wangwu",1.9,110));//add的一个重载方法,根据下标所在位置添加
testList.add(new Test("zhangsan",0.9,500));
System.out.println(testList);
}
}
如果测试一下会发现,这里打印出来的是一组地址,也验证了我前面的猜想,ArrayList存储的实际是一组地址。如果想得到这个类的属性,记得去重写自定义类的toString方法。
@Override
public String toString() {
return "Test{" +
"aString='" + aString + '\'' +
", aDouble=" + aDouble +
", anInt=" + anInt +
'}';
}
然后再打印。
[Test{aString='lihua', aDouble=10.9, anInt=100}, Test{aString='wangwu', aDouble=1.9, anInt=110}, Test{aString='zhangsan', aDouble=0.9, anInt=500}]
2.remove方法
remove(int index)方法是在删除指定位置的元素,它有一个重载方法remove(Object element)删除指定元素
import java.util.ArrayList;
import java.util.List;
public class Testmain {
public static void main(String[]args){
List<Test> testList=new ArrayList<>();
Test a=new Test("lihua",10.9,100);
testList.add(a);
testList.add(new Test("wangwu",1.9,110));
testList.add(new Test("zhangsan",0.9,500));
System.out.println(testList);
testList.remove(1);
testList.remove(a);//remove的重载方法-删除指定对象,参数必须是实例化出来的对象
//testList.remove(new Test("lihua",10.9,100));//错误
//testList.remove(new Test("zhangsan",0.9,500));//错误
System.out.println(testList);
}
}
3.size方法
size()方法返回的是这个集合的大小,我们可以用它验证ArrayList的大小是动态变化的。
import java.util.ArrayList;
import java.util.List;
public class Testmain {
public static void main(String[]args){
List<Test> testList=new ArrayList<>();
testList.add(new Test("张三",10.9,121));
System.out.println(testList.size());
testList.add(new Test("李四",12.9,199));
testList.add(new Test("王五",12.8,88));
System.out.println(testList.size());
testList.remove(1);
System.out.println(testList.size());
}
}
4.get方法
get(int index)方法返回指定位置上的元素
import java.util.ArrayList;
import java.util.List;
public class Testmain {
public static void main(String[]args){
List<Test> testList=new ArrayList<>();
testList.add(new Test("张三",10.9,121));
testList.add(new Test("李四",12.9,199));
testList.add(new Test("王五",12.8,88));
System.out.println(testList.get(1));
}
}
5.set方法
set(int index,Object element)方法用元素element取代位置index上的元素并返回旧元素的值
import java.util.ArrayList;
import java.util.List;
public class Testmain {
public static void main(String[]args){
List<Test> testList=new ArrayList<>();
testList.add(new Test("张三",10.9,121));
testList.add(new Test("李四",12.9,199));
testList.add(new Test("王五",12.8,88));
System.out.println(testList);
System.out.println(testList.set(0, new Test("李华", 11.8, 98)));
System.out.println(testList);
}
}
6.sort方法
这个方法用来给元素排序,但是一个元素有多个属性,根据哪个属性来排呢,所以就需要传入一个比较器接口并实现compare方法进行定制排序(因为ArrayList的元素全是引用类型,所以不存在自然排序),这个过于复杂(需要读源码理解原理,用到lambda表达式简化代码),下篇博客会更加全面的讲到,这里就不多说了。
7.其他方法
以上是一些常见的、经常用到的方法,还有一些不常见的但在一些特殊场景要用到的我就不多介绍了,可以去读其他博主的文章或者查java帮助文档。