容器

作者: 云木杉 | 来源:发表于2018-11-01 17:52 被阅读0次

数组

数组的储存方式在内存的地址是连续的,大小固定,一旦分配不能被其他引用占用。它的特点是查询快,增删慢。
链表的存储方式是非连续的,大小不固定,特点与数组相反,插入和删除快,查询速度慢。

数组的特点

  • 在内存中,数组是一块连续的区域。 拿上面的看电影来说,这几个人在电影院必须坐在一起。

  • 数组需要预留空间,在使用前要先申请占内存的大小,可能会浪费内存空间。 比如看电影时,为了保证10个人能坐在一起,必须提前订好10个连续的位置。这样的好处就是能保证10个人可以在一起。但是这样的缺点是,如果来的人不够10个,那么剩下的位置就浪费了。如果临时有多来了个人,那么10个就不够用了,这时可能需要将第11个位置上的人挪走,或者是他们11个人重新去找一个11连坐的位置,效率都很低。如果没有找到符合要求的作为,那么就没法坐了。

  • 插入数据和删除数据效率低,插入数据时,这个位置后面的数据在内存中都要向后移。删除数据时,这个数据后面的数据都要往前移动。 比如原来去了5个人,然后后来又去了一个人要坐在第三个位置上,那么第三个到第五个都要往后移动一个位子,将第三个位置留给新来的人。 当这个人走了的时候,因为他们要连在一起的,所以他后面几个人要往前移动一个位置,把这个空位补上。

  • 随机读取效率很高。因为数组是连续的,知道每一个数据的内存地址,可以直接找到给地址的数据。

  • 并且不利于扩展,数组定义的空间不够时要重新定义数组。

链表的特点

  • 在内存中可以存在任何地方,不要求连续。 在电影院几个人可以随便坐。

  • 每一个数据都保存了下一个数据的内存地址,通过这个地址找到下一个数据。 第一个人知道第二个人的座位号,第二个人知道第三个人的座位号……

  • 增加数据和删除数据很容易。 再来个人可以随便坐,比如来了个人要做到第三个位置,那他只需要把自己的位置告诉第二个人,然后问第二个人拿到原来第三个人的位置就行了。其他人都不用动。

  • 查找数据时效率低,因为不具有随机访问性,所以访问某个位置的数据都要从第一个数据开始访问,然后根据第一个数据保存的下一个数据的地址找到第二个数据,以此类推。 要找到第三个人,必须从第一个人开始问起。

  • 不指定大小,扩展方便。链表大小不用定义,数据随意增删。

长度固定 与其他容器之间的区别:效率 类型和保存基本类型的能力 效率最高的存储和随机访问对象引用序列的方式。

  • 赋值其实只是复制了一个引用。
  • 对象数组保存的是引用,基本类型数组保存基本类型的值。
  int[] arr = {1, 2, 3, 4, 5};
  int[] arr2;
  arr2 = arr;

  for (int i = 0; i < arr2.length; i++) {
     arr2[i] = arr2[i] + 1;
  }

  for (int i = 0; i < arr.length; i++) {
     Logger.v("arr[" + i + "] = " + arr[i]);
       // 2,3,4,5,6
   }

持有对象

在任何时刻任何位置创建任何数量的对象。

Collection 一个独立元素的序列

  • int size() 返回collection的元素数,如果大于Inter.MAX_VALUE,则返回Inter.MAX_VALUE;
  • boolean isEmpty 如果collection不包含元素,返回true
  • boolean contains(Object obj) 如果collection包含指定的元素,则返回true
  • boolean add(E a);
  • boolean remove(Object o);
  • void clear();

List 必须按照插入的顺序保存元素

ArrayList 用户进行大量的随机访问。

  • int indexOf(Object o) 返回列表中首次出现的指定元素的索引,如果不包含,则返回-1.

LinkList是栈实现,双链表结构, 经常实现插入删除数据
ArrayList实现动态数组的数据结构, 可以实现大量的随机访问

LinkedList 栈实现 用于经常从表中间插入或删除元素

  • T getFirst();获取列表第一个元素

Set 不能有重复元素 主要使用contains()测试Set的归属性。

  • TreeSet 将元素存储在红-黑数据结构中。具有排序实现
  • HashSet 使用的散列函数。
  • LinkedHashList使用 散列

