Java学习----List接口

今日学习内容总结如下:

List接口

有序 允许重复

public interface List<E> extends Collection<E>

继承自Collection接口的方法

  • boolean add(E e);向集合末尾追加元素e对象
  • boolean remove(Object obj)删除一个和obj相等的元素,如果没有和obj相等元素,则报异常indexoutofboundsexception

List接口中的特殊方法

  • void add(int index, E element); 向指定索引位置index上添加元素element,原始数据自动后移
  • E get(int index);  获取指定索引号对应的元素,index应该在[0,size-1]
  • E set(int index, E element);  用于给指定索引位置上进行赋值,这个位置上必须有对应的数据(已经赋过值),这里实际上是修改操作,否则indexoutofboundsexception
  • E remove(int index);删除指定位置的元素,可以返回原始位置上存储的元素
  • int indexOf(Object o); 查找从左向右第一个o元素的下标索引,如果元素不存在返回-1
  • int lastIndexOf(Object o);从右向左查找

对象相等判定使用的是equals方法

sort方法按照自定义比较器对集合中的所有元素进行排序,认自然序

default void sort(Comparator<? super E> c) {
        Object[] a = this.toArray();  //将List集合对象转换为数组
        Arrays.sort(a, (Comparator) c);  //调用Arrays工具类中的排序方法对数组进行排序
        ListIterator<E> i = this.listIterator();  //获取List集合对象中特殊的Iterator迭代器对象
        for (Object e : a) {  //foreach结构遍历数组中的所有元素
            i.next();
            i.set((E) e); //修改集合List中迭代器指定的当前位置上的元素
        }
    }
list.sort(new Comparator<A2>() {
			public int compare(A2 o1, A2 o2) {
				// 自定义比较规则,按照id从小到大,如果id相等则按照name从大到小
				int res = o1.getId().compareto(o2.getId());
				if (res == 0)
					res = (o1.getName().compareto(o2.getName())) * -1;
				return res;
			}
		});

调用方法时要求传入参数为自定义比较器

对应的实现类

  • ArrayList底层实现为数组,线程不安全
  • Vector底层实现为数组,线程安全  synchronized
  • LinkedList底层实现为链表,线程不安全
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

public class Test1 {
	public static void main(String[] args) {
		List list = new ArrayList();
		list.add(new A1());
		list.add(new A1());
		System.out.println("add:"+list.size());
		list.remove(new A1());
		System.out.println("remove:"+list.size());
		for(int i=0;i<5;i++)
			list.add(i);  //自动装箱操作
		Iterator it=list.iterator();
		while(it.hasNext()) {
			Object tmp=it.next();
			System.out.println(tmp);
		}
	}
}

class A1 {
	private Long id;
	private String name;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public int hashCode() {
		return Objects.hash(id, name);
	}

	@Override
	public boolean equals(Object obj) {
		// 用户自定义的比较规则
		if (this == obj)
			return true;
		if (obj == null) // 当前对象不可能为null,否则空指针异常
			return false;
		if (getClass() != obj.getClass()) // 类型判断。一个类只能加载一次
			return false;
		A1 other = (A1) obj;
		// 调用Objects工具类中的方法进行相等判断
		/*
		 * public static boolean equals(Object a, Object b) { return (a == b) || (a !=
		 * null && a.equals(b)); }
		 */
		return Objects.equals(id, other.id) && Objects.equals(name, other.name);
	}

}
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

/*
 * List接口中的sort方法
 */
public class Test2 {
	public static void main(String[] args) {
		List list = new ArrayList();
		list.add(new A2(99L, "zhangsan"));
		list.add(new A2(77L, "lisi"));
		list.add(new A2(99L, "wangwu"));
		list.sort(new Comparator<A2>() {
			public int compare(A2 o1, A2 o2) {
				// 自定义比较规则,按照id从小到大,如果id相等则按照name从大到小
				int res = o1.getId().compareto(o2.getId());
				if (res == 0)
					res = (o1.getName().compareto(o2.getName())) * -1;
				return res;
			}
		});
		list.forEach(System.out::println);
	}
}

class A2 {
	private Long id;
	private String name;

	public A2(Long id, String name) {
		this.id = id;
		this.name = name;
	}

	// ===================================
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "A2 [id=" + id + ", name=" + name + "]";
	}

}
import java.util.List;
import java.util.ArrayList;

public class Test3 {
	public static void main(String[] args) {
		List list = new ArrayList();
		for (int i = 0; i < 5; i++)
			list.add(i);
		for (int i = 0; i < 5; i++)
			list.add(0,i);
		list.forEach(System.out::print);
	}
}
import java.util.List;
import java.util.ArrayList;

public class Test4 {
	public static void main(String[] args) {
		List list = new ArrayList();
		for (int i = 0; i < 5; i++)
			list.add(i);
		for (int i = 0; i < 5; i++)
			list.add(0,i);
		for(int i=0;i<list.size();i++)
			System.out.println(list.get(i));
	}
}
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

public class Test5 {
	public static void main(String[] args) {
		List list = new ArrayList();
		for (int i = 0; i < 5; i++)
			list.add(i);
		list.set(0, new Random());  //success
		list.set(5, new Date()); // indexoutofboundsexception
		for (int i = 0; i < list.size(); i++)
			System.out.println(list.get(i));
	}
}
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;

public class Test6 {
	public static void main(String[] args) {
		List list = new ArrayList();
		list.add(100);
		for (int i = 0; i < 5; i++)
			list.add(i);
		list.remove(4);//最佳匹配原则
		list.remove(Integer.valueOf(100));   //参数是Object
		for (int i = 0; i < list.size(); i++)
			System.out.println(list.get(i));
	}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

public class Test7 {
	public static void main(String[] args) {
		List list = new ArrayList();
		for (int i = 0; i < 5; i++) {
			list.add(new A7(1L + i, "name_" + i));
		}

		System.out.println(Arrays.toString(list.toArray()));

		int pos = list.indexOf(new A7(5L, "name_4"));
		System.out.println(pos);
	}
}

class A7 {
	private Long id;
	private String name;

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		A7 other = (A7) obj;
		return Objects.equals(id, other.id);
	}

	public A7(Long id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "A7 [id=" + id + ", name=" + name + "]";
	}

}

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...