一、List特点
1、List长度可变,数组长度不可变
2、List中可以添加任何对象,包括自己定义的类。
3、List是一个接口,不能直接实例化但是List下包含两个重要的类ArrayList和LinkedList,需通过ArrayList或者LinkedList才能实例化 ,
List list=new List(); //这是错误的写法,List本身不是类不能直接被实例化
List list = new ArrayList(); //是正确的写法
ArrayList list =new ArrayList(); //也是正确的写法,但与上面的代码有区别
List list=new ArrayList() 与 ArrayList list=new ArrayList()主要区别在于:ArrayList继承并实现了List接口,在ArrayList内部同时也实现了一些List并不包含的功能,比如ArrayList()有一个trimToSize()方法,这个方法在List中就没有。
问题就在于List有多个实现类,现在你用的是ArrayList,也许哪一天需要换成其它的实现类,如 LinkedList或者Vector等等,你只要改变这一行就行了: List list = new LinkedList(); 其它使用List的代码根本不需要改动。
假设你一开始就用 ArrayList alist = new ArrayList(), 这下就有的改了,特别是如果你使用了 ArrayList特有的方法和属性。
底用LIst list 还是 ArrayList list 还得看实际情况,使用的感觉都一样,只是所支持的个别方法属性有差异。
4、通过List.add(对象)方法可以向集合添加任何类型的数据
5、用List.get(索引序号)方法 从集合中取出数据,这里的索引与数组元素的下标概念相同都是从0开始。取出的值是Object通常需要类型转换。
下面通过实例了解List在Java中的具体使用方法
二、直接向List集合中直接添加值
List list = new ArrayList(); //实例化一个list对像
list.add("a"); //添加值a
list.add("b"); //添加值b
list.add("c"); //添加值c
//通过循环读取list中的数据
for(int i = 0; i < list.size(); i++)
{
System.out.print(list.get(i) + "\n"); // 通过list.get(索引)的方法取出集合中的值
}
//执行结果如下:
a
b
c
我们可以通过list.add()方法无限的向list集合中加入新数据,说明list元素数量是可变的。
三、向List集合中添加自定义类的实例
//文件Java1.java相关代码:
import java.util.ArrayList;
import java.util.List;
public class Java1
{
public static void main(String[] args)
{
List userList = new ArrayList(); //初始化List集合对象 userList
User user1 = new User(); //实例化第1个User对象user1
user1.userName = "小明"; //user1账号为"小明"
user1.userPass = "123456"; //user1密码为"123456"
User user2 = new User(); //实例化第2个User对象user2
user2.userName = "小强"; //user2账号为"小强"
user2.userPass = "abcd"; //user2密码为"abcd"
userList.add(user1); //把user1添加到集合中
userList.add(user2); //把user2添加到集合中
//通过循环读取集合中的用户数据
for(int i = 0; i < userList.size(); i++)
{
User user = (User)userList.get(i);
/*因为集合的每个元素存储的是User类实例,
* 需要通过(User)对userList.get(i)取出的对象进行强制类型转换,
* 之后才能调用相应的userName和userPass*/
System.out.print("账号:" + user.userName + " , 密码:" + user.userPass + "\n");
}
}
//自定义类User, 包含两个成员变量 userName和userPass,分别代表"账号"和"密码"
static class User
{
String userName = "";
String userPass = "";
}
}
//执行结果如下:
账号:小明 , 密码:123456
账号:小强 , 密码:abcd
向List集合中加入自定义类实例的方法在Java开发中使用频率非常高,在每行数据包含多个字段参数的情况下非常适用,例如从数据库中读取一张包含多个字段的表就可以通过上面的方法实现。
四、利用泛型参数初始化List
上面的例子我们虽然自定义了User类,但从集合取出的元素值仍旧是Object类型需要进行类型转换才能正常使用,其实在List初始化时通过泛型参数就能解决这个问题。
泛型的简单解释
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。 Java 泛型的参数只可以代表类,不能代表个别对象。
我们把上面的例子稍微修改一下,
//泛型集合初始化
List<User> userList = new ArrayList<User>(); //本例中的泛型参数就是User这个类,写在一对尖括号中
//中间代码无变化... 此处省略
//最后在循环中的读取方法如下:
for(int i = 0; i < userList.size(); i++)
{
String userName = userList.get(i).userName;
String userPass = userList.get(i).userPass;
System.out.print("账号:" + userName + " , 密码:" + userPass + "\n");
}
通过代码可能看到,读取userList集合时直接使用userList.get(i)的方式就能调用userName和userPass这两个User类的成员变量,无需再次对userList.get(i)进行类型转换。因为此时通过userList.get(i)得到的值已经不是Object类型,而是我们自己定义的User类型了。通过使用泛型,代码的可读性与可维护性更高,无需繁琐的类型转换。
五、从List集合中删除数据
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.remove(0); //通过索引,删除索引为0的元素
list.remove("d"); //通过值,删除值为"d"的元素
for(int i = 0; i < list.size(); i++)
{
System.out.print(list.get(i) + "\n");
}
//执行结果如下:
b
c
通过list.remove()方法可以删除集合中指定的元素,其中remove()方法可传入两种参数,分别是"索引(与数组中的元素下标相同最小都是从0开始)" 和 "值(Object类型)"。如本例分别通过索引0删除了字母"a",通过值"d"删除了字母"d" 最后整合集合中只剩下"a"和"b"了。通过list.remove()再次说明List是一种长度可变的数据集合。
六、Java List常用方法
add(Object object) 在集合末尾加入元素 参数 object : 要添加的值(Object类型) 例如 list.add("abc"); 向原集合末尾添加新元素值为"abc" |
add(int index, Object object) 在集合中指定位置插入指定元素。如果插入位置本身已经元素那么从这个位置开始(包括原元素)自动向后移位,对应的索引依次加1 参数 index: 索引 , object: 要添加的值(Object类型) 例如集合中已有"a","b","c"三个元素索引分别对应 0 , 1 ,2 ,这时在第1个位置加入"d" ,list.add(0, "d"); 这时集合就变成了"d","a","b","c", 原"a,b, c"对应的索引就从"0 ,1, 2" 就变成了 "1 ,2, 3" |
remove(int index) 从集合中删除指定位置的元素 参数 index: 目标元素的索引(最小从0开始) 例如 list.remove(1), 删除索引为1的元素 |
remove(Object object) 从集合中删除指定值的元素 参数 object: 目标元素的值 例如: list.remove("hello"); 表示从集合中删除值为"hello"的元素, 如果多个元素具有相同的值则优先删除索引小的元素 |
size() 返回当前集合列表的元素总数量, 返回值: int类型 |
List 小结:
通过上面的几个小例子我们已经学会使用List的基本方法了,List这种数据结构的功能远不止上述这些内容,还有很多高级功能没有介绍,例如List排序(在后面的章节会介绍)。如果觉得太多概念使自己迷茫不防把List理解成一个功能更强大的数组,只要记得list是可变长度的而数组是固定长度的即可。同时支持泛型是List数据结构的一大特点,这个是普通数组不具备的优势。最后建议初学者不要滥用list,已知元素个数不变的情况下最好用数组,虽然List功能强大但很多都是建立在牺牲性能的前提下实现的。
--转自
该贴由koei123转至本版2015-6-1 14:53:25