手撕java集合


讲集合先上图

java集合框架体系图

collection

  • 1.collection对上继承iterable类,
    所以collection及其子类皆可以调用iterator()方法获得迭代器.
  • 2.collection由其子类实现
    package top.tzk.collection_;
    
    import java.util.ArrayList;
    
    public class CollectionTest {
        public static void main(String[] args) {
            ArrayList<Object> list = new ArrayList<Object>();
            /**
             * 集合中只能存放对象!!!
             * */
            //集合的添加
            list.add("sds");
            list.add(21);//这里的21调用了封装 new Integer(21)
            list.add(false);//同理
            //集合移除元素
            list.remove(1);
            System.out.println(list);
              /* terminal:
                [sds, false]*/
            list.remove("sds");
            System.out.println(list);
           /* terminal:
                [sds, false]
            [false]*/
            //以collection为单位添加
            ArrayList<Object> list2 = new ArrayList<>();
            list2.add(1231);
            list2.add("黄河");
            list.addAll(list2);
            //以collection为单位删除
            list.removeAll(list2);
            //以collection为单位,查找该集合是否包含collection里的元素
            list.containsAll(list2);
    
        }
    }

    list

    list常用方法:
  • 指定位置添加
list.add(0,"大海");
list.add(1,"大海");
list.add(1,"是");
// terminal: 大海,是,大海
  • 返回某元素第一次出现的下标
list.indexof("大海");
  • 返回某元素最后一次出现的下表
list.lastindexof("大海");
  • 元素替换
list.set(0,"大海无疆");
  • 截取元素返回为子集合,左闭右开[ )
list.subList(0,1)

ArrayList

源码解析图

ArrayList源码解析图

  • 特点:

1.底层为数组Array
2.线程不安全
3.采用无参构造创建时:
不初始化,对象引用啥也不指向;只有当进行添加元素时,才会采取按照默认值初始化数组,然后返回给对象引用.
4.如果使用带参构造:
那么照设定值进行数组初始化(但是如果参数设定为0,那么走无参路线).
5.扩容方式:
按照oldCapacity + (oldCapacity >> 1)的方式扩容.即:按照一点五倍扩容.

Vector

源码解析图

Vector解析图

  • 特点:

1.底层为数组Array
2.线程安全
3.采用无参构造创建时:
那么照默认值进行数组初始化
4.如果使用带参构造:
那么照设定值进行数组初始化,除此之外,还可以设定增量.
5.扩容方式:
按照oldCapacity + (capacityIncrement > 0? capacityIncrement:oldCapacity)的方式扩容.即:有增量,按增量,否者按照2倍扩容

###LinkedList

源码解析图(看下结构就行,没什么好看的.就和模拟(面向过程类的语言的写法,C)去写的)

LinkedList解析图

其实LinkedList就是个双向链表,符合双向链表的所有特点.没啥好讲的.

特点:

1.从当前节点向前向后检索都特方便.
2. 插入方便,只要动动指针指向的东西就行(java里面就是对象引用指向的Node)
3. 删除方便,把当前Node的前一个Node的last指向当前Node的后一个Node的地址即可.
4. 查找麻烦,必须从头或者从尾部依次检索.


文章作者: tzkTangXS
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 tzkTangXS !
  目录