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

相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui