代码区(codesegment):程序开始执行时把代码加载到codesegment区,找到main方法执行。
栈(stacksegment):1、存放基本数据类型变量和数据;int i = 1;2、对象的引用,但对象的引用不存在栈中,而是存放在堆(new出来的对象)或常量池(字符串常量对象)中。 堆(heapsegment):存放所有new出来的对象。例如:String str = new String("张三"); 静态区(datasegment)常量池:基本数据类型常量、字符串常量。Stringbuffer栈和堆的垃圾回收机制:栈:当在一段代码块中定义一个变量时,java在栈中为这个变量分配内存空间,当块作用域执行完成之后,java就会 自动释放为改变量所分配的空间。堆:当堆里面对象失去引用时,jvm的垃圾回收器,会自动来处理。数据共享:栈和常量池中的数据共享、堆的数据不共享。equals 比对字符串本身,== 比对地址是否相等。图String str = "zhangsan";int i = 0;int[] j = new int[5];案例一:String str1 = "abc";String str2 = new String("abc");System.out.PRintln(str1 == str2);打印:false案例二:String str1 = "abc";String str2 = "abc";System.out.println(str1 == str2);打印:true下面是一个综合的例子:public class Sample_StringEquals { public static void main(String[] args) { String a = "test"; String b = "test"; String c = new String("test"); String d = new String("test"); String e = a; String f = new String(a); String g = a + ""; System.out.println(a == b ? "expression /"a==b/" is true" : "expression /"a==b/" is false"); //true System.out.println(a == c ? "expression /"a==c/" is true" : "expression /"a==c/" is false"); //false System.out.println(c == d ? "expression /"c==d/" is true" : "expression /"c==d/" is false"); //false System.out.println(a == e ? "expression /"a==e/" is true" : "expression /"a==e/" is false"); //true System.out.println(a == f ? "expression /"a==f/" is true" : "expression /"a==f/" is false"); //false System.out.println(a == g ? "expression /"a==g/" is true" : "expression /"a==g/" is false"); //false if (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(e) && e.equals(f) && f.equals(g)) { System.out.println("a equals b equals c equals d equals e equals f equals g"); } } }运行结果已写在打印语句之后。对于引用数据类型来说,"=="永远是在比较等号两边的对象的内存地址,只有当两个引用指向相同的内存地址时,结果为true。值得一提的是:1)对于String a = "test"; 以及String b = "test"; 并没有new出对象,而是先在数据段(datasegment)中找有没有"test"字段,没有找到,就开辟一块空间用于存放"test",并且让a指向这个地址,在定义b的时候,先检查数据段(datasegment)中有没有"test",结果找到了,就同样让b也指向这个地址。因此a==b的结果是true。2)new出来的对象永远都是放在堆中,new出的对象的地址不可能相同,所以比较两个先后new出来的String类型变量,结果都是false。3)String类重写了equals方法,只要两个变量的字符序列一致就返回true,而不进行地址的判断。
新闻热点
疑难解答