📜  Java内部化-讨论(1)

📅  最后修改于: 2023-12-03 15:02:04.084000             🧑  作者: Mango

Java内部化-讨论

Java内部化指的是将常用的固定不变的对象共享在内存中,避免重复创建相同的对象,节约内存空间和提高程序执行效率。

目录
Java内部化类型

Java中内部化的类型包括:

  • 原始数据类型
  • String类型
  • 包装类型(如:Integer、Boolean等)
原始数据类型的内部化

Java对于原始数据类型的内部化做了优化,例如对于byte、short、int、long等类型,Java会内化-128~127范围的数值。因为这个范围内的数值被反复使用的概率很高,内部化可以避免重复创建对象,提高程序执行效率。

String类型的内部化

对于String类型的内部化,我们可以通过intern()方法实现。对于字符串“hello world”,在程序中多次使用这个字符串时,如果每次都新建一个String对象,就会造成内存的浪费。但是如果使用intern()方法,可以将这个字符串加入常量池中,在需要时可以直接获取。

String str1 = new String("hello world");
String str2 = "hello world";
String str3 = str1.intern();
System.out.println(str1 == str2);  //false
System.out.println(str2 == str3);  //true
常量池

Java程序运行时内存被分为了多个区域,其中包括了常量池。

常量池用来存储编译期生成的字面量和符号引用,在程序运行时,被加载到运行时常量池中,供程序调用。在Java SE 7及以上版本中,常量池已经不再属于永久代,而是属于堆的一部分。

String str1 = "hello world";
String str2 = "hello world";  //这里使用了之前的字符串对象,而非新建一个String对象
System.out.println(str1 == str2);  //true
优点
  • 节约内存空间
  • 提高程序执行效率
注意事项
  • 内部化对象不可改变
  • 对象内部化后尽量不要使用"=="进行判断是否相等,而应该使用equals()方法
  • 对于大量动态变化的字符串或用户输入的字符串,不适合进行内部化