List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下 >标)来访问List中的元素,这类似于Java的数组。
迭代器
Java Iterator(迭代器)不是一个集合,它是一种用于访问集合的方法,可用于迭代 ArrayList 和 HashSet 等集合。
调用 it.next() 会返回迭代器的下一个元素,并且更新迭代器的状态。
调用 it.hasNext() 用于检测集合中是否还有元素。
调用 it.remove() 将迭代器返回的元素删除。
API
List list = new ArrayList();
// 向列表的尾部追加指定的元素
list.add("lwc");
// 在列表的指定位置插入指定元素
list.add(1, "nxj");
// 追加指定 collection 中的所有元素到此列表的结尾
list.addAll(new ArrayList());
// 从列表中移除所有元素
list.clear();
// 如果列表包含指定的元素,则返回true
list.contains("nxj");
// 如果列表包含指定 collection 的所有元素,则返回 true
list.containsAll(new ArrayList());
// 比较指定的对象与列表是否相等
list.equals(new ArrayList());
// 返回列表中指定位置的元素
list.get(0);
// 返回列表的哈希码值
list.hashCode();
// 返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1
list.indexOf("lwc");
// 返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回 -1
list.lastIndexOf("lwc");
// 如果列表不包含元素,则返回 true
list.isEmpty();
// 移除列表中指定位置的元素
list.remove(0);
// 移除列表中出现的首个指定元素
list.remove("lwc");
// 从列表中移除指定 collection 中包含的所有元素
list.removeAll(new ArrayList());
// 用指定元素替换列表中指定位置的元素
list.set(0, "lp");
// 返回列表中的元素数
list.size();
// 返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的部分视图
list.subList(1, 2);
// 返回以正确顺序包含列表中的所有元素的数组
list.toArray();
// 返回以正确顺序包含列表中所有元素的数组
list.toArray(new String[] { "a", "b" });
排序
简单数值排序 直接用Collections.sort( );方法
List<Integer> list = new ArrayList<Integer>();
list.add(new Integer(3));
list.add(new Integer(14));
list.add(new Integer(6));
list.add(new Integer(10));
Collections.sort(list);
System.out.println(list.toString());
复杂排序需要类继承Comparable 接口并重写 CompareTo方法
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class sort {
public static void main(String[] args) {
List<User> list = new ArrayList<User>();
list.add(new User("张三", 5));
list.add(new User("李四", 30));
list.add(new User("王五", 19));
list.add(new User("王麻子", 17));
// 按年龄排序
Collections.sort(list);
System.out.println(list.toString());
}
}
class User implements Comparable<User>{
private String name; //姓名
private int age; // 年龄
public User(String name, int age) {
this.name = name;
this.age = age;
}
// getter && setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
@Override
public int compareTo(User user) {
// 重写Comparable接口的compareTo方法,根据年龄升序排列,降序修改相减顺序即可
return this.age - user.getAge();
}
}
匿名内部类实现排序
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class sort {
public static void main(String[] args) {
List<User> list = new ArrayList<User>();
list.add(new User("张三", 5));
list.add(new User("李四", 30));
list.add(new User("王五", 19));
list.add(new User("王麻子", 17));
Collections.sort(list, new Comparator<User>() {
@Override
public int compare(User u1, User u2) {
int diff = u1.getAge() - u2.getAge();
if (diff > 0) {
return 1;
}else if (diff < 0) {
return -1;
}
return 0; //相等为0
}
}); // 按年龄排序
System.out.println(list.toString());
}
}
遍历
可以用迭代器
List<String> list = new ArrayList<>();
Iterator <String> it = list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
也可以直接 循环
for(int i = 0;i < list.size(); i ++){
System.out.println(list.get(i));
}
循环....
for(String tmp:list){
System.out.println(tmp);
}
package com.inspur.Test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@SuppressWarnings("unused")
public class MapTest {
private static List<String> list= new ArrayList<String>();
public static void main(String[]args){
MapTest mapTest = new MapTest();
mapTest.initList(mapTest.list);
mapTest.iteratorList(list);
}
public List initList(List<String> list){
int i=0;
int num=6000000;
for(i=0;i<num;i++){
list.add("list"+i);
}
return list;
}
public void iteratorList(List<String> list){
long start= System.currentTimeMillis();
for(Iterator<String> it=list.iterator();it.hasNext();){
String value=it.next();
}
}
}
案例
package com.java.demoSet;
import java.util.*;
public class Only {
public static void item(){
List <String> list = new ArrayList<>();
list.add("托尼弗格森");
list.add("王伟琪");
list.add("夜魔");
for ( Iterator <String> it = list.iterator();it.hasNext();) {
System.out.println(it.next());
}
String [] temp = (String [])list.toArray(new String [list.size()]);
System.out.println(Arrays.toString(temp));
}
public static void getOnly(){
String[] array = {"a","b","c","c","d","e","e","e","a"};
Set set = new HashSet();
for (int i = 0; i < array.length; i++) {
set.add(array[i]);
}
String [] string = (String [])set.toArray(new String [set.size()]);
System.out.println(Arrays.toString(string));
}
public Only(){
String[] array = {"a","b","c","c","d","e","e","e","a"};
List<String> result = new ArrayList<>();
boolean flag;
for(int i=0;i<array.length;i++){
flag = false;
for(int j=0;j<result.size();j++){
if(array[i].equals(result.get(j))){
flag = true;
break;
}
}
if(!flag){
result.add(array[i]);
}
}
String[] arrayResult = (String[]) result.toArray(new String[result.size()]);
System.out.println(Arrays.toString(arrayResult));
}
public static void main(String[] args) {
// Only only = new Only();
// Only.getOnly();
Only.item();
}
}
toArray()方法转string[]数组
List<String> strList = new ArrayList<String>();
strList.add("aa");
strList.add("bb");
//如果要变成String数组,需要强转类型。
final int size = strList.size();
String[] strs = (String[])strList.toArray(new String[size]);
List初始化转string[]数组
List<String> strList = new ArrayList<String>();
strList.add("aa");
strList.add("bb");
String[] strs = new String[strList.size()];
推荐用List自带的toArray()方法转string[]数组
删除元素
public static void remove14(List<String> list, String target){
for(int i = list.size() - 1; i >= 0; i--){
String item = list.get(i);
if(target.equals(item)){
list.remove(item);
}
}
}
//迭代器删除
public static void remove32(List<String> list, String target){
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String item = iter.next();
if (item.equals(target)) {
iter.remove();
}
}
合并并删除重复数据
Set s=new TreeSet(l1);
for(Integer i:l2){
//当添加不成功的时候 说明s中已经存在该对象
s.add(i);
}
System.out.println(s);
手写合并操作(不难,写写更健康)
public static ArrayList addArrayList(ArrayList list1, ArrayList list2) {
ArrayList list3 = new ArrayList();
if (list1 == null || list1.size() == 0) {
list3 = list2;
} else if (list2 == null || list2.size() == 0) {
list3 = list1;
} else {
for (int i = 0; i < list1.size(); i++) { // 遍历list1
boolean isExist = false;
for (int j = 0; j < list2.size(); j++) {
if (list1.get(i).equals(list2.get(j))) {
isExist = true; // 找到相同项,跳出本层循环
break;
}
}
if (!isExist) { // 不相同,加入list3中
list3.add(list1.get(i));
}
}
for (int k = 0; k < list2.size(); k++) {
list3.add(list2.get(k));
}
}
return list3;
}
LinkedList
public class Person1 implements Comparable < Person1 > {
private Float height;
private String name;
Person1(float height) {
this.height = height;
}
public Float getHeight() {
return height;
}
public void setHeight(float height) {
this.height = height;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override public int compareTo(Person1 p) {
if (this.getHeight() < p.getHeight()) {
return 1;
} else if (this.getHeight() > p.getHeight()) {
return - 1;
} else {
return 0;
}
}
}
public class Question3_1 {
public static void main(String[] args) {
Person1 p1 = new Person1(23.4f);
p1.setName("Stud1");
Person1 p2 = new Person1(2.34f);
p2.setName("Stud2");
Person1 p3 = new Person1(34.32f);
p3.setName("Stud3");
Person1 p4 = new Person1(56.45f);
p4.setName("Stud4");
Person1 p5 = new Person1(21.4f);
p5.setName("Stud5");
LinkedList < Person1 > al = new LinkedList < Person1 > ();
al.add(p1);
al.add(p2);
al.add(p3);
al.add(p4);
al.add(p5);
Collections.sort(al); //这里控制降序
for (Person1 p: al) System.out.println(p.getName() + " " + p.getHeight());
}
}