new 运算符
Java 中一般使用 new 来创建对象,它可以动态地为一个对象分配地址,这个内存空间分配在内存的堆区。堆是用来存放由 new 创建的对象和数组,即动态申请的内存都存放在堆区。通用格式如下:
classname obj = new classname();
举例:
public class Test {
public static void main(String[] args) {
String a = "皮卡丘";
String b = new String("皮卡丘");
String c = "皮卡丘";
String d = new String("皮卡丘");
System.out.println(a==b); // == 用来比较两个对象在堆区存放的地址是否相同
System.out.println(a==c);
System.out.println(b==d);
System.out.println(a.equals(b)); //比较使用 new 创建的对象具体的值,需要通过“equal()”方法来实现,这样才是比较引用类型变量具体值的正确方式。
System.out.println(a);
System.out.println(b);
}
}
--------------------
false
true
false
true
皮卡丘
皮卡丘
不同方式定义字符串时堆和栈的变化:
- String a; 只是在栈中创建了一个 String 类的对象引用变量 a
- String a = “皮卡丘”; 在栈中创建一个 String 类的对象引用变量 a ,然后查找栈中有没有存放 ”皮卡丘“ ,如果有则直接指向”皮卡丘“,如果没有,则将”皮卡丘”存放进栈,再指向
- String a = new String(“皮卡丘”); 不仅在栈中创建一个 String 类的对象引用变量 a,同时也在堆中开辟一块空间存放新建的 String 对象“皮卡丘”,变量 a 指向堆中的新建的 String 对象”皮卡丘“
new 运算符是在运行期间为对象分配内存的,这使得内存的分配更加灵活和高效,程序在运行期间可以根据实际情况来合理地分配内存。但是,内存是有限的,因此 new 有可能由于内存不足而无法给一个对象分配内存。如果出现这种情况,就会发生运行时异常。