
Collection的一些使用
public class Day12 {
public static void main(String[] args) {
Collection collection = new ArrayList();
collection.add("苹果");
collection.add("梨子");
collection.add("榴莲");
System.out.println(collection.size());
System.out.println(collection);
collection.remove("苹果");
System.out.println(collection.size());
//遍历集合的方式1:使用foreach,增强for循环进行遍历
for (Object object : collection) {
System.out.println(object);
}
//使用迭代器 Iterator 进行遍历
Iterator iterator = collection.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
//collection.remove("榴莲");
//要注意在迭代的过程中不能使用collection的方法。
iterator.remove();
}
collection.contains("榴莲");
}
}
list接口使用
public class Day121 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("苹果");
list.add("小米");
list.add(0,"华为");
//list有序有下标,可以指定添加位置。
System.out.println(list);
// list.remove(1);
// System.out.println(list);
//遍历,比collection多了一种遍历方式
//因为可以通过get(i)这种方式拿到值。
for(int i=0;i<list.size();i++) {
System.out.print(list.get(i));
}
for (Object object : list) {
System.out.print(object);
}
Iterator it = list.iterator();
while(it.hasNext()) {
System.out.print(it.next());
}
//列表迭代器,允许程序员按任意方向遍历列表,迭代期间修改列表
//并获得迭代器在列表当前的位置。
ListIterator it2 = list.listIterator();
System.out.println("");
System.out.println("-----------列表迭代器从前往后---------------");
while(it2.hasNext()) {
System.out.println(it2.nextIndex()+""+it2.next());
//列表迭代器获取列表的当前位置。
}
//从前到后迭代一遍之后,迭代器指针指向最后一个元素的后一位,这时候可以向前迭代
System.out.println("---------从后往前----------------");
while(it2.hasPrevious()) {
System.out.println(it2.previousIndex()+""+it2.previous());
}
System.out.println(list.indexOf("华为"));
}
}
list接口中需要注意的一些点
public class Day122 {
public static void main(String[] args) {
List list = new ArrayList();
//自动装箱成Integer类型
list.add(10);
list.add(20);
list.add(30);
list.add(40);
//这样操作肯定是不行的,直接填入10,默认就是删除下标为10的元素
//不存在下标为10的元素,那么就会报错。
//list.remove(10);
//只有把10装箱成Integer对象才行
// list.remove(new Integer(10));
System.out.println(list);
//左开右闭
System.out.println(list.subList(1, 3));
}
}
List实现类:
ArrayList:数组结构实现,查询快,增删慢,线程不安全,运行效率高
Vector:现在用的很少,数据结构实现,查询快,增删慢,运行效率不高,线程安全
LingkedList:链表结构实现,增删快,查询慢
ArrayList的使用
public class Day123 {
public static void main(String[] args) {
Student s1 = new Student(1,"yf1");
Student s2 = new Student(2,"yf2");
Student s3 = new Student(3,"yf3");
ArrayList list = new ArrayList();
list.add(s1);
list.add(s2);
list.add(s3);
list.remove(new Student(3,"yf3"));
System.out.println(list);
System.out.println(list.contains(new Student(2,"yf2")));
}
}
代码中正常来说是删除不了s3的,因为新开的对象和s3不是一个内存地址。
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
这是remove的源码,如果传入的对象不为空的话,就进行equals方法进行比对
public boolean equals(Object obj) {
return (this == obj);
}
这是equals代码,我们可以通过重写equals代码的方法来实现删除s3.
@Override
public boolean equals(Object obj) {
//判断是不是同一个对象
if(this == obj) {
return true;
}
//判断是否为空
if(obj == null) {
return false;
}
//判断是否为Student类型
if(obj instanceof Student) {
Student s = (Student)obj;
if(this.id == s.id) {
return true;
}
}
return false;
}
这样只要是同一个id我们就认为是同一个对象,这样就可以进行remove了。
list.contains(new Student(2,"yf2");这个也是一样的,
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
contains内部其实也是调用equals方法,重写equals也可以达到修改contains作用的目的。
本文详细介绍了Java中的Collection和List接口的使用,包括添加、删除、遍历等操作。通过示例展示了ArrayList和LinkedList的区别,以及在实际操作中如何处理对象的删除问题。同时,解释了equals方法在对象比较中的作用,并讨论了如何重写equals以满足特定需求。

被折叠的 条评论
为什么被折叠?



