Collection类集框架知识点总结
•发布于   •作者 fly唐朝的天空(唐秋果)  •513 次浏览  •最后一次编辑是   •来自 博客

      这周我们学了集合框架,看着知识点很多,感觉很混乱,但是用图片总结起来思路很清晰,我画图总结了一下框架和主要特点如下图:

       由此图可以看出集合体系的顶层为Collection相当于java大老板定制的一个功能接口,他下面有俩个开发团队分别是List和Set,他们都继承了Collection的功能接口,但是既然是俩个团队那开发出来的东西肯定要有自己的特色,所以他俩也作为接口不仅实现Collection接口功能还有自己特有的功能。List团队下面有俩个实现类分别是ArrayList和Linkedlist,而Set下面有三个实现类分别是HashSet,TreeSet和LinkedSet。

  一: ArrayList 和 LinkedList的存储查找的优缺点:

1、ArrayList 是采用动态数组来存储元素的,它允许直接用下标号来直接查找对应的元素。但是,但是插入元素要涉及数组元素移动及内存的操作。总结:查找速度快,插入操作慢。

2、LinkedList 是采用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

ArrayList和vector的区别有哪些?

           Vector是线程安全的,也就是说是同步的,速度慢。

          ArrayList是线程序不安全的,不是同步的,速度快;

一、历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现;
二、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的;
三、值:只有HashMap可以让空值作为一个表的条目的key或value。

  1. 二:什么时候该使用什么样的集合

Collection

我们需要保存若干个对象的时候使用集合。

 

List

 

 

如果我们需要保留存储顺序, 并且保留重复元素, 使用List.

如果查询较多, 那么使用ArrayList

如果存取较多, 那么使用LinkedList

如果需要线程安全, 那么使用Vector

 

 

Set

 

如果我们不需要保留存储顺序, 并且需要去掉重复元素, 使用Set.

如果我们需要将元素排序, 那么使用TreeSet

如果我们不需要排序, 使用HashSet, HashSet比

TreeSet效率高.

如果我们需要保留存储顺序, 又要过滤重复元素, 那么使用LinkedHashSet

  三:关于HashSet怎样存入不重复的元素和equals方法重写

1.HashSet不存入重复元素的规则.使用hashcode和equals

       由于Set集合是不能存入重复元素的集合。那么HashSet也是具备这一特性的。HashSet如何检查重复?HashSet会通过元素的hashcode()和equals方法进行判断元素师否重复。

当你试图把对象加入HashSet时,HashSet会使用对象的hashCode来判断对象加入的位置。同时也会与其他已经加入的对象的hashCode进行比较,如果没有相等的hashCode,HashSet就会假设对象没有重复出现。

简单一句话,如果对象的hashCode值是不同的,那么HashSet会认为对象是不可能相等的。

因此我们自定义类的时候需要重写hashCode,来确保对象具有相同的hashCode值。

如果元素(对象)的hashCode值相同,是不是就无法存入HashSet中了? 当然不是,会继续使用equals 进行比较.如果 equals为true 那么HashSet认为新加入的对象重复了,所以加入失败。如果equals 为false那么HashSet 认为新加入的对象没有重复.新元素可以存入.。

      总的来说先判断哈希码是否相同,相同在用equals判断地址是否相同来确定对象是否相同  如果子类没有重写父类的HashCode方法那么计算出来的HashCode是通过内存地址计算出来的那么这个HashCode值将永远不同,如果子类重写了父类的HashCode方法那么将根据重写的HashCode方法来确保对象具有相同的HashCode值。例如下面代码添加同一个对象俩次,运行结果只有一个添加进去了。

package text;

public class Person {
	private String name;
	private int age;
	private int Id;
	public String getName() {
		return name;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + Id;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (Id != other.Id)
			return false;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	public Person(String name, int age, int id) {
		super();
		this.name = name;
		this.age = age;
		Id = id;
		
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getId() {
		return Id;
	}
	public void setId(int id) {
		Id = id;
	}

}
package text;

import java.util.HashSet;

public class HashCode {
	public static void main(String[] args) {
		HashSet set=new HashSet();
		Person p1=new Person("name",5,8);
		Person p2=new Person("name",5,8);
		set.add(p1);
		set.add(p2);
		System.out.println(set);      //结果只有一个[text.Person@340d8d]
} }

四:迭代器



package text;
import java.util.HashSet;
import java.util.Iterator;
public class DieDaiQi {
	public static void main(String[] args) {
		HashSet list = new HashSet();
		// 增加:add() 将指定对象存储到容器中
		list.add("计算机网络");
		list.add("现代操作系统");
		list.add("java编程思想");
		list.add("java核心技术");
		list.add("java语言程序设计");
		System.out.println(list);
		Iterator it = list.iterator();//调用list里面的iterator()方法返回类型为Iterator,所以接收必须是这个类
		while (it.hasNext()) {//返回布尔类型如果有下个元素
			String next = (String) it.next();//迭代器的next方法返回值类型是Object,所以要记得类型转换。
			System.out.println(next);
		}
		/*for (Iterator it1 = list.iterator(); it1.hasNext();) {//增强for循环也可以遍历
            //迭代器的next方法返回值类型是Object,所以要记得类型转换。
			String next = (String) it1.next();
			System.out.println(next);
		}*/
		
	}

}

   这些是这周学的,是从老师给的资料和网上搜的资料,自己总结出来的,部分代码和语言是引述,但是自己总结出来的。有错误之处和不详细不清楚的地方还请大家指出,作为初学者,所以难免会有错误的地方,希望大家共同讨论。


1 回复
姜岩

总结的很仔细!

回到顶部

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