android List,Set,Map区别和介绍

List

元素存放有序,元素可重复

1.LinkedList

链表,插入删除,非线性安全,插入和删除操作是双向链表操作,增加删除快,查找慢

javascript 复制代码
add(E e)//添加元素
addFirst(E e)//向集合头部添加元素
addList(E e)//向集合尾部添加元素
getLast() //获取集合最后一个元素
removeFirst()//移除集合中第一个元素
pop()//移除集合中第一个元素
removeLast()//移除集合中最后一个元素
clear() //清除列表
isEmpty()//判断集合是否为空
2.ArrayList

数组,随机访问,非线性安全,效率高,增加删除慢,查找快

添加

javascript 复制代码
add(E e)
add(int index,E e)//指定位置添加

set(int index,E e)//替换某个有毒,返回被替换的因素

List<String> list = new ArrayList<>();//多态写法
list.add("1");
list.add("2");
list.add("3");
System.out.println(list);
//替换某个元素,并返回被替换的元素
String a = list.set(1, "A");
System.out.println("被替换的元素为:" + a);
System.out.println(list);
 
打印结果:
[1, 2, 3]
被替换的元素为:2
[1, A, 3]
//迭代遍历
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

删除

javascript 复制代码
remove(int index)//移除指定索引元素
remove(Object o)
//建议采用遍历器进行删除
Iterator<String> iter = aList.iterator();  
        while(iter.hasNext()){  
            if(iter.next().equals("abc")){  
                iter.remove();   
            }  
3.Vector

数组,线程安全,效率低,支持添加,移除,替换,允许null的因素存在。

Set

元素存放无序(存放元素和取出的顺序可能不一样),元素不重复,但是对象需要重写hasCode和equals进行去重,没有索引所以不能使用普通for循环遍历

1.HashSet

不安特定方式排列,没有重复元素会对添加的元素进行去重,采用哈希算法来存取集合元素,存取速度比较快。

javascript 复制代码
add(E e)//添加元素,自动去重

Set<Integer> set = new HashSet<>();
set.add(1);
set.add(2);
set.add(2);
//使用功能迭代器遍历,不能使用普通for遍历
Iterator<Integer> iterator = set.iterator();
while (iterator.hasNext()){
   System.out.println(iterator.next());
}
打印结果:
1
2

如果是HashSet存储自定义类型的元素,比如bean对象,需要重写hasCode和equals进行去重

javascript 复制代码
public class Person {
   private String name;
   private int age;
   public Person() {
   }
   public Person(String name, int age) {
       this.name = name;
       this.age = age;
   }

   @Override
   public String toString() {
       return "Person{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
   }
   @Override
   public boolean equals(Object o) {
       if (this == o) return true;
       if (o == null || getClass() != o.getClass()) return false;
       Person person = (Person) o;
       return age == person.age &&
               Objects.equals(name, person.name);
   }
   @Override
   public int hashCode() {
       return Objects.hash(name, age);
   }
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   public int getAge() {
       return age;
   }
   public void setAge(int age) {
       this.age = age;
   }
}

//创建HashSet集合存储Person
       HashSet<Person> people = new HashSet<>();
       Person person1 = new Person("aa", 15);
       Person person2 = new Person("ww",16);
       Person person3 = new Person("ww",16);
       people.add(person1);
       people.add(person2);
       people.add(person3);
       System.out.println(people);
       输出:[Person{name='aa', age=15}, Person{name='ww', age=16}]
2.LinkedHashSet

具有HashSet的查询速度,底层是一个哈希表,数组+链表/红黑树+链表,多了一条链表记录元素存储顺序,

存储数据的方式和HashSet一样,包括去重的方式,唯一的不一样点就是LinkedHashSet内部是有序的

Map

元素按键值对存储,无序 ;

key和value一一对应关系;

key和value的数据类型可以相同也可以不同;

key不允许重复,value可以重复;

1.HashMap

非线程安全,无序,支持存储键值均为null,没有contains方法,改成containsValue和containsKey,内存初始大小16

2.LinkedHashMap

有序,支持存储键值均为null

HashTable

线程安全,存储键值不能为null,有contains方法,内存初始大小11

相关推荐
OkeyProxy10 小时前
設置Android設備全局代理
android·代理模式·proxy模式·代理服务器·海外ip代理
刘志辉11 小时前
vue传参方法
android·vue.js·flutter
心怀花木12 小时前
【C++】模拟实现list
c++·stl·list
前期后期13 小时前
Android OkHttp源码分析(一):为什么OkHttp的请求速度很快?为什么可以高扩展?为什么可以高并发
android·okhttp
轻口味16 小时前
Android应用性能优化
android
全职计算机毕业设计16 小时前
基于 UniApp 平台的学生闲置物品售卖小程序设计与实现
android·uni-app
dgiij16 小时前
AutoX.js向后端传输二进制数据
android·javascript·websocket·node.js·自动化
SevenUUp17 小时前
Android Manifest权限清单
android
高林雨露17 小时前
Android 检测图片抓拍, 聚焦图片后自动完成拍照,未对准图片的提示请将摄像头对准要拍照的图片
android·拍照抓拍
wilanzai18 小时前
Android View 的绘制流程
android