对象存储

点读系列《Java编程思想 前6章》

好久不见. 提交于 2020-03-15 09:50:21
第1章 对象导论 计算机是头脑延伸的工具。 所有编程语言都提供抽象机制。 每个对象看起来都有点像一台微型计算机。 每个对象在内存中都有一个唯一的地址。 每个对象都有一个接口。 向对象发送消息。 每个对象都提供服务。 每个对象都可以很好地完成一项任务,但是它并不试图做更多的事。 public 任何人都是可用的。 private 除类型创建者和类型的内部方法之外的任何人都不能访问。 protected 与private作用相当,差别仅在于继承的类可以访问protected成员。 Java的默认访问权限:包访问权限,类可以访问在同一个包中的其他类的成员。 代码复用是面向对象程序设计语言所提供的最了不起的优点之一,复用某个类的最简单方式就是直接使用该类的一个对象。 在建立新类时,应该首先考虑组合(将一个类的对象置于新类中),而不是盲目的继承。 类与基类具有相同的类型。 通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛。 Java以extends关键字表示继承。 把一个对象不当做它所属的特定类型来看待,而是将其当做其基类的对象来对待。这样的代码不会受添加新类型的影响的。 通过导出新的子类型而轻松扩展设计的能力是对改进进行封装的基本方式之一。 编译器不可能产生传统意义上的函数调用。 在OOP中,程序直到运行时才能够确定代码的地址,这叫做后期绑定

HashMap的实现原理

蓝咒 提交于 2020-03-13 09:24:54
一,前言 1.1,概述 ​ 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射(K-V)。Java提供了专门的集合类用来存放这种对象关系的对象,即 java.util.Map 接口。 Collection 中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 Map 中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键(K)可以找对所对应的值(V)。 Collection 中的集合称为单列集合, Map 中的集合称为双列集合。 需要注意的是, Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。 ​ 通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合。 HashMap<K,V> :存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 LinkedHashMap<K,V> :HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法

Java HashMap实现原理分析

末鹿安然 提交于 2020-03-13 09:20:18
参考链接:https://www.cnblogs.com/xiarongjin/p/8310011.html 1. HashMap的数据结构 数据结构 中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。 数组 数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难; 链表 链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。 链表 的特点是:寻址困难,插入和删除容易。 哈希表 那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表。哈希表((Hash table)既满足了数据的查找方便,同时不占用太多的内容空间,使用也十分方便。   哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法—— 拉链法,我们可以理解为“ 链表的数组 ” ,如图:   从上图我们可以发现哈希表是由 数组+链表 组成的,一个长度为16的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28

JavaScript 对象属性底层原理

