map、list、set之间的差别

1、List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合;
2、List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。
 

Collection是一个接口,与MAP接口是同级的

         Collection代表的是单个元素对象的序列,(可以有序/无序,可重复/不可重复 等,具体依据具体的子接口SetListQueue等);Map代表的是键值对对象的集合(同样可以有序/无序 等依据具体实现)

LIST

       List继承于 Collection 接口。List 是有序的 CollectionList 允许有重复元素,实现 List 接口的常用类有 LinkedListArrayListVector

用法:

package javaTest;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ShuzuTest {
	public static void main(String[] args) {
		
		List<String> li=new ArrayList<String>();
		li.add("aaa");
		li.add("dfa");
		li.add("32");
		System.out.println(li);
		li.add(1, "di");
		System.out.println(li);
		System.out.println(li.get(2));
		
}
}

结果:

 

 

ArrayList

最常见的List实现类,内部是通过数组实现的,又名动态数组。允许对元素进行快速随机访问,可以动态添加或者删除元素。每次添加新元素时,ArrayList都会检查是否需要进行扩容操作,默认是原来的50%。

Array 和 ArrayList的不同

Array即数组,他是静态的,一旦初始化后,长度就不能改变了。而动态数组ArrayList可以随时对元素进行增删。所以,当我们不知道有多少个元素时,我们用ArrayList,如果知道有多少个元素,就用Array。

LinkList

用链表结构储存数据,适合数据的动态插入和删除,但是因为不支持直接按index查找,所以随机访问和遍历速度慢。而且,因为他有专门定义的操作表头和表尾元素的方法,可以当作堆,栈,队列和双向队列使用。

ArrayListlinkList之间的差别

ArrayList进行查询时,可以通过下标的方式,快速找到对应内容,时间系数为1,;但是他在进行插入时,相对会比较慢,需要将插入位置后面的数组全部都往后移动对应的位数;删除一样,向前移动对应位数

较常适用于查多改少的场景

linkList:链表结构,他是以这种结构展示,如果需要进行查询时,需要遍历所有的数据进项查询,相对比较复杂;而进行数据插入时,只需要将pre指向上一个数据的nextnext指向下一个数据pre。他的时间系数也是为1

较常使用于查少改多的场景

Vector

也是通过数组实现。不同的是,它支持线程的同步,每个时刻只能有一个线程对他进行修改,因此同步花费的时间会使Vector相比较于ArrayList要慢。他是线程安全的

List总结

  1. List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变
  2. List接口是一个有序的 可以有重复元素的
  3. 使用场景的选择:
    1. 对于需要快速插入、删除元素,则需使用LinkedList。
    2. 对于需要快速访问元素,则需使用ArrayList。
    3. List只能被一个线程操作,如果是多线程环境,List可能同时被多个线程操作,造成错误 考虑使用同步的类(如Vector)。


作者:无名小辈day
链接:https://juejin.cn/post/7014007733074526221
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Set

set也是实现collection接口

Set中,值不能重复,对象相等性本质是对象hashcode值判断的。

用法:

package javaTest;

import java.util.HashSet;
import java.util.Set;

public class ShuzuTest {
	public static void main(String[] args) {
		Set test = new HashSet<>();
		test.add(1);
		test.add(2);
		test.add(2);
		test.add("dhdfj");
		System.out.println(test);
		System.out.println(test.size());
	}
}

 执行结果:

Set总结

  1. 不允许存储重复元素(根据重写hashCode()和equals()方法来判断是不是同一对象)。
  2. 没有索引,没有带索引的方法,所以也就不能使用普通for循环。

MAP:

用法:

Map<String, String> map=new HashMap<String, String>();
		map.put("name", "xiaoming");
		map.put("123", "xiaohua");
		System.out.println(map);

 结果:

 

可以看出Map接口与Collection接口没有任何关系 是与Collection接口同等级的 是第二大集合操作接口

Map是键值对集合 以 key:value保存(是成对出现的),其中的key是唯一的标识;

使用Collection集合就不容易保存 但是使用键值对的方式就比较简单;

map中有HashMap实现类

2.1 HashMap
基于 hash 表的 Map 接口实现,非线程安全,高效,支持 null 值和 null
键;
2.2 HashTable
线程安全,低效,不支持 null 值和 null 键;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值