List,Set和Map三种集合

Lsit

List是从Collection继承过来,也是一个接口;List是一个有序集合:内部的元素存储可以按照规定的顺序存储,可以通过索引获取指定位置的元素;新增方法:

  • get(int index) 根据索引获取元素
  • set(int index,E e) 向指定的位置插入元素
  • remove(int index) 删除指定索引处的元素
  • listIterator() 获取一个列表迭代器(有序)

ArrayList

从名字可以看是时List接口的实现类,ArrayList是基于对象数组的实现,初始容量为10
当new出来时还无初始容量,当执行第一个add方法时容量就变成10.之后没当容量超出时,会扩容为原来的1.5倍(内部时位运算的实现)

LinkedList

LinkedList是基于链表的List实现,元素之间通过首尾指针连接,在进行修改(增加,删除)时只需要修改元素的首尾指针即可,修改效率要比ArrayList高,但是在查询时,由于LinkedList没有像ArrayList的索引,在查询时需要从链表的第一个元素开始依次向搜索,所以查询效率较低。

ArryList,LinkedList的区别

  • ArrayList查快改慢;LinkedList改快查慢
  • ArrayList是基于对象数组的实现,内部通过数组拷贝实现扩容;LinkedList是基于链表的实现,同时实现的队列(双端队列)
  • ArrayList由于基于数组实现,因此在搜索元素时可直接通过索引快速定位到元素位置,查询效率较高;LinkedList由于基于链表实现,在查询时需要从链表头开始依次查找,查询效率较低。
  • 由于数组的长度一旦定义则无法修改,因此在进行非末端更新(插入和删除)时,由于可能涉及到数组拷贝问题,因此修改效率较低;LinkedList在进行元素更新操作时,只需要修改元素首尾指针的指向即可,更新效率较高。
  • 两者都是线程不同步的实现

Set

相比List集合来说,Set集合内部存储的数据不是按照添加顺序存储,内部不允许出现重复的元素(不允许出现e1.equals(e2)),对null也只允许出现一个,对于set集合常用的实现主要有以下:

  • HashSet(哈希表-散列表)
  • TreeSet(二叉树-红黑树)
  • LinkedHashSet

HashMap

HashSet是针对于Set集合的实现,内部基于HashMap的实现,在进行元素存储时,会对每一个存储的元素进行hash(),获取一个哈希地址,通过该hash地址可以找到对象在内存的位置,因此存储方式跟具体得出的hash值有关系,因此存储顺序可能会跟添加顺序不一致。

public class SetDemo {

	public static void main(String[] args) {
		
		List<String> list = new ArrayList<>();
		list.add("helloworld");
		list.add("rose");
		list.add("helloworld");
		list.add("rose");
		System.out.println(list);
		
		
		Set<String> set = new HashSet<String>();
		set.add("admin");
		set.add("hello");
		set.add("lily");
		set.add("admin");
		System.out.println(set);
		
		Set<User> users = new HashSet<User>();
		users.add(new User(1, "admin"));
		users.add(new User(2, "softeem"));
		users.add(new User(1, "admin"));
		System.out.println(users);
		
		//语法糖
		for(String s:set) {
			System.out.println(s);
//			if(s.equals("lily")) {
//				set.remove(s);
//			}
		}
		//获取set集合的迭代器
		Iterator<String> it = set.iterator();
		while(it.hasNext()) {
			String s = it.next();
			System.out.println(s);
			if(s.equals("lily")) {
				//对集合迭代时需要删除元素只能通过迭代器自生的remove方法
				//否则就会出现ConcurrentModificationException
				it.remove();
			}	
		}
		System.out.println(set);
		
		//根据提供的Collection对象构建一个HashSet
		Set<String> set2 = new HashSet<>(list);
		System.out.println(set2);
	}
}

TreeSet

TreeSet集合是基于TreeMap的Set集合实现,内部元素的存储根据元素的自然顺序(存储的元素需要实现Comparable接口)排序;由于元素是自然顺序排序的实现,因此需要保证集合内部存储的元素必须都是相同的数据类型。

Map(映射)

Map也称之为映射,内部的元素是以键值对为结构存储,可以通过key获取map中的value;Key不允许重复;但是值是可以重复的,Map集合有一些常见的实现:

  • HashMap
  • TreeMap
  • ConcurrentHashMap

HashMap

HashMap是Map集合一个实现,内部是基于哈希表的排序实现元素存储的,实现原理是链表+数组(JDK8之后引入红黑树)

public class HashMapDemo {

   public static void main(String[] args) {

   	Map<String, String> map = new HashMap<>();
   	map.put("d", "davied");
   	map.put("a", "allen");
   	map.put("c", "allen");
   	map.put("b", "bob");

   	System.out.println(map);

   	Map<String, Object> user = new HashMap<>();
   	user.put("id", 10);
   	user.put("name", "狗蛋");
   	user.put("birth", LocalDate.of(1999, 11, 11));
   	System.out.println(user);

   	// 根据键获取值
   	Object name = user.get("name");
   	System.out.println(name);

   	// 如何遍历Map集合
   	// 获取Map集合键值对的Set集合(Map转换成Set)
//		Set<Map.Entry<String, Object>> set = user.entrySet(); 
//		for (Entry<String, Object> e : set) {
//			System.out.println(e.getKey()+"-----"+e.getValue());
//		}

   	// 获取map集合的键集
   	Set<String> keys = user.keySet();
   	for (String k : keys) {
   		// 根据键获取值
   		Object v = user.get(k);
   		System.out.println(k + "/" + v);
   	}
   	//移除指定键对应的元素
   	user.remove("id");
   	//修改指定键对应的值
   	user.replace("name", "隔壁老王");
   	System.out.println(user);
   	//获取集合中元素的个数
   	System.out.println(user.size());
   }

}

TreeMap

Treemap的实现是基于二叉排序树中的红黑树实现,所存储的元素要求键必须是同一种数据类型,并且有实现过Comparable接口(或者创建TreeMap时指定排序比较器)

HashMap、TreeMap的区别

  1. HashMap是基于hash算法的实现,内不通过数组结合链表实现,允许空键值存在,是线程不同步的实现
  2. TreeMap是基于红黑树的实现,内部元素的存储顺序是由自然顺序对键进行排序之后存储,是线程不同步的实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值