Java的容器类Collection集合和Map类
•发布于   •作者 三国 - 魏  •387 次浏览  •最后一次编辑是   •来自 博客

一、Collection

   Collection是最基本的集合接口,JDK不提供Collection接口的具体实现,而是提供了更加具体的子接口(如Set和List)实现,所 以想要实例化Collection对象就必须实现Collection的子类,下面的图是关于Collection的类的层次结构。

    Collection下有三个实现的接口,分别是Set,List,Queue,因为只有Set和List集合接口比较常用,所以我就主要介绍这两个集合接口。



二、Set接口

    Set是一种不包括重复元素的集合,里面不可以添加重复元素,Set集合是无序的,就是说存在里面的数据不是按照放入的顺序存放的,而是一种随机的

public class Test {
	public static void main(String[] args) {
		Collection<String> set = new HashSet<String>();//给Collection一个指定类型,用以传输同一类型的数据
		set.add("JIE");
		set.add("WEI");
		set.add("NBA");
		set.add("Hello");
		set.add("World");
		set.add("Hello");
		set.add("World");
		System.out.println(set);//打印结果[WEI, NBA, JIE, World, Hello]第二个Hello,World没有添加进去
		//并且集合里面的数据打印并不是从添加数据的顺序打印出来,所以说Set集合是无序存放的
	}
}

        集合可以存放任何类型的数据,不仅仅只是JDK提供的那些引用类型的数据,还可以添加我们自定义的类的数据类型,我们自己创建一个类,把该类作为数据传入集合中


public class Test {
	public static void main(String[] args) {
		Collection<Person> set = new HashSet<Person>();//给Collection一个指定类型,用以传输同一类型的数据
		set.add(new Person("JIE"));
		set.add(new Person("WEI"));
		set.add(new Person("NBA"));
		set.add(new Person("Hello"));
		set.add(new Person("World"));
		set.add(new Person("Hello"));
		set.add(new Person("World"));
		System.out.println(set);//打印结果[Hello, JIE, World, WEI, World, NBA, Hello]第二个Hello,World同样添加进去
	}
}

class Person{
	private String name;
	
	public Person(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	//重写toString方法,让它打印出我们传入的名字
	@Override
	public String toString() {
		return this.name;
	}
}

        不是说Set集合不可以添加重复元素的吗,为什么第二个Hello,World同样添加进去了?因为我们添加进去的对象是new出来的,所以并不是同一块内存地址,Set集合没有默认name的hashCode(),而默认的是传入对象的hashCode(),所以可以传入相同name的Person对象,要想传入的数据不重复,我们就需要重写hashCode()和equals()方法,使得我们添加的数据不重复


public class Test {
	public static void main(String[] args) {
		Collection<Person> set = new HashSet<Person>();//给Collection一个指定类型,用以传输同一类型的数据
		set.add(new Person("JIE"));
		set.add(new Person("WEI"));
		set.add(new Person("NBA"));
		set.add(new Person("Hello"));
		set.add(new Person("World"));
		set.add(new Person("Hello"));
		set.add(new Person("World"));
		System.out.println(set);//打印结果[WEI, NBA, JIE, World, Hello]第二个Hello,World没有添加进去
	}
}

class Person{
	private String name;
	
	public Person(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	//重写toString方法,让它打印出我们传入的名字
	@Override
	public String toString() {
		return this.name;
	}
	@Override
	public int hashCode() {
		return this.name.hashCode();
	}
	@Override
	public boolean equals(Object obj) {
		if(name.equals(((Person)obj).getName())){
			return true;
		}else{
			return false;
		}
	}
}

   三、List接口

    List是一种包括重复元素的集合,里面可以添加重复元素,List集合是有序的,就是说存在里面的数据是按照存入的顺序存放的,而不是一种随机的

public class Test {
	public static void main(String[] args) {
		Collection<String> list = new ArrayList<String>();//给Collection一个指定类型,用以传输同一类型的数据
		list.add("JIE");
		list.add("WEI");
		list.add("NBA");
		list.add("Hello");
		list.add("World");
		list.add("Hello");
		list.add("World");
		System.out.println(list);//打印结果[JIE, WEI, NBA, Hello, World, Hello, World]
		//所有的数据全部都存入了,并且是按照存入的顺序打印的
	}
}

Vector和ArrayList

        List接口下包括ArraysList、Vector和LikedList,其中ArraysList和Vector的用法基本上是一样的,只是Vector是线程同步的,所以它也是线程安全的,而ArraysList是线程异步的,是不安全的。如果不考虑到线程的安全因素,一般用ArraysList效率比较高。

Aarraylist和Linkedlist

        1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。

        2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。

        3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。

        这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

四、Map

        Map是一个键值对的集合,也就是说一个Key对应一个Value,如果存储同一个Key值得话,后一个Value会覆盖掉前一个Value值,只存储一份Key对应的Value值

public class Test {
	public static void main(String[] args) {
		HashMap<String, String> collection = new HashMap<String, String>();
		collection.put("1", "hello");
		collection.put("2", "good");
		collection.put("2", "world");
		collection.put("4", "love");
		collection.put("5", "you");
		System.out.println(collection);//打印结果{2=world, 1=hello, 5=you, 4=love}
	}
}



public class Test {
	public static void main(String[] args) {
		Map <String, String> array = new LinkedHashMap <String, String>();
		array.put("1", "hello");
		array.put("2", "good");
		array.put("2", "world");
		array.put("4", "love");
		array.put("5", "you");
		System.out.println(array);//打印结果{1=hello, 2=world, 4=love, 5=you}
	}
}

        其中HashMap()是无序存放的,LikedHashMap是有序存放的



3 回复
NOURX

第一张图崩了

NOURX

写的真不错

三国 - 魏

@NOURX 感谢提醒!!

回到顶部

©2017 Powered by 三十三行伪代码
皖ICP备17005175号-3