Arraylist 学习笔记


/**
 * 比如collection接口的设计一样,可能会定义一个容器需要的相关方法,但是他在提供一个AbstractCollection的抽象方法,把相关能通用的方法进行封装实现,
 * 后面的容器直接继承AbstractCollection,将需要重写的方法实现,其他abstractCollection实现的方法就不用再次实现:但是注意AbstractCollection的add方法因为考虑到线程安全问题是直接抛出的异常
 *  必须重写的方法,因为在继承的AbstractCollection中,方法是用的Abstract修饰的,没有方法体。
 */

//public class ArrayList_1 {

    /**   ArrayList --extends --- AbstractArrayList: 抽象的类,此类也是实现了Lsit接口,对其中简单的方法进行了实现
     *    ArrayList -- implements -- List: 接口,其实在AbstractArrayList已经实现了该List接口,但是这样再次实现一次的好处在于使用代理模式的时候,
     *    能够直接基于List接口去新建一个代理类,不然是会报错的,详情见:
     *    http://www.cnblogs.com/bluejavababy/p/4320545.html
     *
     *    List -- implements -- collection:
     *    AbstractArrayList -- extends -- AbstractCollections: 所以对于容器的基本实现和方法,在AbstractCollection就已经实现,不用再次编写。
     *
     *    注意:ArrayList是一个线程不安全的类,在实现的时候不能保证其原子性,具体的实现可以通过同步锁(synchronized)或者collections类的方法
     *
     *    假定是自己来对一个动态数组容器ArrayList进行实现:
     *    1、新增(首部、尾部、任意位置):
     *          public void add(int index, E element) 因为是数组默认数据是插入在数组首部的,尾部就用size - 1来表示;注意插入的元素的类型,特别是字符型和char类型
     *    2、删除(首部、尾部、任意位置)
     *          public boolean remove(int index) ,根据指定位置进行删除
     *          public boolean remove(Object o) ,根据指定值进行删除,删除的时候有多个重复的,则删除第一个
     *    3、修改(任意位置)
     *          public E set(int index), 修改指定位置的值,把修改以前的值返回回来,当下标不存在报错
     *    4、查询(循环)
     *          public E get(int index) , 查询某个ArrayList的下标对应的值
     *    5、复制(复制collection)
     *
     *    6、比较(内容大小)
     *    7、排序
     *         Comparator: public void ArrayList.sort(Comparator<? super E> c): 排序一共有两种方式:
     *         1、自定义一个内部内: Comparator comparator = new Comparator(){
     *             public int compare(Object o1, Object o2) {
     *                 return
     *             }
     *         }
     *         Collections.sort(list, comparator);
     *         2、使用ArrayList.sort()方法:
     *         ArrayList.sort(new Comparator(){
     *             public int compare(Object o1, Object o2) {
     *                 return o1.getAge() - o2.getAge();
     *             }
     *         })
     *    8、查找元素所在位置
     *          public int indexOf(E e);
     *    9、是否包含某个元素
     *          public boolean contains(E e);
     *    10、循环
     *      1、for
     *      2、forEach
     *      3、iterator
     *    对于为什么需要三种遍历方式的理解:
     *        *  1、为什么需要iterator:
     *        *      a: for循环已经能够对集合进行遍历,但是这个遍历的前提是我们不需知道集合里元素的具体细节或者说元素的长度等信息,而iterator就是为了隐藏集合的内部细节,
     *        *      让集合的内容对使用者完全透明
     *        *      b: 在使用for的过程中是可以删除和新增的,但是这会造成list的size变化,很容易造成不必要的bug.
     *        *      c: foeEach其实是对iteartor的一层封装,但是在forEach的循环中是不允许删除和新增元素的。在看是ForEach的时候,就相当于锁住了list的size
     *        *      d:iterator的使用中相当于使用指针
     *           2、对性能的比较暂时没有出结果,可能是自己的比较方式有问题()
     *
     * @param args
     */
    public static void main(String[] args) {

        List list = new ArrayList();
        {
            //新增
            list.add('a');
            list.add("你");
            list.add('5');
            list.add('5');
            list.add(1, 'd');
            System.out.println("ArrayList--add(int index, E element) :" + list);// ArrayList--add(int index, E element) :[a, d, 你, 5, 5]
        }

        {
            //删除
            Object result = list.remove(new Character('你'));
            System.out.println("public boolean remove(E element) : " + list + "--:" + result);// public boolean remove(E element) : [a, d, 你, 5, 5]--:false
            list.remove(1);
            System.out.println("public boolean remove(int index) : " + list);// public boolean remove(int index) : [a, 你, 5, 5]

        }

        {
            //修改
            Object result = list.set(1, "b");
            System.out.println("public E set(int index) : " + list + "-- result :" + result);// public E set(int index) : [a, b, 5, 5]-- result :你
        }

        {
            //查询
            Object o = list.get(2);
            System.out.println("public E get(int index) : " + o); //public E get(int index) : 5
        }

        {
            //循环
            List list_for = new ArrayList();
            list_for.add(2);
            list_for.add(3);
            list_for.add(4);
            list_for.add(5);
            list_for.add(6);
            System.out.println("list_for----:" + list_for);

            //1、for
            for(int i = 0; i < list_for.size(); i++) {
                System.out.println("-----i:" + list_for.get(i));
            }

            //2、forEach
            for(Object a : list_for) {
                System.out.println("----list_for:" + (Integer)a);
            }

            //3、iterator
            Iterator<Integer> iterator = list_for.iterator();
            while(iterator.hasNext()) {
                Integer a = iterator.next();
                if( a == 2) {
                    iterator.remove();
                }
                System.out.println("list_for---iterator:" + a);
            }
            System.out.println("list_for---iterator的删除以后:" + list_for);
            //list_for---iterator:2
            //list_for---iterator:3
            //list_for---iterator:4
            //list_for---iterator:5
            //list_for---iterator:6

            /**
             * 对于为什么需要三种遍历方式的理解:
             *  1、为什么需要iterator:
             *      a: for循环已经能够对集合进行遍历,但是这个遍历的前提是我们不需知道集合里元素的具体细节或者说元素的长度等信息,而iterator就是为了隐藏集合的内部细节,
             *      让集合的内容对使用者完全透明
             *      b: 在使用for的过程中是可以删除和新增的,但是这会造成list的size变化,很容易造成不必要的bug.
             *      c: foeEach其实是对iteartor的一层封装,但是在forEach的循环中是不允许删除和新增元素的。在看是ForEach的时候,就相当于锁住了list的size
             *      d:iterator的使用中相当于使用指针
             */
            /*list_for.clear();
            for(int i = 0; i < 10000; i++) {
                list_for.add(i);
            }
            //1、for
            Long begin_for = System.currentTimeMillis();
            for(int i = 0; i < list_for.size(); i++) {
            }
            Long end_for = System.currentTimeMillis();
            System.out.println("for 循环 耗时:" + (end_for - begin_for));

            //2、forEach
            Long begin_forEach = System.currentTimeMillis();
            for(Object a : list_for) {
            }
            Long end_forEach = System.currentTimeMillis();
            System.out.println("end_forEach 循环 耗时:" + (end_forEach - begin_forEach));
            //3、iterator
            Long begin_iterator = System.currentTimeMillis();
            Iterator<Integer> iterator1 = list_for.iterator();
            while(iterator1.hasNext()) {
                iterator1.next();
            }
            Long end_iterator = System.currentTimeMillis();
            System.out.println("iterator 循环 耗时:" + (end_iterator - begin_iterator));*/
        }

        {
            //list存储对象的对象属性比较
            User zs = new User("张三", 23);
            User ls = new User("李四", 24);
            User ww = new User("王五", 25);
            List list_user = new ArrayList();
            list_user.add(zs);
            list_user.add(ww);
            list_user.add(ls);
            System.out.println("list--的排序前:" + list_user);

            //1、
          /*  Comparator<User> comparator = new Comparator<User>() {
                @Override
                public int compare(User user1, User user2) {
                        return user1.getAge() - user2.getAge();
                }
            };
            Collections.sort(list_user, comparator);
            System.out.println("list--的排序后:" + list_user);*/
            //2、
            list_user.sort(new Comparator<User>() {
                @Override
                public int compare(User o1, User o2) {
                    return o1.getAge() - o2.getAge();
                }
            });
            System.out.println("list--的排序后:" + list_user);
        }

        {
            //一些查询是否包含的api
            List list_c = new ArrayList();
            list_c.add(1);
            list_c.add(2);
            list_c.add(3);
            list_c.add(4);
            Boolean result = list_c.contains(2);
            System.out.println("---contains:" + result); //---contains:true

            int a = list_c.indexOf(2);
            System.out.println("list_c--indexOf:" + a);// list_c--indexOf:1

        }

    }

