横看成岭侧成峰,远近高低各不同。
不识庐山真面目,只缘身在此山中。

              ——苏轼

这一块儿学的是云里雾里,咱们先从简单的入手。逐渐的拨开迷雾见太阳。本次先做List集合的三个实现类的学习笔记

List特点:有序,元素可重复。其实它的本质就是一个线性表(下面会说到)

先上图,Java集合有Collection体系和Map体系:

然后简单介绍一下数据结构和算法:

数据结构就是数据和数据之间的关系,好比分子结构,晶体结构。碳原子按照一定的方式组合在一起形成碳分子,碳分子再按照一定方式形成晶体。

算法是对解题步骤的描述,体现在计算机上就是指令的有限序列

数据结构分为逻辑结构和物理结构。

逻辑结构:

物理结构:

顺序存储结构和链式存储结构。

顺序存储结构:在内存中开辟若干的连续空间,将每个空间存入数据,数据关联与其地址一致。比如数组。

上代码:

  1. public class Test01 {
  2.  
  3. public static void main(String[] args) {
  4. Integer[] arr = new Integer[];
  5. //向数组中插入元素
  6. for (int i = ; i < arr.length; i++) {
  7. arr[i] = i;
  8. }
  9. //将其中一个元素变为null;
  10. arr[] = null;
  11. //出现碎片
  12. for (Integer item : arr) {
  13. System.out.println(item);
  14. }
  15. System.out.println("===========");
  16. arr[] = ;//存取方便,可直接赋值或取值
  17. //删除第X个元素,但要避免碎片产生:
  18. int x = ;
  19. arr[x-]=null;//第二个元素引用变为null,该步骤可以省略,因为下面又更改了arr[x-1]的引用。写上仅为便于理解
  20. //第X个元素之后的元素前移,代码表现为把后面的值依次赋给前面,从第X个开始
  21. for (int i = x-; i < arr.length-; i++) {
  22. arr[i] = arr[i+];
  23. }
  24. //length-1,需要新建数组来保存原数组
  25. Integer[] newArr = new Integer[arr.length-];
  26. for (int i = ; i < newArr.length; i++) {
  27. newArr[i]=arr[i];
  28. System.out.println(newArr[i]);
  29. }
  30. System.out.println("============");
  31. //第Y个位置插入一个元素
  32. int y = ;
  33. //需要后移,所以先创建数组length+1
  34. Integer [] newArr2 = new Integer[newArr.length+];
  35. for (int i = ; i < newArr.length; i++) {
  36. newArr2[i] = newArr[i];
  37. }
  38. //后移
  39. for (int i = newArr2.length-; i > y- ; i--) {
  40. newArr2[i]=newArr2[i-];
  41. }
  42. //插入
  43. newArr2[y-] = ;
  44. //遍历输出
  45. for (int i = ; i < newArr2.length; i++) {
  46. System.out.println(newArr2[i]);
  47. }
  48. }
  49.  
  50. }

出结论:

顺序存储结构:

优点:1无需为表示表中元素之间的逻辑关系而添加空间

   2可以快速地存取表中任意位置的元素

缺点:1插入和删除操作需要移动大量元素

     2需要考虑索引越界为题

     3扩容空间可能会造成空间浪费,缩小空间又可能会索引越界

     4null值会造成空间“碎片”

链式存储结构:每个元素只记住它下一个元素是谁(地址)。

链式存储结构有多种,这里只介绍Java的链式存储结构:双向链表

