当前位置: 首页 > news >正文

做wap网站能火吗国内搜索引擎

做wap网站能火吗,国内搜索引擎,宁波高端网站开发,人才网站 建设好 窗口我们知道,访问数组元素要通过数组索引,如: arr[0]如果直接访问数组,比如: int[] arr1 {1}; System.out.println(arr1);会发生什么呢? 打印的是一串奇怪的字符串:[I16b98e56。 这个字符串是J…

我们知道,访问数组元素要通过数组索引,如:

arr[0]

如果直接访问数组,比如:

int[] arr1 = {1};
System.out.println(arr1);

会发生什么呢?

在这里插入图片描述
打印的是一串奇怪的字符串:[I@16b98e56

这个字符串是Java在打印对象时的特殊输出,包含如下三部分信息:

  • 对象类型,如上图的[符号表示是数组类型,I表示整形数组
  • @是分隔符,没有实际意义
  • 16b98e56是堆内存地址,通过这个变量找到数组后,才能对其进行访问和修改

也就是说,数组变量存储的不是数组,而是一个地址,这个地址指向了哪里呢

要回答这个问题,首先要了解下Java的内存分布原理。

一,Java的内存分布

1,Java虚拟机内存划分

Java将虚拟机内存分为如下几个区域:

  • 本地方法栈
  • 寄存器
  • 虚拟机栈
  • 方法区/元空间

这样需要注意的是:从JDK8开始,Java取消了方法区,将方法区拆分到堆区、堆外区、元空间,增加一个元空间区,同时增加了堆外内存的使用。

JDK8前的内存分布:

在这里插入图片描述

JDK8的内存分布:

在这里插入图片描述

2,基本类型和引用类型的内存分布差异

特别来看下堆和栈,这是最为核心、重要的两个内存区域:
在这里插入图片描述

根据堆栈知识来理解下基本类型和引用类型的不同,这两种类型的变量值都存储在栈内存,但变量值本身的意义有较大的区别:

  • ①基本类型变量的值直接存储在栈内存,不涉及堆内存
  • ②引用类型变量的值在栈内存存储的是对象的地址,指向对象在堆内存的地址

基本类型变量的内存分布(仅涉及栈内存):

在这里插入图片描述

引用类型变量的内存分布(涉及栈和堆):

在这里插入图片描述

二,一个数组的内存分布

对于如下代码:

int[] arr = new int[2];
sout(arr);
sout(arr[0]);
sout(arr[1]);

逐行解释如上代码:

第一行代码声明并初始化一个数组arr,Jvm会做两件事:

  • ①在栈内存分配一块内存,存储数组对象地址
  • ②在堆内心分配一块内存,存储数组元素

第二行代码打印数组地址

第三行代码访问数组第一个元素,Jvm会根据栈内存中数组变量存储的地址,找到堆内存中数组对象,访问并读取第一个元素,然后打印

第四行代码和第三行作用相同,不同的是读取的是第二个元素

在这里插入图片描述

三,两个或多个不同数组的内存分布

当我们创建两个或两个以上的不同数组时,如图所示,会在栈内存中创建两个变量,这两个变量存储两个不同的堆内存地址,指向堆中不同的两个内存区域,存放着不同的两个数组对象:

在这里插入图片描述

当我们打印这两个数组变量时:

System.out.println(arr);
System.out.println(arr2);

输出的地址不相,分别是:[I@0x110fa7f48[I@0xbec966a

三,两个变量指向同一个数组的内存分布

int[] arr1 = {11,22};
int[] arr2 = arr1;
sout(arr1);
sout(arr2);
sout(arr1[0]);
sout(arr2[0]);
arr2 = new int[]{11, 22}

逐行解释如上代码:

第一行代码声明并初始化一个数组arr1,Jvm做两件事:

  • ①在栈内存分配一块内存,存储数组对象地址
  • ②在堆内心分配一块内存,存储数组元素

第二行代码声明并初始化一个数组arr2,Jvm做两件事:

  • ①在栈内存分配一块内存
  • ②将arr1变量的值复制给arr2

此时,变量arr1和arr2指向了同一块堆内存

在这里插入图片描述

执行第三行第四行代码:

sout(arr1);
sout(arr2);

会打印两个一样的值:[I@0x0011

第五行代码访问数组arr1第一个元素,Jvm会根据栈内存中数组变量存储的地址,找到堆内存中数组对象,访问并读取第一个元素,然后打印。

第六行代码访问数组arr2第一个元素,因为arr1arr2指向同一个数组,所以打印结果和第五行一致。

接下来,请大家思考,执行第七行代码arr2 = new int[]{11, 22}后,会出现什么情况呢?

尽管这个数组的元素个数、值都和arr1一致,但是Jvm还是会在堆区创建一个新的数组,并将arr2的值覆盖为新的数组对象的地址:

在这里插入图片描述

如果再次执行第三行第四行代码:

sout(arr1);
sout(arr2);

打印的结果就不再相同了,分别是[I@0x33bab[I@0x453fe

五,结论

  • ①数组变量分配在栈内存,存储的是对象地址,这个地址指向堆内存
  • ②数组对象(数组大小、所有数组元素)本身存储在堆内存中
  • ③访问和修改数组要通过数组变量存储的地址,找到数组对象,然后访问和修改其中的元素值
  • ④如果两个数组变量指向同一个数组对象,则通过变量访问的是同一个对象。如果之后其中一个数组指向另一个对象,通过这两个变量访问的就不再是同一个对象了
http://www.mmbaike.com/news/92291.html

相关文章:

  • wordpress手机加搜索武汉seo网站排名
  • 做网站 就上凡科网网络推广和网站推广
  • 淄博哪有培训做网站的香港疫情最新情况
  • 云浮网站建设徐州seo推广
  • 最新的域名最好的网站优化公司
  • 网站建设模块方案商家推广平台有哪些
  • 石家庄快速网站搭建一年的百度指数
  • 陕西省中小学教师培训网站如何销售自己产品方法有哪些
  • 广州专业的免费建站seo外包公司哪家好
  • 便宜做网站线上推广产品
  • 网站栏目定位百度云网页版登录入口
  • 两学一做 山西答题网站济南网站建设公司选济南网络
  • 可以做司考真题的网站2023新闻热点摘抄
  • 建站系统社区百度推广平台登录网址
  • 深圳本地做网站青岛网络推广公司哪家好
  • 自己怎么开发社交app软件seo排名大概多少钱
  • 品牌手机网站开发seo优化交流
  • 厦门做网站软件泉州排名推广
  • wordpress例温州企业网站排名优化
  • 网站开发的后台开发工具seo搜索优化
  • 上海网站建设推荐案例制作网站的最大公司
  • 哪个网站做公司业务广告效果好武汉推广服务
  • 做网站要备案产品软文范例1000字
  • 网站是怎么搭建的搜索引擎seo优化平台
  • php旅游网站cms网站开发需要的技术
  • 摄影图片网站百度手机助手app下载安装
  • 150网站建设seo入门培训学多久
  • 抖抈短视频app下载安装百度地图排名怎么优化
  • 白银市住房与建设局网站十大计算机培训机构排名
  • 北京网站搭建多少钱企业网站建设方案模板