1、List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合;
2、List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,它的键是不允许重复的,但是值是允许重复的;Set中存储的数据是无顺序的,并且不允许重复,但元素在集合中的位置是由元素的hashcode决定,即位置是固定的(Set集合是根据hashcode来进行数据存储的,所以位置是固定的,但是这个位置不是用户可以控制的,所以对于用户来说set中的元素还是无序的)。
Collection是一个接口,与MAP接口是同级的
Collection代表的是单个元素对象的序列,(可以有序/无序,可重复/不可重复 等,具体依据具体的子接口Set,List,Queue等);Map代表的是“键值对”对象的集合(同样可以有序/无序 等依据具体实现)
LIST:
List继承于 Collection 接口。List 是有序的 Collection,List 允许有重复元素,实现 List 接口的常用类有 LinkedList,ArrayList,Vector ;
用法:
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查找,所以随机访问和遍历速度慢。而且,因为他有专门定义的操作表头和表尾元素的方法,可以当作堆,栈,队列和双向队列使用。
ArrayList与linkList之间的差别
ArrayList进行查询时,可以通过下标的方式,快速找到对应内容,时间系数为1,;但是他在进行插入时,相对会比较慢,需要将插入位置后面的数组全部都往后移动对应的位数;删除一样,向前移动对应位数
较常适用于查多改少的场景
linkList:链表结构,他是以这种结构展示,如果需要进行查询时,需要遍历所有的数据进项查询,相对比较复杂;而进行数据插入时,只需要将pre指向上一个数据的next,next指向下一个数据pre。他的时间系数也是为1;
较常使用于查少改多的场景
Vector
也是通过数组实现。不同的是,它支持线程的同步,每个时刻只能有一个线程对他进行修改,因此同步花费的时间会使Vector相比较于ArrayList要慢。他是线程安全的
List总结
- List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。查找元素效率高,插入删除效率低,因为会引起其他元素位置改变
- List接口是一个有序的 可以有重复元素的
- 使用场景的选择:
- 对于需要快速插入、删除元素,则需使用LinkedList。
- 对于需要快速访问元素,则需使用ArrayList。
- 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总结
- 不允许存储重复元素(根据重写hashCode()和equals()方法来判断是不是同一对象)。
- 没有索引,没有带索引的方法,所以也就不能使用普通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 键;