java 中 Integer a =1 在哪开辟内存空间来视图 存储空间 内存1呢

java内存空间详解[1]_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
java内存空间详解[1]
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩7页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&?????? 看了很多乱七八糟的的书,最后突然自己把最基础的东西忘记了,所以特地温习了一下,记录下来,与大家共勉。
?????? 在Java中可以通过Integer.SIZE这样的方法直接查看基本类型所占空间的大小。通过一下程序就能够查看了:
System.out.println("Integer:"+Integer.SIZE);
System.out.println("Byte:"+Byte.SIZE);
System.out.println("Long:"+Long.SIZE);
System.out.println("Short:"+Short.SIZE);
System.out.println("Character:"+Character.SIZE);
System.out.println("Double:"+Double.SIZE);
System.out.println("Float:"+Float.SIZE);
???? 输出结果是(单位是bit):
????? Integer:32(4个字节)
????? Byte:8(一个字节)
????? Long:64(8个字节)
????? Short:16 (2个字节)
????? Character:16 (2个字节)
????? Double:64 (8个字节)
????? Float:32(4个字节)
????? Boolean类型有点奇怪,是这么说的:This data type represents one bit of information,
?but its "size" isn't something that's precisely defined.(这种数据类型保存一位的信息,但是它的大小却不是精确定义的。高手给讲解一下普通变量在内存中的存储实现方式?和指针有什么区别?? - 开源中国社区
当前访客身份:游客 [
当前位置:
例如&int&a = 3 ;
a&在内存中指什么?和指针的区别?
共有7个答案
<span class="a_vote_num" id="a_vote_num_
你指的是哪门语言
JAVA的话,局部变量存放在栈中,int a = 3,表示在栈中开辟一个4个字节的空间,名称为a,即你可以通过a来访问到这个空间,该空间的值为3
--- 共有 1 条评论 ---
他应该说的是c或者c++吧,java也没指针那
(4年前)&nbsp&
<span class="a_vote_num" id="a_vote_num_
指针也好,变量也好。没有区别,对于C而言,指针也是一种类型的变量。有区别的只是类型与变量。
类型是指某类变量的形状,哈,野鬼用语。因为类型与类型,说到存储上,唯一的区别在于他们的位宽。说到操作上,还存在其他如符号等差异。
一个变量,就是一个存储空间。指针变量也同样就是一个存储空间。直接使用变量操作是对这个存储空间的指进行操作。但指针类型是个特殊类型的变量,首先是无符号的,其次指针的位宽不管指引的变量类型是何,通常都是和总线地址宽度对应的。该32位的,不会24位。
普通变量,如果不是函数内的普通变量,都存在自身独立的存储空间,也即不会和函数实际在CPU里执行的状态而变化。算属于加载程序成为进程时,分配的,虽然在编译链接时就静态存在,但存在不代表就有具体的位置不是吗?而函数内的普通变量,只对函数有效,为了高效的实现代码,所以函数内的变量,通常利用当前CPU的资源,也就是堆栈,或寄存器。而由于这两个都是系统资源,所以是动态的。不是变量动态,而是变量的存储位置是动态的。
简单的说 ,上述两种变量,一个如同你的饭盒,用来吃东西,无论哪次,都是你自己的。而函数内的,则如同食堂里的椅子或筷子,你来给你用,但你用的时候,别人也不会抢,可不保证每次你来都能用那套。因为可能你来之前别人先用了。
至于指针变量,也是个存储空间,和其他变量一样。只不过在申明这个变量时,会定义一个指向空间的类型。例如 int *,这个意思是说,这个空间里的数值,是指向一个int的存储空间的。这对这个指针本身没有任何影响,而是这个指针的操作时,会有一些默认的方法。例如
int *p =0x1234;
char *pc = 0x1234;
p++; p = 0x1238;
pc++; p = 0x1235;
一个自动加上4,一个自动加上1.这是高级语言区别汇编的优势所在。算是高级语言的特性而已。汇编则连类型都不存在。想怎么加,想当作有符号还是无符号,得根据你的指令来决定。汇编看到的就是全都是存储空间而已。
指针另外有个区别传统变量的地方。就是
这个是有意义的。意思是,p是个存储空间。里面存放的内容是一个指向其他空间地址的数值。但是指向的空间没有类型意义。
而你如此定义
是非法的,这个表示存在个v变量,它的空间是没有意义的。由于没有意义,这个空间的大小就是位宽,就无法描述。所以非法。
<span class="a_vote_num" id="a_vote_num_
有本书叫《彻底搞定C指针》,是pdf格式的,强烈推荐你去看看。专门针对你这类问题。
<span class="a_vote_num" id="a_vote_num_
另外,如果你说的是JAVA,那完全没必要去想了,JAVA的变量和C等编译型语言是完全不同的,如果想了解JAVA等解释型语言的变量结构,那就得去了解字节码文件格式,推荐书籍《深入JAVA虚拟机》。
在变量方面,编译型语言和解释型语言最明显的区别就是,编译型语言不能获取变量名称,而解释型的可以。
<span class="a_vote_num" id="a_vote_num_
int a =3 这是一个无法按照那种指针和引用来理解的语句,很奇怪,如果是按照一个地址存一个值(这里不管是直接存值,还是存值的地址),那么只要修改这个地址的值理应改变所有引用到这个值的指针都会改变,这个理解显然和事实不同。我个人理解是a=3这种语句真正就是虚拟机在使用自己一个常量的值在运算,既然是常量你就无法修改这个值了,那么当你给 int a = 3; 然后a=2的时候他不会按照那种引用关系来操作,没有去修改a这个引用的值,把内存3刷成2,他更类似于一种用一个新的3的内存值给你,这个名字就叫a,但是天然上他已经不再是你原来的那个a了。
& System.out.println(System.identityHashCode(new Integer(&1&)));&
System.out.println(System.identityHashCode(new Integer(1)));&
System.out.println(&******************&);
int i = new Integer(&1&);&
System.out.println(System.identityHashCode(i));
i = new Integer(1); System.out.println(System.identityHashCode(i));
i = 1; System.out.println(System.identityHashCode(i));&
System.out.println(&******************&);&
Integer b = new Integer(&1&);
System.out.println(System.identityHashCode(b));&
b = new Integer(1);
System.out.println(System.identityHashCode(b));&
System.out.println(System.identityHashCode(b));
Integer b1 = 1;&
System.out.println(System.identityHashCode(b1));&
System.out.println(&******************&);&
class A { }&
A a = new A();&
System.out.println(System.identityHashCode(a));&
a = new A();&
System.out.println(System.identityHashCode(a));
这段代码将会非常经典的证明这个东西,。
System.out.println(System.identityHashCode(new Integer(&1&))); System.out.println(System.identityHashCode(new Integer(1)));这两句证明了,这两个是开辟了两块地址的。绝对不是使用一个地址。
接下来一段就非常有意思,int i 这种方式使用的时候,三种方式他使用的竟然是同一个值,这也就直接证明了,int a =3,其实就是给你一个常量内存3然后他就是a这种思维方式。这个时候甚至你在后面用new都会虚拟机忽略掉了,他不会给你重开内存。
第三段代码证明,Integer和int在使用上是不同的,他是遵循了引用这种常规方式的。而且他的new Integer确实是在重新开辟内存,同时他也采用了类似于string的缓冲池。
第四段代码证明了大多数普通对象也是采用那种引用到对象的使用方式。
<span class="a_vote_num" id="a_vote_num_
int&a = 3 ; a 只是一个标识符号,一点意义都没有。 单独存在没啥用,只是区别于 int b=3;
int a=3; int b=3; a和b都只是标识,表示两个是数字3的标识符。具体是,代表两个int类型的010101.....
  C++中的“指针”实质上是指针类型的数据, 可以是“变量”也可以是“常量”,它里面存储的数值常被解释成为内存里的一个地址。人们往往只是简单的说“指针”,没有带“常量”或“变量”二字,那么,一个“指针”到底是指常量呢还是指变量呢?这个问题要根据它所属的那个整句来进行判断。C++中的指针按照它所指向的对象可以划分为变量指针、数组指针、函数指针、对象指针、类的成员数据指针和类的成员函数指针。
<span class="a_vote_num" id="a_vote_num_
谢谢各位。。。。已经搞懂啦
更多开发者职位上
有什么技术问题吗?
半点竹节的其它问题
类似的话题

我要回帖

更多关于 new开辟空间 的文章

 

随机推荐