_040_Collection集合、ArrayList

==================

集合:一个容器
对比数组的优势:
1 集合 可以存储任意类型的对象数据,数组只能储存一种数据类型
2 集合的长度是会发生变化的,而数组的长度是固定的,写多少就是多少

Collection类:是集合的根接口,collection表示一组对象,这些对象也被称为collection的元素
    ------List  有序,可重复
    ------Set   无序,不可重复

Collection接口的方法,因为Collection是一个接口,所以需要用它的实现类ArrayList创建实例

ArrayList是一个可变数组,不是线程安全的,但是一般使用这个,vector是线程安全的

ArrayList中特有的方法,ArrayList比Collection多出索引操作,还有查找的操作

但是ArrayList一般是配合List接口使用的,所以在  _041_List集合  里会着重介绍ArrayList

需求1

遍历集合里的数据,使用Iterator迭代器

迭代器是直接指向集合的,就是说如果remove,那么集合里也删除,其中remove最需要注意

  只有调用了next再调用remove方法才有用,不然会报错
  假如add("小光")  add("小美")  然后调用了一次next,返回了小光,那么这就是最后返回的元素,
  因为我们只调用了一次next,所以就删了小光,但是如果没有使用next就remove,因为没有返回就删除就会出错

class Test
{
	public static void main(String[] args)
	{
		Collection collection1 = new ArrayList();
		collection1.add("bbbbb");
		collection1.add(1);
		collection1.add('c');
		collection1.add(3.14);
		Iterator iterator1 = collection1.iterator();
		while (iterator1.hasNext())
		{
			System.out.println(iterator1.next());
			// 获取到迭代器的时候,迭代器中有一个指针指向集合Collection中的第一个元素,调用一次next,
			//指针就会读取那个元素,并且指向下一个元素
		}

	}
}

需求2   

使用集合加入人物对象,人物对象有名字和id,现在我们需要通过调用contains(new Person(xxx,id))判断是否有这个人

首先看contains这个函数的的源代码

for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;

这里是用equals判断的,就是说判断对象的,把容器里对象遍历出来和我们传入的对象比较

其实不止是contains,还有indexOf那些传入对象的都是这样,只需要在我们操作的类里重写equals即可

所以我们需要重写equals,用来比较id,而不是对象

class Test
{
	public static void main(String[] args)
	{
		Collection collection2 = new ArrayList();
		collection2.add(new Person("狗娃", 110));
		collection2.add(new Person("天帝", 111));
		collection2.add(new Person("神赐", 112));
		System.out.println(collection2); // 集合里重写了toString方法,直接输出即可

		System.out.println(collection2.contains(new Person("天帝", 111)));
	}
}

class Person
{
	String name;
	int id;

	public Person(String name, int id)
	{
		this.id = id;
		this.name = name;
	}

	// toString只有在使用system.out.println输出的时候自动调用
	public String toString()
	{
		return name + id;
	}

	public boolean equals(Object o)
	{
		Person person = (Person) o;
		return person.id == this.id;
	}

	// 因为重写了equals,按照规范也要写hashCode
	public int hashCode()
	{
		return id;
	}
}

猜你喜欢

转载自blog.csdn.net/yzj17025693/article/details/82751976