文档章节

JAVA深入回顾数据结构

小峰1005419213
 小峰1005419213
发布于 2015/06/13 18:00
字数 1171
阅读 60
收藏 3

首先的分析JAVA有什么些数据类型:

   1、常见的8大数据类型和数组

    数组特点:连续的内存地址

    数组分为:有序数组、无序数组

    有序数组:   

             检索方式 : 单链、二分法、

             特点:不可重复、 插入慢查找慢

      无序数组:    

             特点: 可以重复

       详细可参照:http://blog.jobbole.com/68023/

   存放数据:数组、集合

    一般情况下,我们放数据都是将数据放在容器(也就是集合里面)里面。

    那么大多数集合是怎么来得呢?那么我们看下底层代码是怎么实现的

    public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
     }

   从源码里面可以看到,也就是说所谓的集合就是无限增长的数组。

   那么集合就会存在以下几个问题:

     1、检索速度      2、安全性

   以下先介绍Collection接口  (整个集合的祖先、也是单列集合)

   在这个接口下面又做了一个set接口,和List接口

   那么set接口 和List接口的区别:

         Set:检索速度快,不能重复,无顺序。。

         List:有下标,可存储重复的值,检索效率不高。又称数组集合系列。

Set下面的操作类(常用的)

              HashSet、

              TreeSet

HashSet

          它每次存放数据,会得到这个对象的hashcode值,然后拿到这个值除以一串数,按照这个除以之后的值放在Hashcode列里面,当hashcode值相同的时候,会调用equals()方法。

               优点:节约内存

          缺点:数据大检索快。

 

TreeSet

           树形的存放结构,查找速度也比较快

           数据查找类似于杨辉三角型,查找数据从上面,一个一个的比较下去。虽然查找数据相对于数组来说比较快,但数据非常大的时候,也不太妥。可以想象Oracle里面的表分区。

           缺点:费内存

           优点:数据少比较快\自带排序(聚集排序)。

           如果放的是对象(无法自然排序),那么就需要实现一个比较器如下:

            static class Dog implements java.lang.Comparable{

               public void CompareTo(){

                                  返回 1是大于。返回0是相同。返回-1是小于

                          }

              }

 

Set总结:

       add()的时候,先hashcode判断,如果一致,在调用equals()方法。equals()返回为false则添加进去。

也就是说HashSet根据这个hashcode的值,进行一个跨域,加快了检索的速度。

 

List下面操作类(常用的)

        ArrayList

                    无同步

        Vector

                    与ArrayList方法相同,只是加上了同步关键字

 

        Stack

          内存结构:类似于弹夹,先进后出,子弹好比与数据。

         push()压入数据

         pop()出栈

         peek();拿到栈顶的数据。

 

 

        LinkedList (链表集合)

                  1、单向链表

      内存结构:类似于一个盒子,有头有尾,头部为值,尾部为下一个数据的地址。

      存在BUG:从上往下找方便,但是从下往上找不到。

                  2、双向链表

       内存结构:有头,有身体,有尾巴。 头部存储上一个数据的内存地址,身体存放值,尾部存放下一个数据的地址。

 

    

        缺点:提取值比较慢。

        优点:增长是无限的,删除和修改是非常灵活。

链表集合用在发短信的地方比较多。

Iterator迭代器:

         每个单列集合都定义了一个迭代器。因为无序集合不能按下标得值,所以需要迭代器拿值。

         hasNext()有对象吗?             true表示有对象,false表示无对象。

         Next()得到对象。            

 

Collections工具类

排序只针对List   若不是自然排序的对象,则需要实现比较器

Collections.sort();排序         Collections.reverse()逆排        

Map集合(双列集合):

           Hashtable       

            不可以 有null值,同步安全                 

源码:

    public synchronized V put(K key, V value) {
        // Make sure the value is not null
        if (value == null) {
            throw new NullPointerException();
        }

        // Makes sure the key is not already in the hashtable.
        Entry tab[] = table;
        int hash = hash(key);
        int index = (hash & 0x7FFFFFFF) % tab.length;
        for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) {
            if ((e.hash == hash) && e.key.equals(key)) {
                V old = e.value;
                e.value = value;
                return old;
            }
        }

        modCount++;
        if (count >= threshold) {
            // Rehash the table if the threshold is exceeded
            rehash();

            tab = table;
            hash = hash(key);
            index = (hash & 0x7FFFFFFF) % tab.length;
        }

        // Creates the new entry.
        Entry<K,V> e = tab[index];
        tab[index] = new Entry<>(hash, key, value, e);
        count++;
        return null;
    }

     也就是通过entrySet();拿到内部类,通过这个内部类取得key  value  

 

    HashMap

            可以有null值,没有同步

也就是说Map是构造一个内部类的对象的数组,这个对象存了当前的key,value等等。。。

 

© 著作权归作者所有

共有 人打赏支持
小峰1005419213
粉丝 0
博文 9
码字总数 3852
作品 0
达川
高级程序员
私信 提问
JVM 虚拟机(对象创建,类加载器,执行引擎等),

1.揭开 Java 对象创建的奥秘? 2.class 文件结构详解? 3.详解 Java 类的加载过程? > Java 对象创建,class 文件结构 Java对象模型 。Java对象保存在堆内存中。在内存中,一个Java对象包含三...

desaco
08/29
0
0
干货系列1:Java互联网网站开发工程师 的技术提高与晋升路线(技术专精)

前几天写了自己对于Java软件开发工程师职业发展规划方面的一些感悟,陆续收到一些反馈,希望我能再就Java工程师不同的开发(职责)方向谈谈职业发展问题。(上一篇:Java软件开发工程师的自我...

半饱即好
06/26
0
0
JVM内存结构 VS Java内存模型 VS Java对象模型

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和...

Java架构
07/11
0
0
再有人问你Java内存模型是什么,就把这篇文章发给他!

前几天,发了一篇文章,介绍了一下JVM内存结构、Java内存模型以及Java对象模型之间的区别。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型,是这三个知识点当中最晦涩难懂的...

技术小能手
09/30
0
0
面试中关于Java虚拟机(jvm)的问题看这篇就够了

最近看书的过程中整理了一些面试题,面试题以及答案都在我的文章中有所提到,希望你能在以问题为导向的过程中掌握虚拟机的核心知识。面试毕竟是面试,核心知识我们还是要掌握的,加油~~~ 下面...

snailclimb
05/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据教程(9.5)用MR实现sql中的jion逻辑

上一篇博客讲解了使用jar -jar的方式来运行提交MR程序,以及通过修改YarnRunner的源码来实现MR的windows开发环境提交到集群的方式。本篇博主将分享sql中常见的join操作。 一、需求 订单数据表...

em_aaron
10分钟前
0
0
十万个为什么之什么是resultful规范

起源 越来越多的人开始意识到,网站即软件,而且是一种新型的软件。这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点...

尾生
16分钟前
0
0
《告诉你真实的美国教育》的读后感3900字

《告诉你真实的美国教育》的读后感3900字: 文章的开篇分析了我们耳熟能详的关于美国教育的小故事,就是那个因为幼儿园的老师教了“0”这个字母,然后妈妈告老师剥夺了孩子的想象力,再然后幼...

原创小博客
24分钟前
0
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
39分钟前
2
0
exportfs命令, vsftp搭建ftp服务

exportfs命令 当修改/etc/exports文件后,更改的内容是不会立即生效的。如果重启nfs服务,会导致客户端重启期间的请求是挂起等待的,可以把客户端的挂载umount进行卸载后,再重启nfs服务,但...

野雪球
50分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部