文档章节

List源码个人理解

 阿狼仔
发布于 2016/06/23 19:43
字数 439
阅读 3
收藏 0

#List源码个人理解 ##List接口定义以下方法:

  • int size()
  • boolean isEmpty()
  • boolean contains(Object o)
  • Iterator<E> iterator()
  • Object[] toArray();
  • <T> T[] toArray(T[] a);
  • boolean add(E e);
  • boolean remove(Object o);
  • boolean containsAll(Collection<?> c);
  • boolean addAll(Collection<? extends E> c);
  • boolean removeAll(Collection<?> c);
  • boolean retainAll(Collection<?> c);
  • void clear();
  • boolean equals(Object o);
  • int hashCode();
  • E get(int index);
  • E set(int index, E element);
  • void add(int index, E element);
  • E remove(int index);
  • int indexOf(Object o);
  • int lastIndexOf(Object o);
  • List<E> subList(int fromIndex, int toIndex);
    

AbstractList -> List 简单实现部分方法,许多方法还是没有实现, 直接throwexception, 这种做法和安卓的sdk做法相似,只保证编译通过, 但是在真实运行时, 运行真实的方法即 ArrayList或者 LinkedList

##ArrayList -->Abstractlist

  • DEFAULT_CAPACITY 10 默认容量10
  • 其他一些方法都是常用的数组运算这里不做解释。例如:
    • contains方法:

        public boolean contains(Object o) {
        	return indexOf(o) >= 0;
        }
        //indexOf方法如下:
         public int indexOf(Object o) {
            if (o == null) {
                for (int i = 0; i < size; i++)
                    if (elementData[i]==null)
                        return i;
            } else {
                for (int i = 0; i < size; i++)
                    if (o.equals(elementData[i]))
                        return i;
            }
            return -1;
        }
      

##LinkedList->AbstractList LinkedList只是将存储的容器换成了双向链表,其他方法还是照样。一些取或者存的方法只是常规的操作双向链表,这里不详细说了,,,

##CopyOnWriteArrayList CopyOnWriteArrayList其实在实现的时候就是将写线程锁住,防止多线程对容器操作导致数据不一致的问题。在具体操作时就是定义一个锁,先锁住。具体代码如下:

 public boolean add(E e) {
		//先锁着
        final ReentrantLock lock = this.lock;
        lock.lock();
        try {
            Object[] elements = getArray();
            int len = elements.length;
			//复制整个数组
            Object[] newElements = Arrays.copyOf(elements, len + 1);
			//把元素添加到新的数组里面去
            newElements[len] = e;
			//把新的数组的索引赋值
            setArray(newElements);
            return true;
        } finally {
            lock.unlock();
        }
    }

© 著作权归作者所有

粉丝 0
博文 52
码字总数 13158
作品 0
南京
私信 提问
android Listview加载页面问题

@红薯 你好,想跟你请教个问题: 我看了一下oschina关于Android端源码,关于listview加载数据的时候,一般都是写一个对应的类继承baseAdapter, 源码: public class ListViewMessageAdapter ...

MM_BT
2013/05/11
253
3
对ArrayList中难理解的方法简单的实例

//我只示例一些不容易理解的方法一些个人看法:1.ArrayList线程不安全,(源码的实现没有使用synchronized关键),2.允许值为null 3.查询效率高,删除慢。这是数组的特性 public class Test ...

南桥北木
08/31
12
0
Springsecurity之DefaultSecurityFilterChain

在看FilterChainProxy的时候,发现使用到SecurityFilterChain,可以看下我的这篇博客。 注意:Springsecurity版本是4.3.x.RELEASE 在看源码的过程中,发现SecurityFilterChain的实现类只有一...

克虏伯
2018/11/10
27
1
Eureka Client注册到Eureka Server的秘密

前言 我们知道Eureka分为两部分,Eureka Server和Eureka Client。Eureka Server充当注册中心的角色,Eureka Client相对于Eureka Server来说是客户端,需要将自身信息注册到注册中心。本文主要...

李刚
2017/11/14
0
0
Cocos2dx 3.x std::bind CC_CALLBACK_* 回调函数

boy = Sprite::create("boy.png")//创建boyboy->setPosition(Point(visibleSize.width/2, visibleSize.height/2));this->addChild(boy,1);girl1 = Sprite::create("girl1.png");//创建girl1......

80后小子
2015/12/09
98
0

没有更多内容

加载失败,请刷新页面

加载更多

SIPC的保全存证变现应用才是先见之明

Facebook发起的Libra在接连退群后终于在联盟链上线前官宣成立联盟,同时Telegram公链TON在主网上线前被美国SEC要求退回私募非法所得。两个都拥有活跃用户数上亿的社交平台,一个以1000万美元...

SimpleChain
12分钟前
1
0
Node_初步了解(3)回调,作用域,上下文

本文转载于:专业的前端网站➧Node_初步了解(3)回调,作用域,上下文 1. 1 //回调:回调是异步编程最基本的方法,node.js需要按顺序执行异步逻辑的时候,一般采用后续传递的方式,将后续逻辑...

前端老手
12分钟前
1
0
好程序员Java教程分享Java的五大特点

好程序员Java教程为大家分享Java的五大特点希望对初学者有所帮助。 一、Java的(五大)特点: 1.简单性 相对于c语言来说 c语言的核心 指针(保存地址)*p Java中没有指针的概念(使用的是引用概念...

好程序员官网
14分钟前
1
0
移动端rem适配各种屏幕字体

在页面中引入这个js文件,可以实现各个屏幕的字体自适应: (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? 'orientationchange' : ......

流年那么伤
16分钟前
2
0
2019我最喜爱的绿色应用活动投票开始,谁能突出重围?

在去年第一届软件绿色联盟开发者大会上,共有36个绿色应用荣获“2018年度我最喜爱的绿色应用”奖项。活动得到了消费者、开发者与应用厂商的一致好评,刚过完十一假期就有小伙伴们后台留言,问...

软件绿色联盟
26分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部