string转map集合_集合(下)

fa6a588d1193118cfdb4a031daf58634.png

7 Set 接口

Set 接口表示一个唯一、无序的容器(和添加顺序无关)。

7.1 Set 提供的方法

public static void main(String[] args) {
		/**
		 * 增:add/addAll
		 * 删:clear/remove/removeAll/retainAll
		 * 改:
		 * 查:contains/containsAll
		 * 遍历:iterator
		 * 其他:size/isEmpty
		 */
		
		Set<Integer> set = new HashSet<Integer>();
		// [1]添加
		// 无序
		set.add(10);
		set.add(3);
		set.add(20);
		set.add(0);
		// 不能添加重复元素
		boolean r = set.add(1);
		System.out.println(set);
		
		// 【2】删除
//		set.remove(1);
//		set.clear();
//		System.out.println(set);
		
		// 【3】查看是否包含
		System.out.println(set.contains(1));
		
		// 【4】其他
		System.out.println(set.size());
		System.out.println(set.isEmpty());
}

7.2 Set 的遍历

public static void main(String[] args) {
		
		Set<String> set = new HashSet<String>();
		set.add("banana");
		set.add("apple");
		set.add("coco");
		
		// 快速遍历
		for (String item : set) {
			System.out.println(item);
		}
		
		// 迭代器
		Iterator<String> it = set.iterator();
		while(it.hasNext()) {
			String item = it.next();
			System.out.println(item);
		}
}

8 HashSet

HashSet 是 Set 接口的实现类,底层数据结构是哈希表。HashSet 是线程不安全的(不保证同步)。优点:添加、删除、查询效率高;缺点:无序

8.1 添加自定义对象

如果向 HashSet 中存储元素时,元素一定要实现hashCode方法和equals方法。

public class Student {
	private String id;
	private String name;
	private int age;

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}//当属性相同时,两个对象的 hashcode 相同,判断两个对象相等的必要不充分条件

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}//两个对象相等的充分必要条件

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

}

9 LinkedHashSet

LinkedHashSet是Set接口的实现类,底层数据结构哈希表+链表。哈希表用于散列元素;链表用于维持添加顺序。如果要添加自定义对象元素,也需要重写 hashCode 和 equals 方法。

10 TreeSet

TreeSet 是Set接口的实现类,底层数据结构是二叉树。TreeSet 存储的数据按照一定的规则存储。存储规则让数据表现出自然顺序。

10.1 工作原理

98f5f054db3094f679e80509aa56185f.png

添加一个新元素 t 的存储的步骤:

  1. 如果集合无元素,t 直接加入;如果集合有元素,t 和根节点比较;
  2. 如果 t 小于根节点;把 t 放到根节点的左子树上;重复1-3步骤
  3. t 大于根节点;把 t 放到根节点的右子树上;重复1-3步骤

输出时按照一定的规则:左子树->根节点->右子树

向TreeSet中添加元素时,一定要提供比较策略,否则会出现 ClassCastException。

10.2 内部比较器

当一个自定义对象实现Comparable并实现compareTo方法时,通过指定具体的比较策略,此时称为内部比较器。

public class Student implements Comparable<Student>{
	private String id;
	private String name;
	private int age;

	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
	}

	@Override
	public int compareTo(Student o) {
		if(this.getAge()<o.getAge()) {
			return -1;
		}else if(this.getAge() == o.getAge()) {
			return 0;
		}else {
			return 1;
		}
	}

}

默认的比较器是按升序排列,所以只要重写的 compareTo 方法也是参数较大时返回 -1 即可实现升序排列。

10.3 外部比较器

当实际开发过程中不知道添加元素的源代码、无权修改别人的代码,此时可以使用外部比较器。TreeSet 接受一个指定比较策略的构造方法,这些比较策略的实现类必须实现 Compa-rator 接口。Comparator 位于java.util包中,定义了compare (o1,o2) 用于提供外部比较策略。推荐使用匿名内部类方法实现。

public static void main(String[] args) {
		
		TreeSet<String> set2 = new TreeSet<String>(new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return o1.length() - o2.length();
			}
			
		});//比较规则是字符串长度的升序
		
		set2.add("banana");
		set2.add("coco");
		set2.add("apple");
		
		set2.add("apple");
		System.out.println(set2);
		
}

11 Map 接口

Map接口称为键值对集合或者映射集合,其中的元素(entry)是以键值对(key-value)的形式存在。Map 容器接口中提供了增、删、改、查的方式对集合进行操作。Map接口中都是通过key来操作键值对,一般key是已知。通过key获取value。

11.1 Map 常用方法

public static void main(String[] args) {
		
		/**
		 * 增:put/putAll
		 * 删:clear/remove
		 * 改:put
		 * 查:get/containsKey/containsValue
		 * 其他:isEmpty/size
		 */
		
		Map<String, String> map = new HashMap<String,String>();
		
		// 【1】put
		map.put("A", "apple");
		map.put("B", "banana");
		map.put("C", "coco");
		
		// 【2】删除
		// map.clear();
		// smap.remove("A");
		
		// 【3】修改
		//map.put("A", "apple x");
		
		// 【4】查看
		String val = map.get("A");
		System.out.println(map.containsKey("D"));
		
		
		System.out.println(map);
}

11.2 Map 的遍历

  • 通过keySet() 返回map中键的set集合。
public static void main(String[] args) {

		Map<String, String> map = new HashMap<String,String>();
		
		map.put("B", "banana");
		map.put("A", "apple");
		map.put("C", "coco");
		// map无序
		// 可以根据key的自然顺序 让map有序  => 一般用string作为key
		System.out.println(map);
		
		
		// 遍历
		Set<String> keys = map.keySet();
		for (String key : keys) {
			System.out.println(key+"=>"+map.get(key));
		}
		
		Iterator<String> it = keys.iterator();
		while(it.hasNext()) {
			String key = it.next();
			System.out.println(key+"=>"+map.get(key));
		}
}
  • Map 中以键值对作为元素,键值对在map中称为entry,entrySet() 返回键值对的set集合,通过此集合遍历。
public static void main(String[] args) {

		Map<String, String> map = new HashMap<String,String>();
		
		map.put("B", "banana");
		map.put("A", "apple");
		map.put("C", "coco");
		// map无序
		// 可以根据key的自然顺序 让map有序  => 一般用string作为key
		System.out.println(map);
		
		// entrySet
		Set<Entry<String, String>> entrySet = map.entrySet();
		for (Entry<String, String> entry : entrySet) {
			System.out.println(entry.getKey()+"=>"+entry.getValue());
		}
		
		Iterator<Entry<String, String>> it2 = entrySet.iterator();
		while(it2.hasNext()) {
			Entry<String, String> entry = it2.next();
			System.out.println(entry.getKey()+"=>"+entry.getValue());
		}
}

12 HashMap

HashMap 是 Map 的实现类,key 以 HashSet 存储。HashMap 线程不安全,jdk1.2;Hashtable 是 HashMap 的线程安全版本,jdk1.0。向HashMap中存储元素时,key一定要实现 hashCode 和 equals。

13 LinkedHashMap

LinkedHashMap 是 Map 接口的实现类,key 以 LinkedHashSet 存储。哈希表散列key,链表维持key的添加顺序。

14 TreeMap

TreeMap 是 Map 的实现类,key 以 TreeSet 存储。key 如 TreeSet 一样要具有比较器。

15 总结

4491e3d54d91392dc3387e079e879ee1.png
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值