String类型的对象是不可变的,比方说String aa="11"; 想要修改aa的值,用“+”连接一个新的,比方说+2,其实并没有修改aa的值,而是在内存空间中新建了一个对象,对象的内容是“112”
String s1=new String ("aa");
String s2=new String ("aa");
两者的内存地址是不同的,不管字符串池中有没有aa的字符串常量,都会重新分配一个新的内存空间。
int类型的比较,比方说==,int a=11;int b=11;a==b 结果为true
对于基本数据类型(byte,short,char,int,float,double,long,boolean)来说,他们是作为常量在方法区中的常量池里面以HashSet策略存储起来的,对于这样的字符串 "123" 也是相同的道理,在常量池中,一个常量只会对应一个地址,因此不管是再多的 123,"123" 这样的数据都只会存储一个地址,所以所有他们的引用都是指向的同一块地址,因此基本数据类型和String常量是可以直接通过==来直接比较的。
另外,对于基本数据的包装类型(Byte, Short, Character,Integer,Float, Double,Long, Boolean)除了Float和Double之外,其他的六种都是实现了常量池的,因此对于这些数据类型而言,一般我们也可以直接通过==来判断是否相等
————————————————
传基本类型变量和引用类型变量作为形参的时候,要注意,只是值的传递,相当于值的copy,基本类型copy一份传给形参,等方法结束后,复制的形参出栈,值还是原来的。引用类型传递的是地址的值,等方法结束后,栈中对象的属性值已经变了。 注意区分两者。
jvm主要分为栈、堆、方法区、寄存器区、本地方法区。
栈内存主要存放一些基本类型的局部变量
堆内存存放一些引用类型的数据,像对象这些
方法区存放静态变量、常量和类的一些信息(比如说类的属性和方法)
---------------------------------------
部分转载别人,已经注明出处