五,Java集合类(3)——List接口及其实现类
2016-09-13 11:28
495 查看
1 List集合
List集合代表一个元素有序,可重复的集合,集合中每个元素都有其对应的顺序索引。package com.practice.collection; import java.util.ArrayList; import java.util.List; public class ListTest { public static void main(String[] args) { List books = new ArrayList(); books.add(new String("Node.js从入门到精通")); books.add(new String("JavaScript从入门到精通")); books.add(new String("Java从入门到精通")); System.out.println(books); books.add(new String("Java Web从入门到精通")); for(int i = 0; i < books.size(); i ++){ System.out.println(books.get(i)); } books.remove(1); System.out.println(books); System.out.println(books.indexOf(new String("Java Web从入门到精通"))); books.set(1, new String("Oracle 11g从入门到精通")); System.out.println(books); System.out.println(books.subList(2, 3)); } }
以上的红色代码
books.indexOf(new String("Java Web从入门到精通"))该对象是通过new的方法构造出来的,跟原来在List中的不是同一个一元素,但是结果打印出来的还是个正确的结果。既然是new出来的对象,在堆内存不是不一样的吗?为什么返回的还是在List中的元素的索引。原因是List判断两个对象相等只要通过equals()方法返回true即可。
例如以下的代码:
package com.practice.collection; import java.util.ArrayList; import java.util.List; class Test { @Override public boolean equals(Object obj) { // TODO Auto-generated method stub return true; } } public class ListTest2 { public static void main(String[] args) { List books = new ArrayList(); books.add(new String("Node.js从入门到精通")); books.add(new String("JavaScript从入门到精通")); books.add(new String("Java从入门到精通")); books.add(new String("Java Web从入门到精通")); System.out.println(books); books.remove(new Test()); System.out.println(books); books.remove(new Test()); System.out.println(books); } }
由于类Test重写了equals()方法,总是返回true,所以在比较移除的时候,总是移除集合中的第一个元素。
Java 8为List集合增加了sort()和replaceAll()两个默认方法,通过Lanbda函数表达式作为参数传入。
package com.practice.collection; import java.util.ArrayList; import java.util.List; public class ListTest3 { public static void main(String[] args) { List books = new ArrayList(); books.add(new String("Node.js从入门到精通")); books.add(new String("JavaScript从入门到精通")); books.add(new String("Java从入门到精通")); books.add(new String("Java Web从入门到精通")); /*按字符串的长短来输出*/ books.sort((o1,o2)->((String)o1).length()-((String)o2).length()); System.out.println(books); /*用字符串的长度来代替原来字符串*/ books.replaceAll(ele->((String)ele).length()); System.out.println(books); } }
输出结果:
[Java从入门到精通, Node.js从入门到精通, Java Web从入门到精通, JavaScript从入门到精通] [10, 13, 14, 16]
2 listIterator方法
和iterator方法相比较而言,listIterator可以向前迭代,而iterator只能够向后迭代。而且listIterator提供了add()的方法向List集合中添加元素,iterator只能够删除元素。package com.practice.collection; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIteratorTest { public static void main(String[] args) { String[] books = {"Java从入门到精通","Node.js从入门到精通", "Java Web从入门到精通","JavaScript从入门到精通"}; List bookList = new ArrayList(); for(int i = 0;i < books.length; i ++){ bookList.add(books[i]); } ListIterator listIterator = bookList.listIterator(); while(listIterator.hasNext()){ System.out.println(listIterator.next()); listIterator.add("--------------我是分隔符----------------"); } System.out.println("==============以下是反向迭代================"); while(listIterator.hasPrevious()){ System.out.println(listIterator.previous()); } } }
3 ArrayList和Vector实现类
ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的,允许再分配的Object[]数组。ArrayList或Vector对象使用initialCapaciy参数来设置该数组的长度,当向ArrayList或Vector中添加元素超出了该数组的长度时,他们的initialCapaciy会自动增长。除此之外,两者的显著特征是ArrayList是线程不安全,Vector是线程安全的。为了使List变成线程安全的,可以使用Collections的工具类,不使用Vector,是因为过时了。
Vector还有个实现类Stack,实现元素能够像栈的操作进行,先进后出。
4 固定长度的List
Arrays.asList()方法,该方法可以把一个数组或指定个数的对象转化成一个List集合,这个List集合不是ArrayList的实现类,也不是Vector的实现类,而是Arrays的内部类ArrayList实例。Arrays.ArrayList是一个固定长度的List集合,只能够遍历里面的数据元素,不能够增加或者删除元素,如果操作会抛出UnsupportedOperationException异常。
package com.practice.collection; import java.util.Arrays; import java.util.List; public class FixedSizeList { public static void main(String[] args) { List fixedList = Arrays.asList("Java从入门到精通","Node.js从入门到精通", "Java Web从入门到精通","JavaScript从入门到精通"); System.out.println(fixedList.getClass()); fixedList.forEach(System.out::println); fixedList.add("非IT书籍"); fixedList.remove("Java从入门到精通"); } }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序