Map 一组成对儿的“键值对”对象

HashMap 初始容量和负载因子

  • HashMap 用来快速访问
  • TreeMap 保持处于排序状态。
  • LinkedHashMap 保持元素插入时的顺序
 Random random = new Random(47);
 Map<Integer, Integer> map = new HashMap<>();
 for (int i = 0; i < 1000; i++) {
        int r = random.nextInt(20);
        Integer fre = map.get(r);
        map.put(r, fre == null ? 1 : fre + 1);
  }
  Logger.v(map + "");

Queue 队列是一个典型的先进先出容器。

       Queue<Integer> mu = new LinkedList<>();
        for (int i = 0; i < 200; i++) {
            // 将指定的元素插入此队列(如果立即可行且不会违反容量限制)
            boolean add = mu.add(i);
            //获取,但是不移除此队列的头。
            Integer element = mu.element();
            //将指定的元素插入此队列(如果立即可行且不会违反容量限制) 此方法通常要优于 add(E),插入队尾。
            boolean offer = mu.offer(i);
            // 获取但不移除此队列的头; 
            Integer peek = mu.peek();
            //获取并移除此队列的头
            Integer poll = mu.poll();
            // 获取并移除此队列的头
            Integer remove = mu.remove();
        }

Arrars

  • Arrars.asList() 接收一个数组,返回一个List对象
  • Arrays.fill() 填充数据
  • equals()用于比较两个数组是否相等
  • sort用户数组排序
  • binarySearch用于在已经排序的数组中查找元素
  • System.arraycopy();
     int[] ints = new int[5];
     Arrays.fill(ints,666);

迭代器 Iterator

 List lm = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5, 6, 7));
 // 使用iterator()方法要求容器返回一个Iterator
Iterator<Integer> iterator = lm.iterator();

 // 检测序列中是否还有元素
 while (iterator.hasNext()) {
      // 获得序列中下一个元素
      int next = iterator.next();
      Logger.v(next + "");
  }

  • ListIterator 用于List访问。Iterator只能单向移动,ListIterator可以双向移动。

Stack “栈”是指先进后出的容器

  Stack<String> ms = new Stack<>();
  for (String str: "My dog has fleas".split(" ")) {
        //把项压入堆栈顶部.
        ms.push(str);
        // 移除堆栈顶部的对象,并作为此函数的值返回该对象。
        String pop = ms.pop();
        // 查看堆栈顶部的对象,但不从堆栈中移除它。
        String peek = ms.peek();
        // 测试堆栈是否为空。
        boolean empty = ms.empty();
  }

相关文章

  • Docker入门(3)---Docker容器

    Docker 容器操作 启动容器 启动已终止容器 容器查看 停止容器 进入容器 删除容器

  • Docker容器管理

    目录 创建容器 启动容器 停止容器 进入容器 删除容器 容器迁移 1. 创建容器 docker创建容器可以用doc...

  • Docker 容器命令

    运行容器 运行Redis容器: 容器列表 停止容器 停止Redis 启动容器 停止Redis 端口映射 删除容器 ...

  • 一、容器

    (1)容器分类 <1>顺序容器(序列容器) <2>关联容器 <3>容器适配器 (2)vector容器 <1>概念 ...

  • docker容器命令

    1、查看运行的容器 2、查看所有的容器 3、创建容器 4、进入容器 5、启动容器 6、停止容器 7、删除容器 8、...

  • spring的父子容器及配置

    spring父子容器 spring总的上下文容器有父子之分,父容器和子容器。** 父容器对子容器可见,子容器对父容...

  • STL--vector、deque、list、set、map、s

    vector(向量容器) deque(双端队列容器) list(链表容器) set(集合容器) map(映射容器)

  • docker容器基本操作

    启动交互式容器 查看容器 自定义容器的名字 重启启动停止的容器 删除停止的容器 守护式容器 什么是守护式容器: 能...

  • 面试知识点(5)STL

    容器类型 STL容器主要分为 顺序容器 vector(向量容器) deque(双端队列容器) list(双向链...

  • 标准模板库(容器)

    vector 向量容器 List 容器 map 容器

网友评论

      本文标题:容器

      本文链接:https://www.haomeiwen.com/subject/gpuxxqtx.html