list接口及其常用方法

  1 import org.junit.Test;
  2 
  3 import java.util.ArrayList;
  4 import java.util.Arrays;
  5 import java.util.Iterator;
  6 import java.util.List;
  7 
  8 
  9 /**
 10  * 1.list接口框架
 11  * /----Collection接口:单列集合,用来存储一个一个的对象
 12  *    /----list接口:存储有序的、可重复的数据。 ---> “动态”数组,替换原有的数组
 13  *        /----ArrayList:作为List接口的主要实现类,线程不安全的,效率高的,底层使用Object[]存储
 14  *        /----LinkedList:,对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储
 15  *        /----Vector:作为List接口的古老实现类,线程安全的,效率不高的,底层使用Object[]存储
 16  *
 17  *   2. ArrayList的源码分析:
 18  *      2.1 jdk 7 情况下:
 19  *        ArrayList list = new ArrayList();//底层创建了长度为10的 Object[] 数组elementData
 20  *        list.add(1);//elementData[0] = new Integer(1);
 21  *        ...
 22  *        List.add(11);如果此次添加导致底层elementData数组容量不够,则扩容。默认情况下,扩容为原来的1.5倍,同时需要将原有数组的数据复制
 23  *        到新的数组中。
 24  *
 25  *        结论:建议开发中使用带参的构造器:ArrayList list = new ArrayList(int initialCapacity);
 26  *
 27  *     2.2 jdk 8 中ArrayList的变化:
 28  *        ArrayList list = new ArrayList();//底层Object[] elementData 初始化为 {},并没有创建长度为10的数组
 29  *
 30  *        list.add(123);//第一次调用add()时,底层才创建了长度为10的数组,并将数据123添加到elementData[0]
 31  *           ...
 32  *        后续的添加和扩容操作和jdk 7无异。
 33  *      2.3小结:jdk 7中的ArrayList的对象的创建类似于单例模式中的饿汉式,而jdk8中ArrayList的对象的创建类似于单例的懒汉式,
 34  *             延迟了数组的创建,节省了内存。
 35  *
 36  *    3.linkedList的源码分析:
 37  *        LinkedList list = new LinkedList(); //内部声明了Node类型的first和last属性,默认值为null,
 38  *        list.add(123);//将123封装到Node中,创建了Node对象。
 39  *
 40  *        其中Node定义:体现了LinkedList的双向链表的说法
 41  *            private static class Node<E> {
 42  *         E item;
 43  *         Node<E> next;
 44  *         Node<E> prev;
 45  *
 46  *         Node(Node<E> prev, E element, Node<E> next) {
 47  *             this.item = element;
 48  *             this.next = next;
 49  *             this.prev = prev;
 50  *         }
 51  *     }
 52  *
 53  *
 54  * 面试题:比较ArrayList,LinkedList,Vector三者的异同?
 55  * 同:三个类都实现了List接口,存储数据相同:存储有序的、可重复的数据
 56  * 不同:见上
 57  *
 58  *   4.List接口中的常用方法
 59  *     void add(int index, Object ele):在index位置上插入ele元素
 60  *     boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素加进来
 61  *     Object get(int index):获取指定位置的元素
 62  *     int indexOf(Object obj):返回obj在集合中首次出现的位置
 63  *     int lastIndexOf(Object obj):返回obj在集合中最后一次次出现的位置
 64  *     Object remove(int index):移除指定index位置上的元素,并返回此元素
 65  *     Object set(int index, Object ele):设置指定index位置的元素为ele
 66  *     List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子元素
 67  *
 68  * 总结:常用方法
 69  * 增:add(Object)
 70  * 删:remove(int index)/remove(Object obj)
 71  * 改:set(int index, Object ele)
 72  * 查:get(int index)
 73  * 插:add(int index, Object ele)
 74  * 长度:size()
 75  * 遍历: ① Iterator迭代器方式
 76  *      ②增强for循环
 77  *      ③普通的循环
 78  * @author FuJingchao
 79  * @Date: 2021/12/17 - 20:30
 80  */
 81 public class ListTest {
 82     /*
 83 List接口中的常用方法测试
 84      */
 85     @Test
 86     public void test1(){
 87         ArrayList list  = new ArrayList();
 88         list.add(123);
 89         list.add(456);
 90         list.add("AA");
 91         list.add(new Person("Tom",12));
 92         list.add(456);
 93 
 94         System.out.println(list);//[123, 456, AA, Person{name='Tom', age=12}, 456]
 95 
 96         // void add(int index, Object ele):在index位置上插入ele元素
 97         list.add(1,"BB");
 98         System.out.println(list);//[123, BB, 456, AA, Person{name='Tom', age=12}, 456]
 99 
100         //boolean addAll(int index,Collection eles):从index位置开始将eles中的所有元素加进来
101         List list1 = Arrays.asList(1, 2, 3,4,5);
102         list.addAll(list1);
103         System.out.println(list.size());//11
104         System.out.println(list);//[123, BB, 456, AA, Person{name='Tom', age=12}, 456, 1, 2, 3, 4, 5]
105 
106         //Object get(int index):获取指定位置的元素
107         System.out.println(list.get(1));//BB
108 
109     }
110 
111     @Test
112     public void test2(){
113         //int indexOf(Object obj):返回obj在集合中首次出现的位置,没有的话返回-1
114         //int lastIndexOf(Object obj):返回obj在集合中最后一次出现的位置,没有的话返回-1
115         ArrayList list  = new ArrayList();
116         list.add(123);
117         list.add(456);
118         list.add("AA");
119         list.add(new Person("Tom",12));
120         list.add(456);
121 
122         System.out.println(list.indexOf(456));//1
123         System.out.println(list.lastIndexOf(456));//4
124 
125         //Object remove(int index):移除指定index位置上的元素,并返回此元素
126 //        list.remove(3);
127 //        System.out.println(list);//[123, 456, AA, 456]
128 
129         //Object set(int index, Object ele):设置指定index位置的元素为ele
130         list.set(1,"gg");
131         System.out.println(list);//[123, gg, AA, Person{name='Tom', age=12}, 456]
132 
133         //List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的左闭右开的子集合
134         System.out.println(list.subList(1,3));//[gg, AA]
135     }
136     @Test
137     public void test3(){
138         //遍历
139         ArrayList list  = new ArrayList();
140         list.add(123);
141         list.add(456);
142         list.add("AA");
143         list.add(new Person("Tom",12));
144         list.add(456);
145 
146         //方式一
147         Iterator iterator = list.iterator();
148         while (iterator.hasNext()){
149             System.out.println(iterator.next());
150         }
151         System.out.println("*****************");
152 
153         //方式二
154         for(Object obj : list){
155             System.out.println(obj);
156         }
157         System.out.println("******************");
158 
159         //方式三
160         for (int i = 0; i < list.size(); i++) {
161             System.out.println(list.get(i));
162         }
163     }
164 }

 

 1 /**
 2  * @author fu jingchao
 3  * @creat 2021/12/8-14:53
 4  */
 5 public class Person {
 6     private String name;
 7     private int age;
 8 
 9     public Person() {
10     }
11 
12     public Person(String name, int age) {
13         this.name = name;
14         this.age = age;
15     }
16 
17     public String getName() {
18         return name;
19     }
20 
21     public void setName(String name) {
22         this.name = name;
23     }
24 
25     public int getAge() {
26         return age;
27     }
28 
29     public void setAge(int age) {
30         this.age = age;
31     }
32 
33     @Override
34     public String toString() {
35         return "Person{" +
36                 "name='" + name + '\'' +
37                 ", age=" + age +
38                 '}';
39     }
40 
41     @Override
42     public boolean equals(Object o) {
43         System.out.println("Person equals()....");
44         if (this == o) return true;
45         if (o == null || getClass() != o.getClass()) return false;
46 
47         Person person = (Person) o;
48 
49         if (age != person.age) return false;
50         return name != null ? name.equals(person.name) : person.name == null;
51     }
52 
53 //    @Override
54 //    public int hashCode() {
55 //        int result = name != null ? name.hashCode() : 0;
56 //        result = 31 * result + age;
57 //        return result;
58 //    }
59 }

 

上一篇:linux 操作系统级别监控 iostat 命令


下一篇:Android Studio编译并集成SO文件