上代码:

  1. public class MyLinkedListDemo {
  2.  
  3. public static void main(String[] args) throws Exception {
  4. MyLinkList<String> list = new MyLinkList<>();
  5. list.addFist("张三");
  6. list.addFist("李四");
  7. list.addLast("张三");
  8. list.addLast("李四");
  9. list.print();
  10. System.out.println("===========");
  11. list.add(,"王五");
  12. list.print();
  13. System.out.println("===========");
  14. list.add(,"王五");
  15. System.out.println(list.getSize());
  16. list.add(,"王五");//这里会抛出空指针异常
  17. }
  18. }
  1. public class MyLinkList<E> {
  2.  
  3. Node<E> first;
  4. Node<E> last;
  5.  
  6. public void addFist(E e){
  7. if (first == null) {
  8. final Node<E> newNode = new Node<E>(null, e, null);//第一次加入数据,为first,last赋初值
  9. first = newNode;
  10. last = newNode;
  11. }else{//否则把first的prev指向newNode,把newNode的next指向first,最后把newNode变为first
  12. final Node<E> newNode = new Node<E>(null, e, first);
  13. first.prev = newNode;
  14. first = newNode;
  15. }
  16. }
  17. public void addLast(E e){
  18. if (last == null) {
  19. final Node<E> newNode = new Node<E>(null, e, null);//第一次加入数据,为first,last赋初值
  20. first = newNode;
  21. last = newNode;
  22. }else{//否则把last的next指向newNode,把newNode的prev指向last,最后把newNode变为last
  23. final Node<E> newNode = new Node<E>(last, e, null);
  24. last.next = newNode;
  25. last = newNode;
  26. }
  27. }
  28. public void add (int index,E e) throws Exception{//下标超出链表长度会空指针,因为超出长度的部分prev和next都是null
  29. if(index == ){
  30. addFist(e);
  31. }else if (index == getSize()) {
  32. addLast(e);
  33. }else {
  34. //这里画张图想一下,我要在1处插入x,就要把x的prev指向0,next指向1,把0的next指向x,把1的prev指向x
  35. //这里的1和0就是index和index-1,通过循环Node.next获取index对应的Node
  36. //先拿到0和1
  37. Node<E> tempNodeNext = first;
  38. for (int i = ; i < index; i++) {
  39. tempNodeNext = tempNodeNext.next;
  40. }
  41. Node<E> tempNodePrev = tempNodeNext.prev;
  42. //这里改指向
  43. final Node<E> newNode = new Node<E>(tempNodePrev, e, tempNodeNext);
  44. tempNodeNext.prev = newNode;
  45. tempNodePrev.next = newNode;
  46. }
  47. }
  48. public int getSize (){
  49. Node<E> temp = first;
  50. int i = ;
  51. while(temp != null){
  52. temp = temp.next;
  53. i++;
  54. }
  55. return i;
  56. }
  57. //由于不实现Iterable,只能提供打印方法
  58. public void print() {
  59. Node<E> temp = first;
  60. while(temp != null){
  61. System.out.println(temp.item);
  62. temp = temp.next;
  63. }
  64. }
  65. private static class Node<E>{
  66. Node<E> prev;
  67. E item;
  68. Node<E> next;
  69. Node(Node<E> prev, E item, Node<E> next) {
  70. super();
  71. this.prev = prev;
  72. this.item = item;
  73. this.next = next;
  74. }
  75. }
  76. }

出结论:

链式存储结构:

优点:插入和删除操作只需改变节点next和prev成员的指向即可,无需移位,无需扩容

缺点:失去了直接存取表中任意位置元素的能力

顺序存储结构和链式存储结构的对比:

1、存储分配方式:

顺序存储结构使用一段连续的存储单元依次存储线性表元素

链式存储结构使用任意存储单元存放线性表的元素

2、时间性能:

查找:

顺序存储结构O(1)

链式存储结构O(n)

插入和删除:

顺序存储结构O(n)

链式存储结构O(1)

3、空间性能:

顺序存储结构:空间分大了浪费,分小了上溢,还得扩容

链式存储结构:有空间就能分配,元素个数不受限制

言归正传。

ArrayList是顺序存储的线性表,LinkedList是链式存储的线性表

它们的特点都是有序,元素值可以重复。区别是底层算法不同。

Vector,这里我简单浏览了一下源代码,Vector底层算法和ArrayList是一样的

这里就不赘述了,直接说区别:

1、Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法线程不安全,由于线程的同步必然要影响性能,因此ArrayList的性能比Vector好。 
2、Vector扩容时容量翻倍,而ArrayList只增加50%的大小,(直接查它们的grow()方法)这样,ArrayList就有利于节约内存空间。

总之ArrayList比Vector在性能方面(无论时间性能还是空间性能)都是能省则省。

List就说到这里。下一篇说说队列

