• 内功心法 -- java.util.ArrayList<E> (3)


    写在前面的话:读书破万卷,编码如有神
    --------------------------------------------------------------------
    下文主要对java.util.ArrayList<E>的6个常用查询操作进行介绍,主要内容包括:

    1、ArrayList查询操作

    参考内容:

    1、JDK源码(1.7)

    -------------------------------------------------------------------- 

    1. ArrayList常用的6个查询操作                                                       

    查询操作:

    (1) boolean contains(Object o)

    功能: 判断列表中是否有包含了元素o

    示例代码:

     1 public class ArrayListTest {
     2     public static void main(String[] args) {
     3         ArrayList<Integer> list = new ArrayList<Integer>();
     4         list.add(0,44);
     5         list.add(1,33);
     6         list.add(2,22);
     7         list.add(1,66);
     8         list.add(4,99);
     9         System.out.println("list :" + list);
    10         //测试ArrayList的boolean contains(Object o)方法的使用
    11         System.out.println("列表中是否包含了元素22 :"+list.contains(22));
    12         System.out.println("列表中是否包含了元素34 :"+list.contains(34));
    13         System.out.println("列表中是否包含了元素66 :"+list.contains(66));
    14     }
    15 }
    16 
    17 运行结果:
    18 list :[44, 66, 33, 22, 99]
    19 列表中是否包含了元素22 :true
    20 列表中是否包含了元素34 :false
    21 列表中是否包含了元素66 :true

    源代码如下:

    1 public boolean contains(Object o) {
    2         //内部是通过调用indexOf(Object o) 方法来实现的
    3         return indexOf(o) >= 0;
    4     }

    (2) E get(int index)

    功能: 返回列表index位置上的元素

    示例代码:

     1 public class ArrayListTest {
     2     public static void main(String[] args) {
     3         ArrayList<Integer> list = new ArrayList<Integer>();
     4         list.add(0,44);
     5         list.add(1,33);
     6         list.add(2,22);
     7         list.add(1,66);
     8         list.add(4,99);
     9         System.out.println("list :" + list);
    10         //测试ArrayList的E get(int index)方法的使用
    11         System.out.println("返回列表中下标索引为1的元素 :"+list.get(1));
    12         System.out.println("返回列表中下标索引为4的元素 :"+list.get(4));
    13         System.out.println("返回列表中下标索引为9的元素 :"+list.get(9));
    14     }
    15 }
    16 
    17 运行结果:
    18 list :[44, 66, 33, 22, 99]
    19 返回列表中下标索引为1的元素 :66
    20 返回列表中下标索引为4的元素 :99
    21 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 9, Size: 5
    22     at java.util.ArrayList.rangeCheck(Unknown Source)
    23     at java.util.ArrayList.get(Unknown Source)
    24     at ArrayListTest.main(ArrayListTest.java:16)

    源代码如下: 查看源码可以发现java.util.ArrayList<E>根据索引下标来获取元素的速度非常快

     1 public E get(int index) {
     2         //检查index是否合法
     3         rangeCheck(index);
     4         //内部调用elementData(int index)方法
     5         return elementData(index);
     6     }
     7 
     8 @SuppressWarnings("unchecked")
     9     E elementData(int index) {
    10         return (E) elementData[index];
    11     }

    (3) int indexOf(Object o)

    功能: 返回元素o在列表中的索引位置

    示例代码:

     1 public class ArrayListTest {
     2     public static void main(String[] args) {
     3         ArrayList<Integer> list = new ArrayList<Integer>();
     4         list.add(0,44);
     5         list.add(1,33);
     6         list.add(2,22);
     7         list.add(1,66);
     8         list.add(4,99);
     9         System.out.println("list :" + list);
    10         //测试ArrayList的'int indexOf(Object o)'方法的使用
    11         System.out.println("返回列表中元素为22的索引下标 :"+list.indexOf(22));
    12         System.out.println("返回列表中元素为66的索引下标 :"+list.indexOf(66));
    13         System.out.println("返回列表中元素为41的索引下标 :"+list.indexOf(41));
    14     }
    15 }
    16 
    17 运行结果:
    18 list :[44, 66, 33, 22, 99]
    19 返回列表中元素为22的索引下标 :3
    20 返回列表中元素为66的索引下标 :1
    21 返回列表中元素为41的索引下标 :-1

    源代码如下:

     1     public int indexOf(Object o) {
     2         if (o == null) {
     3             //元素o为null,循环列表中的元素查找
     4             for (int i = 0; i < size; i++)
     5                 if (elementData[i]==null)
     6                     return i;
     7         } else {
     8             //元素o不为null,循环列表中的元素查找
     9             for (int i = 0; i < size; i++)
    10                 if (o.equals(elementData[i]))
    11                     return i;
    12         }
    13         return -1;
    14     }

    (4) boolean isEmpty()

    功能: 判断列表是否为空,如果为空,返回true;如果不为空,返回false.

    示例代码:

     1 public class ArrayListTest {
     2     public static void main(String[] args) {
     3         ArrayList<Integer> list = new ArrayList<Integer>();
     4         list.add(0,44);
     5         list.add(1,33);
     6         list.add(2,22);
     7         list.add(1,66);
     8         list.add(4,99);
     9         System.out.println("list :" + list);
    10         //测试ArrayList的' boolean isEmpty()'方法的使用
    11         System.out.println("ArrayList列表是否为空: " + list.isEmpty());
    12     }
    13 }
    14 
    15 运行结果:
    16 list :[44, 66, 33, 22, 99]
    17 ArrayList列表是否为空: false

    源代码如下:

    1     public boolean isEmpty() {
    2         return size == 0;
    3     }

    (5) int lastIndexOf(Object o)

    功能: 查询元素o在列表中的索引位置(倒序查找)

    示例代码:

     1 public class ArrayListTest {
     2     public static void main(String[] args) {
     3         ArrayList<Integer> list = new ArrayList<Integer>();
     4         list.add(0,44);
     5         list.add(1,33);
     6         list.add(2,22);
     7         list.add(1,66);
     8         list.add(4,99);
     9         list.add(2,66);
    10         list.add(1,44);
    11         System.out.println("list :" + list);
    12         //测试ArrayList的'int lastIndexOf(Object o)'方法的使用
    13         System.out.println("ArrayList列表中元素33最后一次出现的索引位置: " + list.lastIndexOf(33));
    14         System.out.println("ArrayList列表中元素66最后一次出现的索引位置: " + list.lastIndexOf(66));
    15         System.out.println("ArrayList列表中元素55最后一次出现的索引位置: " + list.lastIndexOf(55));
    16     }
    17 }
    18 
    19 运行结果:
    20 list :[44, 44, 66, 66, 33, 22, 99]
    21 ArrayList列表中元素33最后一次出现的索引位置: 4
    22 ArrayList列表中元素66最后一次出现的索引位置: 3
    23 ArrayList列表中元素55最后一次出现的索引位置: -1

    源代码如下:

     1 public int lastIndexOf(Object o) {
     2         if (o == null) {
     3             //元素o为null,利用循环倒序查找null元素
     4             for (int i = size-1; i >= 0; i--)
     5                 if (elementData[i]==null)
     6                     return i;
     7         } else {
     8             //元素o不为null,利用循环倒序查找o元素
     9             for (int i = size-1; i >= 0; i--)
    10                 if (o.equals(elementData[i]))
    11                     return i;
    12         }
    13         return -1;
    14     }

    (6) int size()

    功能: 返回列表中元素的个数

    示例代码:

     1 public class ArrayListTest {
     2     public static void main(String[] args) {
     3         ArrayList<Integer> list = new ArrayList<Integer>();
     4         list.add(0,44);
     5         list.add(1,33);
     6         list.add(2,22);
     7         list.add(1,66);
     8         list.add(4,99);
     9         list.add(2,66);
    10         list.add(1,44);
    11         System.out.println("list :" + list);
    12         //测试ArrayList的'int size()'方法的使用
    13         System.out.println("ArrayList列表的size为: " + list.size());
    14     }
    15 }
    16 
    17 list :[44, 44, 66, 66, 33, 22, 99]
    18 ArrayList列表的size为: 7

    源代码如下:

    1     public int size() {
    2         return size;
    3     }

    --------------------------------------------------------------------------

    java.util.ArrayList系列文章                                                                

    java.util.ArrayList<E>(1)  java.util.ArrayList<E>(2)  java.util.ArrayList<E>(3)

    java.util.ArrayList<E>(4)  java.util.ArrayList<E>(5)  java.util.ArrayList<E>(6)

    相关知识                                                                                            

    java.util.Collection<E>   java.util.AbstractCollection<E>   java.util.List<E>

    java.util.AbstractList<E>   java.util.Iterator<E>   java.util.ListIterator<E>

    Java中的标记接口   迭代器模式   Java中的深拷贝和浅拷贝  java.util.Arrays

  • 相关阅读:
    电信网络拓扑图自动布局之总线
    长短链接区别-2
    TCP长连接与短连接的区别
    memset(&a, 0, sizeof(struct customer))函数
    linker command failed with exit code 1
    iOS “[App] if we're in the real pre-commit handler we can't actually add any new fences due
    iOS 获取屏幕某个区域的截图-b
    iOS-集成支付宝支付、微信支付简单总结
    邓白氏码的申请-iOS公司开发者账号准备
    iOS 自定义导航栏 和状态栏
  • 原文地址:https://www.cnblogs.com/xinhuaxuan/p/6354132.html
Copyright © 2020-2023  润新知