1. java代码,创建字符串对象,内存中保存的是什么
抄的
Java stores strings as UTF-16 internally.
"default encoding" isn't quite right. Java stores strings as UTF-16 internally, but the encoding used externally, the "system default encoding", varies from platform to platform, and can even be altered by things like environment variables on some platforms.
2. java中的,创建对象时, new是在内存的堆(heap)上为对象开辟空间, aPerson存在于内存的栈(stack)中。
栈是存放函数调用过程中的临时变量的! 堆是程序运行过程中动态申请的内存的存放处的!比如new的对象就在堆上
在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。
堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在
数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因。
按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的.
静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.
栈式存储分配也可称为动态存储分配,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配。
从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的,栈主要是用来执行程序的.
3. java中关于创建对象这个机制在内存变化的问题
打个比方:
日本鬼子找八路军要地下党名单(虽然藏着个名单满世界跑是个蠢事,电视剧情就这样)。
日本鬼子最起码先要确定他是八路,再确定他叫什么名字,最后才好下手
共产党 张三 =new 共产党();
张三是共产党,未必属于他们定义共产党的这个圈,他们所找的共产党是活动在周边藏有人员名单的一种特殊的属性。
前面的Dog dog;只是说明他是Dog类型而已;后面new Dog(),是给他示例,new关键词是给他这个类,把他套进这个圈子,这个圈子内早定好了属性,这些属性叫成员变量也好、叫属性也好,都是程序开发环境或者用户自定义特有的属性。示例化过后就可以调用他的成员变量了。
dog.成员(变量); //执行操作
如果不示例化,那就不能广泛使用,dog如果没在过程用有过定义,就再也没有成员了。
这就好比你 自称是某个变量,在编译环境里是不承认的,实例化一下,给他个公证
4. java 中new一个对象占多少内存
Object
o=new
Object():
在java中空对象占八个字节,对象的引用占四个字节。所以上面那条语句所占的空间是4byte+8byte=12byte.java中的内存是以8的倍数来分配的,所以分配的内存是16byte.
举个例子:
Class
O{
int
i;
byte
j;
String
s;
}
其所占内存的大小是空对象(8)+int(4)+byte(1)+String引用(4)=17byte,因要是8的整数倍,所以其占大小为24byte.
当然,如果类里有其他对象的话,也要把其他对象的空间算进去。
其实这个在javaeye的电子期刊上有。
5. java的方法中new的对象存储在内存中那个区域
这个对象存在堆中,还是栈中?
答:堆,new一个对象,一定是在堆中
方法内部new出来的对象,在哪里存着?
答:堆,new出来对象的实例变量都存在堆上面。
栈,这个东西,需要理解为:线程运行时,才会创建,执行完,就没了。
Person p = new Person();
上面这段代码,在执行时,p压入栈,通过局部变量表,找到对应的【实例数据】,执行完毕后释放。
6. java中使用类创建对象后,该对象的方法在堆内存中是怎样存储的
方法不存在在堆内存中,是放在代码区,只有在调用的时候,才会构建该方法的运行时环境,包括参数,局部变量等,当然,这些也都是在栈内存中的。对内存只存放被new出来的东西。
你可以读读编译原理相关的书,这种问题就清楚了。
7. java创建对象底层原理是什么,java中的对象到底在内存中是什么,别说什么类的具体实例化
对象是类的实例,同一个类的不同实例当然拥有相同的机器指令(相同的方法行为),不同的实例拥有不同的属性内存,相同的指令操作不同的内存得到各自的结果。
举个例子:
我们描述一个类:水果,它有两个属性,名称和数量,一个方法设置数量(setNum)。
现在,我们实例两个水果,一个苹果和一个西瓜(假如初始是一个),此时得为苹果和西瓜各自准备一个不同的存放空间(不能重叠了是吧,这就是为不同对象分配不同的堆内存),然后我们为两个对象都执行设置数量方法(都是setNum,同一个行为),假如苹果改为2,西瓜
改为5,此时两个不同对象执行了同一个方法得到个各自的结果。
下面补充一些官方描述:
java创建类时,也即是你所说的原类,其实只是对那个类的对象的外观与行为的描述(此时并未开辟堆内存,当然static例外)。只有当使用new创建那个类的对象时才会分配数据存储空间,其方法才供外界调用。
java为指定类创建对象,其实就是为类的描述创建属性值存储空间并初始化,并在堆栈中创建其指针,如果有方法局部变量,方法也会有自己的临时堆栈。
一个对象是一个堆栈地址所指向的一组堆内存,然后对象的行为则是java语言编译后的机器指令代码,指令执行操纵内存的数据。
如果有更合理的理解,或者认为我的理解有不对的地方欢迎指正,学习就是不断接近真相。
8. 在java中生成对象分配的内存几种详细解释
堆内存和栈内存,一个类,创建实例后,成员变量和方法声明被分配到堆内存,方法体分配到栈内存。明白这个就能很好的解释多态、继承、覆盖方面的问题了。
9. Java创建一个空的ConcurrentHashMap对象占多大内存空间
1、
ConcurrentHashMap不指定大小默认是16;
10. JAVA基础问题求解【创建对象的具体过程在内存中是怎么进行的】
这个问题我回答你。
学过汇编语言的人都知道。
一个应用程序一般分为3个部分。
1.数据段
2.栈段
3.代码段
有关上面的具体含义,解释起来用的文字较多。你可以网络搜多一下。
或看看8086汇编
有关下面这个问题:
(1)
Stringa=newString("abcdef");
与
(2)
Stringa="abcdef";
他们是不一样的。
(2)是在编译器决定的,(1)是在运行期间决定的。
(2)中的abcdef存放在“栈”中。
而(1)中new出来的String存放在“堆”中
“栈”的大小是编译器确定下来的。(存取速相对"堆"较快)
而“堆”是动态创建的(Java中通过new创建的对象都是放在堆中的)
注意:我这里说的是创建出来的对象,而非存放对象引用的变量
(例如Stringa;)
SomeClassa=newSomeClass();
a=newSomeClass();
newSomeClass();
这3个的区别和联系。
区别就是在内存中创建了3个对象。
不同的就是,这3个对象有的存在引用关系(例如:a=newSomeClass();)
有则则没有(newSomeClass();)
没有存在引用关系的对象,将会在内存负载过大的时候,自动由Java的内存回收机制。将此块内存释放。
从汇编角度来讲:
什么是类呢?什么是对象?
看似一个很书面的问题。
其实不然!
我们可以把“类”看做一个飞机的设计图纸
而把对象是为按照这个图纸设计出来的一个实实在在看得见摸得着的“飞机”
对于这个例子:
SomeClassa=newSomeClass();
SomeClassb=newSomeClass();
他们有不同之处,也有相同之处。
从底层来讲。相同之处,是指他们用的都是同一块”代码段“
不同之处在于“数据”有所不同。
可能听起来有些不好理解。
其实你知道理解我最上面所讲的内容就足够了。
想学习更深入的内容,等以后有时间学习学习80x86汇编。
看看《深入Java虚拟机》等相关书籍
我写的字有些多了。。。我也该看看新闻去了。。。再见哦~~