精华内容
下载资源
问答
  • Java数组对象占用多少个字节?

    千次阅读 2020-12-15 17:40:27
    Java内存模型基础知识 对象内存中可以分为三块区域: 对象头(Header) ...众所周知Object object = new Object()占用了16字节,然后看一下下面几个数组占用空间大小 int[] intArr = new IntArr[3]; St...

     

    Java内存模型基础知识

    内存占用详情通过openJDK打印

    // Pom文件
            <dependency>
                <groupId>org.openjdk.jol</groupId>
                <artifactId>jol-core</artifactId>
                <version>0.10</version>
            </dependency>
    // 打印语句
     Object[] objects = new Object[3];
    System.out.println(ClassLayout.parseInstance(objects).toPrintable());

    对象内存中可以分为三块区域:

    • 对象头(Header)

      • MarkWord占用8字节

      • Class Point占用4字节

      • Length 数组占用4字节

    • 实例数据(Instance Data)

    • 对齐填充(Padding)

    众所周知Object object = new Object()占用了16字节,然后看一下下面几个数组占用空间大小

    int[] intArr = new IntArr[3];

    String[] stringArr = new String[3];

    byte[] byteArr = new byte[3];

    long[] longArr = new long[3];

    对于上面几个数组来说,Mark Word, Class Point,Length占用的空间都是一样的(16),只有实例数据占用空间不相等,那么先看一下相同部分空间占用情况,

    Mark Word占用8个字节

    Class Point 占用4个字节

    Length 占用4个字节

    然后分别看一下每个数组实例数据占用的空间大小

    类型 头部占用 实例数据占用空间详情(字节) 补齐填充 总占用
    byte 16 3 5 24
    int 16 12 4 32
    long 16 24 0 40
    String 16 12 4 32

     

    对于上面的结果,我对byte,int,long的占用完全理解,因为实例数据占用 = 数组长度 * 类型占用字节数,但是对于String类型不甚理解,然后各种百度,最后终于榆木脑袋开了窍,对于String数组来说,每个元素就是存的一个对象的引用地址,而每个引用地址占4个字节,所以实例数据占用 = 数组长度 * 引用地址占用字节数

    在看下面两个例子:

    分别创建两个对象

    对象1

    public class Obj1 {
        private char[] value;
        private int count;
        private int offset;
        private int hashcode;
    }

     对象2

    public class Obj2 {
        String value;
    }

    Obj1[] arr1 = new Obj1[3];

    Obj2[] arr2 = new Obj2[3];

    可以预测一下上面两个对象占用的空间大小.

    实际结果: 两个对象占用空间大小是一样的

     

     

     

    展开全文
  • Java实现字节数组中截取指定长度数组元素

    万次阅读 多人点赞 2016-09-07 14:53:49
    本文使用System提供的一静态方法arraycopy(),实现数组间的复制。 public static native void arraycopy(Object src,int srcPos,Object dest, int destPos,int length);src:源数组 srcPos:源数组要复制的起始...

    本文使用System提供的一个静态方法arraycopy(),实现数组间的复制。

    public static native void arraycopy(Object src,int srcPos,Object dest, int destPos,int length);
    src:源数组

    srcPos:源数组要复制的起始位置

    dest:目的数组

    destPos:目的数组放置的起始位置

    length:要复制的长度


    例子:在字节数组中截取指定长度数组

        public static byte[] subBytes(byte[] src, int begin, int count) {
            byte[] bs = new byte[count];
            System.arraycopy(src, begin, bs, 0, count);
            return bs;
        }

    Ending...


    展开全文
  • Java 对象(数组)多大空间(几个字节) 手把手做实验

    千次阅读 多人点赞 2020-04-08 16:40:13
    先查看一下jvm启动的默认参数,里面有2参数值对本次实验会造成影响。 命令行: java -XX:+PrintCommandLineFlags -version 查看jvm默认参数 分别是 -XX:+UseCompressedOops 和 -XX:+UseCompressedClassP...

    废话不多说,一起开干

    1 前置知识

    本次实验基于jdk8 64位以及以上版本。本机环境为jdk11
    在这里插入图片描述
    先查看一下jvm启动的默认参数,里面有2个参数值对本次实验会造成影响。
    命令行: java -XX:+PrintCommandLineFlags -version 查看jvm默认参数
    在这里插入图片描述

    分别是 -XX:+UseCompressedOops 和 -XX:+UseCompressedClassPointers
    这2个参数都是默认开启(+代表开启,-代表关闭)

    UseCompressedOops:普通对象指针压缩(oop是ordinary object pointer的缩写),
    UseCompressedClassPointers:类型指针压缩。

    从字面意思很容易理解。
    举个例子说明一下: Object o = new Object();
    o指向new Object()的引用就是“普通对象指针”,
    new Object()自身还需要指向Object类型的引用,也就是"类型指针"。

    这2个压缩参数可以有4种组合(++, --, + -, -+),但有1种组合是会抛出警告的:

    -XX:+UseCompressedClassPointers -XX:-UseCompressedOops,不要使用这种参数组合,用这种参数启动jvm时会抛出警告。

    原因是jvm层面的hotspot源码对jvm的参数组合做了限制,一看就懂:

    在这里插入图片描述
    请大家有个印象,这2个参数在开启压缩时是占4个字节,关闭压缩时是占8个字节。马上开始进行我们的实验。

    2 对象的内存存储布局

    在这里插入图片描述
    下面使用JOL库(Java Object Layout)来分析查看对象的内存布局,JOL库是openjdk中分析JVM中对象布局的工具库。

    新建1个maven项目,引入

    <dependency>
      <groupId>org.openjdk.jol</groupId>
      <artifactId>jol-core</artifactId>
      <version>0.9</version>
    </dependency>
    

    依赖即可使用。

    2.1 使用默认参数-XX:+UseCompressedClassPointers -XX:+UseCompressedOops开启压缩启动程序,打印出Person对象的内存布局,进行详细说明。

    在这里插入图片描述
    Person对象合计占用32字节。

    2.2 使用参数关闭压缩-XX:-UseCompressedClassPointers -XX:-UseCompressedOops启动程序,打印出Person对象的内存布局,进行对比说明

    在这里插入图片描述

    Person对象合计占用40字节。

    3 数组的内存存储布局

    在这里插入图片描述

    使用默认参数-XX:+UseCompressedClassPointers -XX:+UseCompressedOops启动程序,打印出数组对象的内存布局,进行详细说明。
    在这里插入图片描述
    new Long[5]占用40字节,new long[5]占用56字节。

    关闭指针压缩参数的例子就不详细再写了,各位可以自行尝试。

    关于boolean值(比较特殊的基本类型)也做了实验,大家可以自己分析下,看和自己设想的是否一致:
    在这里插入图片描述
    同时也可以利用jol库对自己其他想验证的想法进行试验验证。

    demo示例代码, 需要的自取: https://github.com/wanjinyu1988/joldemo.git

    展开全文
  • 二维数组中数组元素存储地址的计算一问

    万次阅读 多人点赞 2019-01-31 08:55:59
     a[i][j]的地址是p+(i*col+j)*d(d是数组元素字节数)。  同学编程序进行验证,出问题了:  地球停止转动了也必须先赞这种学习方式!  同学问:“老师,第一张图的4,我怎么觉得不对呢?第二张图我没4,...

    关于二维数组中数组元素的存储地址,有同学问出了个好问题。
      在我的课件中,出现了下面的讲解:
    在这里插入图片描述
      a[i][j]的地址是p+(i*col+j)*d(d是数组元素所占的字节数)。
      同学编程序进行验证,出问题了:
    在这里插入图片描述
      地球停止转动了也必须先赞这种学习方式!
      同学问:“老师,第一张图的4,我怎么觉得不对呢?第二张图我没4,结果好像也对,这里面差在哪呢?”
      
      我的答复:“两个都对。”
      第一张图在讲原理,是我们在人脑里面要以“字节”为单位计算,p为首地址,单位是字节,再往后多少个字节,必须考虑到在整型数组中每个数组元素占4个字节,从首地址到a[i][j](i*col+j)个元素,计算其字节地址时,乘4是必要的。
      第二张图是在计算机中的运行结果,是已经在计算机内按找第几“个”数组元素为单位计算地址值了,*4的操作,是在寻址中已经计算过了,在此直接输出结果。
      更直白地,第一张图中的“p+”中的加,和我们日常算术中的加一样,我们按“字节”说事;而第二张图中的“p+”,是C语言中指针的加运算,是增加一个单元,究竟多少字节,还要考虑指向的元素的数据类型,在32位系统中,对于整型,一个单元4字节,而对于double型,一个单元8字节。
      两个加号形状一样,含义是不同。
      
      这个问题,学C/C++的同学才可能会遇到,学习C/C++中主动寻疑验证的同学才会遇到。可见学C/C++的价值,可见主动寻疑验证的价值。
      
      想起离散数学中的代数结构,用符号任意地表达运算,研究或设计运算系统,好一个“让思绪飞扬”和”精彩世界“,一不留神却成了“枯燥乏味”和“与实践无关”。
      能从不同层面,不同视角看问题,这就是自由。

    展开全文
  • C++之判断数组元素个

    千次阅读 2019-09-28 07:22:26
    因此,判断数组元素个数写法如下: num=sizeof(array)/size(a[0]); 2.判断string类型元素个数 string是字符串,判断字符串中的字符数 num=string.size(); 3.判断vector数组元素个数 vector创建动态...
  • 数组作为函数参数并传递数组元素个数的种有效方法  //由于数组的元素数默认情况下是不作为实参内容传入调用函数的,本程序用来讨论有此带来的  //相关问题,以及解决问题方法,即给调用函数传递数组的...
  • 数组分为一维数组,二维数组以及多维数组。我们着重看一下一维和二维数组; 一,1, 数组的格式   数组类型 数组名 [常量表达式] #define Maxlen 100 int str[Maxlen],nt str1[10]; 2,数组的初始化方式...
  • 数组A[10][15]的每个元素都是4个字节的数据,将其按列优先次序存储,若A[0][0]存储地址在起始地址为1000的内存单元中,则元素A[6][9]的地址是?答案1384 loc=1000+4*[10*(9)+(6)]=1384 这个是有公式的:A[n][ ],求...
  • 因为数组中的每元素,其实都可以直接看成是一变量,所以指向数组元素的指针,也就是变量的指针。 指向数组元素的指针不难,但很常用。我们用程序来解释会比较直观一些。 unsigned char number[10] = {0, 1, 2, 3...
  • C/C++获取字符数组元素个

    千次阅读 2020-08-26 23:48:35
    sizeof是C/C++中的一操作符,用于返回传入的数据的长度(字节数) 对于一般的元素类型来说,我们通常使用sizeof获取其长度,也习惯使用其获取数据的长度,但是如果对字符数组或者指针进行sizeof操作,往往无法...
  • C语言数组元素下标为何从0开始

    万次阅读 多人点赞 2016-05-06 11:24:51
    很多同学可能在学习数组时会有这疑问,下标为什么不从1...要弄清楚这问题,得先看一下计算机底层是怎样处理数组元素的。我们先编写了一小程序,然后在visual studio中对其进行了反汇编。源程序和反汇编后的部分
  • 指向数组元素的指针

    千次阅读 2010-01-11 22:30:00
    一、指向数组元素的指针我们定义一整型数组和一指向整型的指针变量:int a[10], *p; 和前面介绍过的方法相同,可以使整型指针p指向数组中任何一元素,假定给出赋值运算p=&a[0]; 此时,p指向数组中的第0号元素,即a...
  • 数组元素初始化为0的方法

    千次阅读 2018-09-15 10:51:08
    int main() { int a[MAXN] = { 0 }; //数组元素初始值为0 memset(a, 0, MAXN * 4);//清零MAXN * 4个字节数 for (int n : a) { printf("%d", n); } system("pause"); return 0; }
  • a [ 0 ] [ 0 ] a [ 0 ] [ 1 ] a [ 0 ] [ 2 ] a [ 0 ] [ 3 ] a [ 0 ] [ 4 ] a ...其实二维数组是线性排列起来的。 所以a [ 3 ] [ 4 ] 之前的是 0.1 .2 行的所有,外加 3 行的 0.1 .2 .3 列
  • numpy教程:numpy基本数据类型及多维数组元素存取

    万次阅读 多人点赞 2014-09-11 23:58:10
    标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。这样为了保存一简单的[1,2,3
  • 数组名在纯被引用时它的含义是指向数组第一个元素的指针常量。 1 一维数组 1.1 表达式中的数组名 当定义一一维数组后,元素以地址连续的形式存储在内存中。当在程序的表达式中引用数组名时它被当成指向...
  • 在java 8种基本数据类型中,其中七种都有明确的长度,它们分别是,单位字节即8bit: byte 1 short 2 int 4 long 8 float 4 double 8 char 2 对于boolean 类型呢,并没有定义。 那么我们看java虚拟机规范: 在《Java...
  • 一个字符型数组的空间1个字节 C语言中计算a数组的大小是printf("a数组的大小是%d\n",sizeof(a)); C语言中计算一个整型数组的空间是printf("一个整型数组的空间是%d\n",sizeof(int)); C语言中计算一个字符型数组的...
  • Java中boolean类型占几个字节,你知道吗?

    千次阅读 多人点赞 2019-07-26 17:21:16
    背景 最近在复盘Java基础知识,看到基础数据类型这一章节,有一张图片是这样的。 ...一boolean类型占用8位 = 1字节 出处2 ~ Java官网 1 原始类型 Primitive Data Types boolean: The boolea...
  • 天在看c++基础内容,看到数组的时候,书里提到数组元素的约束条件: 1.元素类型支持赋值操作。 2.元素类型支持复制。 因此,除了引用类型对象和流对象外,其他的任意内置类型和满足上述约束的类类型均...
  • 在C++中 memset() 可以将数组每元素初始化为-1 0 false true 这我们经常用,是可以的,但是昨天将数组元素初始化为1 就出错了。全部变成了168009!不知道是怎么一回事?大虾们能否给指点迷津? 很简单...
  • 首先Java中共有8中基本数据类型和3中引用数据类型,那么这8种基本数据类型都占几个字符呢? 二、分析问题 Java中的8种基本数据类型分别是: 字节型:byte 字符型:char 整型:int 长整型:long 短整型:short 浮点...
  • 数组,下面对这几个名词进行分析: 1、数组元素地址 :该数组有10个元素数组元素即a[0],取的是该元素的地址。 2、数组首地址:就是数组名字a的地址。 3、整个数组地址:就是整个数组的地址,取地址&...
  • 史上最详细java对象占几个字节?

    千次阅读 2020-02-08 18:34:01
    要想分析某个对象大小,要借助一工具jol-core,他的maven地址是: <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.9<...
  • 帮同学解决了一问题,自己从中也学到了东西,记下学习心得~~~ 问题重现: 数组通过函数传递后为什么获取不到数组在内存中占用地址的长度? 在VS中编写如下的测试代码: #include "stdafx.h" void test(int b...
  • 大家学习c语言刚接触数组时候,书上说第一个数组元素要从下标0开始数起,不能从1开始数,比如 int a[4]={1,2,3,4}; 那么a[0]=1; 为什么不从1数起呢 即a{1}=1呢?不更符合大家的生活习惯吗?
  • 字节数组bytearray()

    千次阅读 2019-06-21 14:44:02
    字节串 bytes,字节数组bytearray是二进制数据组成的序列,其中每个元素8bit二进制组成 字节数组bytearray 可变的字节序列,相当于bytes的可变版本 创建bytearray对象的方法规则 import numpy as np import ...
  • 数组中的字节

    千次阅读 2020-06-17 16:26:15
    ##sizeof查看定义的数组所占用字节数 #include<iostream> int main(){ using namespace std; int Inter [10]; short sh [10]; char ch [10]; long lg [10]; float fl [10]; double dou [10]; cout...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 142,204
精华内容 56,881
关键字:

数组元素占几个字节