`
paddy.w
  • 浏览: 505152 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java简记

    博客分类:
  • Java
阅读更多
        这里随手做一些记录,以便有空时整理。

        HashMap

        HashMap是这么设计的,key和value实际上是存在于一个内部类Entry中,作为这个内部类的成员变量,有多少key-value就生成多少个Entry对象。这些Entry对象又存放在一个名为table的数组中。所以,HashMap实际的存储结构就是一个存有Entry对象的数组。
static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        final int hash;
        ………………
}

        HashMap中有一个hash算法(HashTable则没有这个算法,而是直接用key的hashcode)来对key进行hash计算,这决定了这个Entry对象放到table的哪个位置。但是会出现hash值相同的key,table的同一个位置会对应多个不同的Entry对象,因此Entry内部类中还有一个成员变量next,存放的是Entry类型的引用。所以,table的同一位置如果有多个Entry对象,这些对象会通过其next引用来构成一个链表。
这是hash算法
static int hash(int h) {
        // This function ensures that hashCodes that differ only by
        // constant multiples at each bit position have a bounded
        // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }

存放元素的put方法,当key值存在时,更新value。如果不存在,调用addEntry方法
public V put(K key, V value) {
        if (key == null)
            return putForNullKey(value);
        int hash = hash(key.hashCode());
        int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);
        return null;
    }

addEntry方法
void addEntry(int hash, K key, V value, int bucketIndex) {
	Entry<K,V> e = table[bucketIndex];
        table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
        if (size++ >= threshold)
            resize(2 * table.length);
    }


        以上大体就是HashMap的框架,等有时间再做详细补充。

        LinkedHashMap

        LinkedHashMap继承了HashMap,绝大多数的实现都是继承了HashMap,而没有进行重写。但是由于LinkedHashMap除了使用HashMap的Entry数组来保存其元素之外,还将各元素连接为一个链表。
        HashMap的Entry中有next成员变量,保存的是Entry类型的引用。LinkedHashMap中的Entry内部类继承了HashMap的Entry,而且还多了两个Entry类型的引用,before和after。
        HashMap的put方法在添加一个新元素(不是key值相同的元素更新,而是新添加的元素)实际调用的是addEntry方法,由于LinkedHashMap的Entry中多了两个成员变量,因此为了维护before和after,LinkedHashMap重写了addEntry方法。当然在删除元素时也需要维护这两个成员变量,所以删除方法也进行了重写。
重写的addEntry方法
void addEntry(int hash, K key, V value, int bucketIndex) {
        createEntry(hash, key, value, bucketIndex);

        // Remove eldest entry if instructed, else grow capacity if appropriate
        Entry<K,V> eldest = header.after;
        if (removeEldestEntry(eldest)) {
            removeEntryForKey(eldest.key);
        } else {
            if (size >= threshold)
                resize(2 * table.length);
        }
    }


        HashSet

        HashSet其实就是用HashMap实现的,只不过将HashMap的value统一用一个Object对象填充。也就是说,HashSet是只用了key的HashMap。

        ArrayDeque

        发现一个不错的类,貌似是1.6加入的。在使用上相比LinkedList没什么特别,但是在队列性能上貌似要好于LinkedList,用做stack也比Stack好。
        ArrayDeque是用环形数组实现的,有头尾两个指示器(通过在数组上加两个指示器,类似形成了一个环状结构),通过检查头尾指示器是否相等来判断数组是否已满。下面是API上文档的一段介绍:

        Resizable-array implementation of the Deque interface. Array deques have no capacity restrictions; they grow as necessary to support usage. They are not thread-safe; in the absence of external synchronization, they do not support concurrent access by multiple threads. Null elements are prohibited. This class is likely to be faster than Stack when used as a stack, and faster than LinkedList when used as a queue.
分享到:
评论

相关推荐

    Java课程实验代码库-内含源码和说明书(可自己修改).zip

    此外,"Java 简记.md"可能是一个Markdown格式的文档,总结了Java语言的关键概念、语法或技巧,便于快速查阅。"README.md"是常见的项目介绍文件,通常会提供项目概述、安装指南、运行说明等信息。 通过这个代码库,...

    Java字符集编码简记

    本文将围绕“Java字符集编码简记”这一主题,深入探讨相关知识点,并结合标签“源码”和“工具”,探讨在实际开发中如何运用和处理字符编码问题。 首先,我们需要理解字符集的概念。字符集是一系列符号的集合,例如...

    java Pattern Matcher的理解简记

    Java中的Pattern和Matcher是正则表达式的核心工具类,它们在处理字符串匹配和模式查找时起着关键作用。本文将深入解析这两个类的功能、用法以及相关知识点。 首先,Pattern类是Java.util.regex包下的一个类,它代表...

    crc16校验java实现

    从数据头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021。

    CoreJava Interview Question.pdf

    这四大概念通常被简记为“A-PIE”。抽象是指在设计对象时只展示其重要特征而不包括背景细节。多态是指一个接口对应多个实现。继承是指一个类的对象能够获取另一个类对象的属性。封装则是隐藏对象的属性和行为,只...

    [简单]log4jdbc-log4j2配置简记

    标题中的“log4jdbc-log4j2配置简记”指的是在Java开发中使用log4jdbc-log4j2库来监控和记录SQL查询的过程。log4jdbc是一个开源项目,它允许开发者通过日志系统来追踪数据库操作,而log4j2是log4j的升级版,提供了更...

    jsp标准语法中7大动作 简记(经典)

    在JavaServer Pages (JSP) 技术中,七大标准动作是开发动态网页的重要组成部分。这些动作提供了在页面上操作数据、控制流程和与服务器交互的功能。以下是对JSP七大标准动作的详细解释: 1. **** 这个动作用于在...

    learning:学习简记

    【学习简记】这篇文档主要涵盖了多个IT领域的学习记录,包括设计模式、Java 8、RocketMQ、RPC机制、Scala编程语言以及前端框架Vue.js。接下来,我们将详细探讨这些知识点。 首先,设计模式是软件工程中的一种最佳...

    Android:Android 学习简记

    Android我是在Mac上学习Android,因此会跟windows有些不同,有不正确处请斧正:grinning_face:ContentsBroadcast-ReceiverContent-ProviderUI布局xmlnsFragmentcom.android.support 兼容包...

    crc16校验工具类

    crc16校验工具类,从消息头到校验码前的CRC16-CCITT的校验值,遵循大端排序方式的规定。CRC16-CCITT码生成多项式为x16+x12+x5+1,简记式1021

    模拟电梯源代码,5层教学楼电梯

    人和电梯的各种动作均要耗费一定的时间单位(简记为t)比如: 有人进出时,电梯每隔40t测试一次,若无人进出,则关门; 关门和开门各需要20t; 每个人进出电梯均需要25t; 如果电梯在某层静止时间超过300t,...

    JavaScript设计模式—单例模式详解【四种基本形式】

    本文实例讲述了JavaScript设计模式—单例模式.分享给大家供大家参考,具体...第一种,最简单的单体,只被实例化一次 我简记为json对象 (1)基本结构 var userInfo={//已经自行被实例化 其实是一json对象 name:测试

    设计一个学生类Student(学生学号、姓名、数学、英语、计算机成绩;)

    1.设计一个学生类Student。 1)数据成员包括: 学生学号、姓名、数学、英语、c语言成绩;(用字符指针存储学号和姓名,通过动态存储空间分配的方式为指针开辟指向的空间,保证空间大小没有浪费) 2)成员函数包括: ...

Global site tag (gtag.js) - Google Analytics