java集合中的一些知识点

本文详细介绍了Java中的Collection和List接口的使用,包括添加、删除、遍历等操作。通过示例展示了ArrayList和LinkedList的区别,以及在实际操作中如何处理对象的删除问题。同时,解释了equals方法在对象比较中的作用,并讨论了如何重写equals以满足特定需求。

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作用的目的。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值