//}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很好的问题!让我来解答。 首先,让我们来了解一下 `Comparable` 接口。这个接口是 Java 中的一个接口,它只有一个方法 `compareTo()`。这个方法的作用是定义类的自然排序顺序。 如果我们要对一个对象集合进行排序,只需要让这个类实现 `Comparable` 接口,并且重写 `compareTo()` 方法。这个方法返回一个整型值,表示该对象与另一个对象的大小关系。如果该对象小于另一个对象,则返回负整数;如果两个对象相等,则返回零;如果该对象大于另一个对象,则返回正整数。 下面是一个简单的例子,展示如何使用 `Comparable` 接口进行排序。 ```java public class Student implements Comparable<Student> { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } // 重写 compareTo 方法 @Override public int compareTo(Student o) { // 按照年龄从小到大排序 return this.age - o.getAge(); } } ``` 在这个例子中,我们定义了一个 `Student` 类,并且让它实现了 `Comparable` 接口。我们重写了 `compareTo()` 方法,按照年龄从小到大排序。 现在,我们可以使用 `Collections.sort()` 方法对 `Student` 对象进行排序了: ```java List<Student> students = new ArrayList<>(); students.add(new Student("Tom", 20)); students.add(new Student("Jerry", 18)); students.add(new Student("Alice", 22)); Collections.sort(students); for (Student student : students) { System.out.println(student.getName() + " " + student.getAge()); } ``` 输出结果为: ``` Jerry 18 Tom 20 Alice 22 ``` 可以看到,我们成功地按照年龄从小到大对 `Student` 对象进行了排序。 希望这个例子能够帮助你理解如何使用 `Comparable` 接口进行排序。如果你还有其他问题,请随时提出!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值