泪湿孤枕 提交于 2020-03-13 09:14:38
对象属性类型 1. 数据属性 [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,特性默认值为true [[Enumberable]]:表示能否通过for-in循环返回属性,特性默认值为true [[Wtiteable]]:表示能否修改属性的值,特性默认值为true [[Value]]:包含这个属性的数据值,读取属性值/写入属性值,从这个位置读/把新值保存在这个位置,这个特性的默认值为undefined 2. 访问器属性 [[configurable]]: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,特性默认值为true [[Enumberable]]:表示能否通过for-in循环返回属性,特性默认值为true [[Get]]:在读取属性时调用的函数,默认值为undefined [[Set]]:在写入属性时调用的函数,默认值为undefined 3. 定义对象的访问器属性 - Object.defineProperty var book = { _year: 2004, edition: 1 }; Object.defineProperty(book, "year", { get: function(){ return 2018; },

Java虚拟机--内存结构

筅森魡賤 提交于 2020-03-13 05:35:53
1.JVM是什么?    JVM:Java Virtual Mechinal(Java虚拟机).它是一个虚构的计算机,是通过在实际的计算机上模拟各种功能来实现的。JVM的主要工作是解释自己的指令集(字节码,如java源码编译成class文件在虚拟机上运行)并映射到本地的CPU指令集或OS的系统调用。Java语言跨平台的本质就是不同的操作系统使用不同的JVM映射规则,使其与操作系统无关,从而实现跨平台。 2.JVM的内存结构是什么样子?    Java虚拟机在运行Java程序的时候,会把它所管理的内存划分为若干个不同的数据区域,如图:        3.那么接下来每个数据区域都是做什么的呢?    (1).程序计数器: 是一块较小的内存空间,可以看作是当前线程所执行字节码的行号指示器。尤其在多线程的情况下,尤为重要。Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,即在任何一个确定时刻,一个处理器只会执行一条线程,当线程切换后就需要恢复到正确位置,因此,程序计数器要实现线程隔离,每个线程都有自己的专属的计数器。值得注意的是: 此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。    (2).堆 : 此内存区域是Java虚拟机管理的最大一块内存,同时也是线程共有的,在虚拟机启动时创建

Java 数据存储

邮差的信 提交于 2020-03-12 16:37:12
寄存器register 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制 最快的存储区(由编译器根据需求分配,无法从程序中控制) 位于处理器内部 数量有限 常量存储constant storage 存放字符串常量和基本类型常量(public static final) 常量值通常直接存放在程序代码内部 有时在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中 (ROM,Read Only Memory,只读内存。一种只能读出事先所存数据的固态半导体存储器,它相当于PC机上的硬盘,用来存储和保存数据。RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM就不会。) 静态存储区static storage 存放静态成员(static定义的)包括静态成员变量和静态成员方法(类方法) 静态是指“在固定的位置” 静态存储里存放程序运行时一直存在的数据 可用关键字static来标识一个对象的特定元素是静态的 但JAVA对象本身从来不会存放在静态存储空间里 重点注意: 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。 如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量。

aws S3存储概念

无人久伴 提交于 2020-03-12 11:01:32
S3存储(Simple Storage Service) 存储桶: 存储桶是S3中用于存储对象的容器。每个对象都存储在一个存储桶中。 对象: 对象是S3中存储的基本实体。对象由对象数据和元数据组成。数据部分对S3不透明,元数据是一组描述对象的名称-值对。 键: 键是存储桶中对象的唯一标识符。存储桶内的每个对象都只能有一个键。由于将存储桶、键和版本ID组合在一起可唯一地标识每个对象,可将S3视为一种“存储桶+键+版本”与对象本身间的基本数据映射。 区域: 选择地理区域供S3存储创建的存储桶。主要目的是优化延迟、尽可能减低成本或满足法规要求(当地用户的数据隐私)。 来源: https://www.cnblogs.com/walker-/p/9869200.html

Redis 存储原理(1)

北慕城南 提交于 2020-03-11 22:58:29
Redis现在基本也算是后台开发的基础服务,基本像Mysql一样普遍在应用中使用了。我第一次接触的Nosql是memcache用来解决夸服务session共享问题。后来因为memcache无法持久化问题改为使用Redis。这次主要针对Redis做一个整理。 Redis数据类型 类型 特点说明 String 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB Hash Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。 List Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) Set Redis 的 Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1) ZSet 与Set不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序 HyperLogLog 在 2.8.9 版本添加是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的 Bitmaps 可做为 布隆过滤器 使用 GeoHash Redis 3.2 版本地理空间位置(纬度

记录一下jvm的相关知识点

有些话、适合烂在心里 提交于 2020-03-11 13:22:06
java 运行时数据区域: 程序计数器 => (每个线程都包含一个程序计数器)用来记录字节码执行的行号,字节码指令的循环,跳转,异常处理,线程恢复等需要依靠计数器。 Java虚拟机栈 => 主要用来描述Java方法执行的内存模型,(每个线程都包含一个虚拟机栈)主要用来处理方法的调用,虚拟机栈中的存储单元是栈帧,方法在执行的同时都会在虚拟机栈中创建一个栈帧,栈帧包含操作数栈,局部变量表,动态链接和方法出口等,每个方法从调用到执行完毕都对应着一个栈帧在虚拟机栈中的入栈和出栈的过程。局部变量表的存储单位为slot(4个字节),因此double 和long类型需要占用2个slot的存储空间。 栈的深度有一定限制,当深度操作最大的调用栈大小会出现StackOverflowError异常。 本地方法栈 => 为虚拟机执行java方法的服务(native方法),类似虚拟机栈 java堆 => 对象和数组存储的场所,也是gc收集器的主要管理区域,现在收集器基本采用分代收集算法,可通过-Xmx -Xms来分配堆内存大小,当堆内存无法分配内存时,会出现OutOfMemoryError异常。 方法区 => 用于存储已被虚拟机加载的类信息,静态变量,常量以及即时编译器编译后的代码等,方法区无法分配内存是会出现OutOfMemoryError异常。 运行时常量池 =>方法区的一部分

java 成员变量和局部变量

好久不见. 提交于 2020-03-10 13:58:51
作用范围:   成员变量作用于整个类中   局部变量作用于函数中,或者语句中 存储位置:   成员变量:堆内存中,因为对象的存在,才在内存中存在   局部变量:栈内存中 来源: https://www.cnblogs.com/hongxiao2020/p/12455051.html