Java学习笔记——浅谈数据结构与Java集合框架(第一篇、List)的更多相关文章

  1. Java学习笔记——浅谈数据结构与Java集合框架(第二篇、Queue、Set)

    江南好,何处异京华. 香散翠帘多在水,绿残红叶胜于花.无事避风沙. --<纳兰词> 诗词再好,大图不能忘 上大图: 先说说栈和队列: 栈就好比手枪的弹匣,你往里面压入子弹,最先压入的子弹就 ...

  2. Java学习笔记——浅谈数据结构与Java集合框架(第三篇、Map)

    桃李春风一杯酒,江湖夜雨十年灯 --寄黄几复 之前图上写错了,是Hashtable类.t是小写的,它是个很古老的类,以至于命名都没有那么规范.. HashMap HashMap就是存储key-valu ...

  3. java设计模式学习笔记--浅谈设计模式

    设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...

  4. 疯狂Java学习笔记(84)----------大约 Java 对象序列化,你不知道 5 事

    几年前,.当一个软件团队一起用 Java 书面申请.我认识比一般程序猿多知道一点关于 Java 对象序列化的知识所带来的优点. 关于本系列 您认为自己懂 Java 编程?其实,大多数程序猿对于 Jav ...

  5. 疯狂Java学习笔记(70)-----------挚爱Java

    与大家分享! 挚爱Java 10个使用Java最广泛的现实领域 写好Java代码的30条经验总结 Java字符串的substring真的会引起内存泄露么? Java内存的原型及工作原理深度剖析 Jav ...

  6. Java学习笔记(十六)——Java RMI

    [前面的话] 最近过的好舒服,每天过的感觉很充实,一些生活和工作的技巧注意了就会发现,其实生活也是可以过的如此的有滋有味,满足现在的状况,并且感觉很幸福. 学习java RMI的原因是最近在使用dub ...

  7. 0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词

    第01章 计算机.程序和Java概述 CPU(Central Processing Unit) * 中央处理器 Control Unit * 控制单元 arithmetic/logic unit /ə ...

  8. Java学习笔记(十四)——Java静态工厂

    [前面的话] 每天过的还行,对我来说,只要让自己充实,生活就会是好的. 学习Java工场方法的原因是最近在使用Spring框架做一个系统,其中有一个注入的方法是使用静态工场方法注入,所以学习一下,基础 ...

  9. 零基础学Java之Java学习笔记(一):Java概述

    什么是Java? Java是一门面向对象编程语言,可以编写桌面应用程序.Web应用程序.分布式系统和嵌入式系统应用程序. Java特点有哪些? 1.Java语言吸收了C++语言的各种优点,具有功能强大 ...

随机推荐

  1. Eclipese Mars安装SVN的全步骤

    在做毕业设计的过程中,由于是团队项目,需要用到SVN,而全新的Eclipse Mars从官网下载下来没有SVN插件,需要自己下载. 1.选择Help-->Eclipese MarketPlace ...

  2. synchronized关键字

    最近重新梳理了下java的synchronized相关内容,希望能帮助到有需要的朋友们. 主要阐述以下几个问题: 1.非static方法前加synchronized class Demo{ synch ...

  3. Memcache存储机制与指令汇总

    1.memcache基本简介 memcached是高性能的分布式内存缓存服务器.一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度.提高可扩展性. Memcach ...

  4. file_get_contents和curl对于post方式的解决办法

    post方式解决办法 其实很简单,我们只要仔细看看就知道了... file_get_contents: $content=$_POST['content'];$access_token=$_POST[ ...

  5. XJOI1680阿猫的实验

    阿猫的实验 阿猫很喜欢生物学.他还在今年的全国中学生生物学联赛中获得了一等奖.一天,阿猫在实验室听说了这样一种繁殖能力很强的老鼠.这种老鼠在出生后的第一个月,可以生出a 对老鼠:第二个月,可以生出b ...

  6. JavaWeb总结(三)—JSP

    一.JSP简介 1.基本认识 (1)JSP页面是由HTML语句和嵌套在其中的Java代码组成的一个普通文本文件,JSP 页面的文件扩展名必须为.jsp. (2)在JSP页面中编写的Java代码需要嵌套 ...

  7. Learning to Rank简介

    Learning to Rank是采用机器学习算法,通过训练模型来解决排序问题,在Information Retrieval,Natural Language Processing,Data Mini ...

  8. Flex——弹性布局

    今天在做项目时,要一个500*100的页面区域做三个橱窗,尼玛可是恶心死我了!光是计算左右内外边距,左右宽度,就废了一上午时间~~好吧,我承认我的数学老师挂得早! 正在苦逼的列公式,定位图片,浮动文字 ...

  9. xshell配色Solarized Dark

    转自:xshell配色Solarized Dark [Solarized_Dark] text(bold)= magenta(bold)=6c71c4 text= white(bold)=fdf6e3 ...

  10. 【shell编程基础1】shell变量篇

    Bash shell bash shell 是bourne shell 的升级版,“bourne again shell”.ubuntu的默认shell. 预备知识 1. "#!" ...