• Java~List接口详解


    目录

    List接口

     常见的List接口的实现类

    List接口中的特殊方法

    对象相等判定使用的是equals方法

    常见的List接口的实现类

    总结List的三种实现类

    List接口中的sort方法

    最佳匹配原则

    Set集合

    无序,不允许重复

    按照hashCode值进行比较,

    潜规则:

     实现类:

    HashSet

    TreeSet

    LinkedHashSet

     Java中采用补码的方式存储整数  [原码  反码  补码]


    List接口

    有序 允许重复public interface List extends Collection
    继承自Collection接口的方法
    boolean add(E e);向集合末尾追加元素e对象  
    boolean remove(Object obj)删除第一个和obj相等的元素,
    如果没有和obj相等元素,则报异常IndexOutOfBoundsException 

     常见的List接口的实现类


     ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)
     LinkedList:双向链表实现,增删快,查询慢 (线程不安全)
     Vector:数组实现,重量级 (线程安全、使用少)


    List接口中的特殊方法
     

    void add(int index, E element); 向指定索引位置index上添加元素element,
    原始数据自动后移

    E get(int index);  获取指定索引号对应的元素,index应该在[0,size-1]

    E set(int index, E element);  用于给指定索引位置上进行赋值,这个位
    置上必须有对应的数据(已经赋过值),这里实际上是修改操作,否则
    IndexOutOfBoundsException

    E remove(int index);删除指定位置的元素,可以返回原始位置上存储的元素
    int indexOf(Object o); 查找从左向右第一个o元素的下标索引,如果元素
    不存在返回-1
     
    int lastIndexOf(Object o);从右向左查找


    对象相等判定使用的是equals方法

    sort方法按照自定义比较器对集合中的所有元素进行排序,默认自然序
     default void sort(Comparator c) {
            Object[] a = this.toArray();  //将List集合对象转换为数组
            Arrays.sort(a, (Comparator) c);  //调用Arrays工具类中的排序方法对数组进行排序
            ListIterator i = this.listIterator();  //获取List集合对象中特殊的Iterator迭代器对象
            for (Object e : a) {  //foreach结构遍历数组中的所有元素
                i.next();
                i.set((E) e); //修改集合List中迭代器指定的当前位置上的元素
            }
        }

      list.sort(new Comparator() {
                public int compare(A2 o1, A2 o2) {
                    // 自定义比较规则,按照id从小到大,如果id相等则按照name从大到小
                    int res = o1.getId().compareTo(o2.getId());
                   if (res == 0)
                        res = (o1.getName().compareTo(o2.getName())) * -1;
                    return res;
                }
            });

    调用方法时要求传入参数为自定义比较器

    常见的List接口的实现类


    ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)
    LinkedList:双向链表实现,增删快,查询慢 (线程不安全)
    Vector:数组实现,重量级 (线程安全、使用少)

    总结List的三种实现类

    总结List的三种实现类
    ArrayList LinkedListVector
    实现方式数组,按照索引下标访问速度快O(1),但是当删除添加元素时会导致元素的移动,速度慢O(n)双向链表,按照索引下标访问速度慢O(n),但是删除添加元素速度快O(1)数组,按照索引下标访问速度快O(1),但是当删除添加元素时会导致元素的移动,速度慢O(n)
    是否同步不同步,线程不安全,但是并发高,访问效率高不同步,线程不安全,但是并发高,访问效率高 o  同步,所以线程安全,但是并发低,访问效率低
    如何选择经常需要快速访问,较少在中间增加删除元素时使用;如果多线程访问,则需要自行编程解决线程安全问题经常需要在内部增删元素,但是很少需要通过索引快速访问时使用;如果多线程访问,则需要自行编程解决线程安全问题一般不使用,如果在多线程访问时可以考虑使用 

    List接口中的sort方法

    1. package com.yan2;
    2. import java.util.ArrayList;
    3. import java.util.Comparator;
    4. import java.util.List;
    5. /*
    6. * List接口中的sort方法
    7. */
    8. public class Test2 {
    9. public static void main(String[] args) {
    10. List list = new ArrayList();
    11. list.add(new A2(99L, "zhangsan"));
    12. list.add(new A2(77L, "lisi"));
    13. list.add(new A2(99L, "wangwu"));
    14. list.sort(new Comparator() {
    15. public int compare(A2 o1, A2 o2) {
    16. // 自定义比较规则,按照id从小到大,如果id相等则按照name从大到小
    17. int res = o1.getId().compareTo(o2.getId());
    18. if (res == 0)
    19. res = (o1.getName().compareTo(o2.getName())) * -1;
    20. return res;
    21. }
    22. });
    23. list.forEach(System.out::println);
    24. }
    25. }
    26. class A2 {
    27. private Long id;
    28. private String name;
    29. public A2(Long id, String name) {
    30. this.id = id;
    31. this.name = name;
    32. }
    33. // ===================================
    34. public Long getId() {
    35. return id;
    36. }
    37. public void setId(Long id) {
    38. this.id = id;
    39. }
    40. public String getName() {
    41. return name;
    42. }
    43. public void setName(String name) {
    44. this.name = name;
    45. }
    46. @Override
    47. public String toString() {
    48. return "A2 [id=" + id + ", name=" + name + "]";
    49. }
    50. }

    最佳匹配原则

    1. package com.yan2;
    2. import java.util.ArrayList;
    3. import java.util.Date;
    4. import java.util.List;
    5. import java.util.Random;
    6. public class Test6 {
    7. public static void main(String[] args) {
    8. List list = new ArrayList();
    9. list.add(100);
    10. for (int i = 0; i < 5; i++)
    11. list.add(i);
    12. list.remove(4);//最佳匹配原则
    13. list.remove(Integer.valueOf(100)); //参数是Object
    14. for (int i = 0; i < list.size(); i++)
    15. System.out.println(list.get(i));
    16. }
    17. }

    Set集合

    无序,不允许重复

    public interface Set extends Collection
    没有新方法
    boolean add(E e);向集合中追加元素e对象,如果出现重复则后添加数据直接丢弃如果进行对象相等比较:
    首先调用当前对象所属类中的hashCode方法获取当前对象的hashCode值


    按照hashCode值进行比较,


    如果hashCode值不相等,则不会调用equals方法,直接得出结论两个对象不相等
    如果hashCode值相等,才调用equals方法进行进一步判断
    如果equals为真则判断两个对象相等

    潜规则:


     java要求当两个对象的equals为true时,要求两个对象的hashCode值相等。
            hashCode值相等并不一定equals为true


     实现类:


    HashSet


    TreeSet


    LinkedHashSet

    1. package com.yan3;
    2. import java.util.HashSet;
    3. import java.util.Objects;
    4. import java.util.Set;
    5. public class Test1 {
    6. public static void main(String[] args) {
    7. Set set = new HashSet();
    8. set.add(new A1(99L, "zhangsan"));
    9. set.add(new A1(88L, "lisi"));
    10. set.add(new A1(99L, "wangwu"));
    11. set.forEach(System.out::println);
    12. }
    13. }
    14. class A1 {
    15. private Long id;
    16. private String name;
    17. @Override
    18. public int hashCode() {
    19. System.out.println(this+"::hashcode()");
    20. return id.hashCode();
    21. }
    22. //比较规则为:按照id进行比较,如果id相等则对象相等
    23. public boolean equals(Object obj) {
    24. System.out.println(this+"::equals()");
    25. if (this == obj)
    26. return true;
    27. if (obj == null)
    28. return false;
    29. if (getClass() != obj.getClass())
    30. return false;
    31. A1 other = (A1) obj;
    32. return Objects.equals(id, other.id);
    33. }
    34. public A1(Long id, String name) {
    35. super();
    36. this.id = id;
    37. this.name = name;
    38. }
    39. public Long getId() {
    40. return id;
    41. }
    42. public void setId(Long id) {
    43. this.id = id;
    44. }
    45. public String getName() {
    46. return name;
    47. }
    48. public void setName(String name) {
    49. this.name = name;
    50. }
    51. @Override
    52. public String toString() {
    53. return "A1 [id=" + id + ", name=" + name + "]";
    54. }
    55. }

     Java中采用补码的方式存储整数  [原码  反码  补码]

    1. package com.yan4;
    2. public class Test1 {
    3. public static void main(String[] args) {
    4. // Java中采用补码的方式存储整数 [原码 反码 补码]
    5. //位运算 <<左移位 >>右移位
    6. int kk=12; //00000000 00000000 00000000 001100
    7. System.out.println(Integer.toBinaryString(kk));
    8. int k1=kk>>3;//00000000 00000000 00000000 000001 --1 相当于计算12/2的3次方
    9. System.out.println(k1);
    10. System.out.println(Integer.toBinaryString(k1));
    11. int kk1=3;
    12. int kk2=kk1<<4; //相当于是3*2的4次方
    13. System.out.println(kk2);
    14. int kk3=Integer.MAX_VALUE-1;
    15. System.out.println(kk3+10); //-2147483640
    16. }
    17. }

  • 相关阅读:
    【后端框架】MyBatis(3)
    年底旺季,Shopee、Lazada如何通过测评补单技术打造产品权重收割流量
    搭建网关服务器实现DHCP自动分配、HTTP服务和免密登录
    Xcode与Swift开发小记
    windows10下安装fbprophet及使用虚拟环境
    【React】portal
    道德经学习202220820
    SpringCloud 微服务全栈体系(六)
    【Android安全】Kotlin基础
    Spring Boot
  • 原文地址:https://blog.csdn.net/qq_51222096/article/details/126494435