Java 集合总结

集合框架图

Collection

Map


1.集合框架图


其中Iterator为迭代器,用hasNext()判断是否还有元素,用next()返回其中的元素。ListIterator只能出现在list中使用,其使用了线程的同步,也就是当遍历的时候,可以对集合中的元素进行添加删除等。Collection只能装 单个的元素,Map是以键值对的方式存入的。Collection子类接口List中存储的元素是可以重复的,也就是以下标的方式访问。Set中的元素是不能重复的。Map中的元素都是键值对对应的,其中键是不能重复的。

List的子类ArrayList是读取速度较快插入删除较慢,LinkedList是链表插入删除较快,读取很慢。修改多的时候用后者,否则就用前者。Set中的hashset底层数据结构是hash表结构,其存储的对象要根据条件复写自己的hashCode()和equals()方法。TreeSet底层数据结构是二叉树,其存储的对象要实现comparable接口或者传入自定义comparator对其存入的对象比较,其中return0就是其判断是否唯一性的标志。

map中的HashMap和TreeMap其中的key集合就是hashset和treeset。其遍历也是通过遍历这两个集合实现了,或者是用Map.entrySet()返回键值对的关系然后取出。

2.Collection

ListIterator和Iterator

import java.util.*;
class Test
{
	public static void main(String[] arg)
	{
		List<String> l1 = new ArrayList<String>();
		l1.add("s1");
		l1.add("s2");
		l1.add("s3");
		l1.add("s4");
//		Iterator<String> it = l1.iterator();
		
		/*--------此处代码会出现异常----------*/
		/*原因是因为使用迭代器取出的时候,在往集合中添加元素,造成不能同时完成的操作而抛出runtime异常*/
/*		while(it.hasNext())
		{
			String s = it.next();
			if(s.equals("s3"))
			{
				l1.add("s5");
			}
			System.out.println(s);
		}
*/
		ListIterator<String> it = l1.listIterator();
		while(it.hasNext())
		{
			String s = it.next();
			if(s.equals("s3"))
			{
				it.add("s5");
			}
			System.out.println(s);

		}
		System.out.println(l1);
	}
}
HashSet实例:

hashset存储的方式就是按照所存储的对象的hash值所存储,如果对象的hash值纯在的话那就用equas方法比较两个对象是否一样,如果一样的话就不在存储。
也就是说,hashset的速度比较快 但是你要提供合理的hashCode方法以及equeas方法。
下面是案例
判断元素是否纯在依赖的是元素的hashCode和equals方法
先判断hashCode
然后判断equals
arraylist 判断是否一样依赖的是equals方法

import java.util.*;
class Person
{
	public String name;
	public int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public int hashCode()
	{
		return name.hashCode()+age;
	}
	public boolean equals(Object o)
	{
		if(!(o instanceof Person))
			return false;
		Person p = (Person)o;

		return p.name.equals(this.name)&&p.age==this.age;

	}

}

class Test
{
	public static void main(String[] arg)
	{
		Set<Person> s = new HashSet<Person>();
		s.add(new Person("李斯",14));
		s.add(new Person("李斯",14));
		s.add(new Person("王五",16));
		s.add(new Person("张三",17));

		Iterator it = s.iterator();
		while(it.hasNext())
		{
			Person p = (Person)it.next();
			System.out.println(p.name+"......"+p.age);
		}
	}
}

treeset实例:/*
此段代码实现了 可以存储不同年龄的学生

class Student implements Comparable
{
	public String name;
	public int age;

	public Student(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public int compareTo(Object o)
	{
		if(!(o instanceof Student))
			throw new RuntimeException("存入的不是该类型");
		Student s1 = (Student)o;
		if(s1.age > this.age)
			return 1;
		if(s1.age == this.age)
			return s1.name.compareTo(this.name);
		return -1;

	}
}
class Test
{
	public static  void main(String[] arg)
	{
		Set<Student>  s = new TreeSet<Student>();
		s.add(new Student("张三",14));
		s.add(new Student("张三1",15));
		s.add(new Student("张三2",16));
		s.add(new Student("张三3",18));
		s.add(new Student("张三4",18));
		
		Iterator it = s.iterator();
		while (it.hasNext())
		{
			Student s1 = (Student)it.next();
			System.out.println(s1.name+"*****"+s1.age);
		}

	}
}


总结:
!-------TreeSet:存储不同的元素并且排序,底层是二叉树结构  其方法是comparable方法。
(当其要按照存入的顺序或者是逆序存取的时候就可以在其 comparable方法中设置其返回值为1或者是-1 如果只要有一个就return0)
其除了实现接口 也可以继承自comparator。 然后再构造treeset的时候传入。
!-------HashSet:存储不同的元素,底层是hash表结构 其方法是先判断是够有相同的hash码 如果有 在判断equals方法
*/

3.Map

map遍历的两种方式 其中键的存储与set一样。

import java.util.*;
class Test
{
	public static void main(String[] arg)
	{
		Map<String,String>  map = new HashMap<String,String>();
		map.put("key1","001");
		map.put("key2","002");
		map.put("key3","003");
		map.put("key4","004");

		/*---------第一种遍历----------*/
		

		Set<String> keyset = map.keySet();
		Iterator<String> it = keyset.iterator();
		while(it.hasNext())
		{
			String value = map.get(it.next());
			System.out.println(value);
		}
		/*---------第二种遍历----------*/
		/*这一种遍历使用了entrySet方法,其返回的一组映射,可以利用你内部封装的方法getValue和getKey方法来获取
		  其对应的值或者是键,而其中Map.Entry是属于map中的内部类,其可以访问map中的数据,并且提供了一组方法用于返回
		  其一组键值对的中的值
		 */

		Set<Map.Entry<String,String>> entryset = map.entrySet();
		Iterator<Map.Entry<String,String>> it1 = entryset.iterator();
		while(it1.hasNext())
		{
			Map.Entry<String,String> entry = it1.next();
			System.out.println(entry.getKey()+"-----"+entry.getValue());
		}

	}
}

总结:
!---HashTable:底层是hash表结构,线程是同步的,不允许使用null值和null键
!---HashMap:  底层是hash表结构,线程是不同步的,允许使用null值和null键,效率高
!---TreeMap:底层是二叉树结构,线程不同步,可以对键进行排序。


!————Map集合中没有迭代器;其取出的原理就是将map集合转成set集合,然后再通过set集合中
迭代器来遍历集合
keySet()
entrySet()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值