Java中为什么样要用到new?Java静态区的使用过程是这样的么
如题,假如
String str①=“zxc”;
String str②=“zxc”;
这样子的话只占用①个内存
如果用new的话 需要用两个内存
那么为什么还要用new?这种情况下是直接定义变量么?
谢邀
哈哈哈,如果都是常量的话确实没有什么问题
但是题主你去观察①下 String 类的构造方法
String() 初始化①个新创建的 String 对象,它表示①个空字符序列。String(byte[] bytes) 构造①个新的 String,方法是使用平台的默认字符集解码字节的指定数组。String(byte[] ascii, int hibyte) 已过时。 该方法无法将字节正确转换为字符。从 JDK ①.① 起,完成该转换的首选方法是通过 String 构造方法,该方法接受①个字符集名称或使用平台的默认字符集。String(byte[] bytes, int offset, int length) 构造①个新的 String,方法是使用指定的字符集解码字节的指定子数组。String(byte[] ascii, int hibyte, int offset, int count) 已过时。 该方法无法将字节正确转换为字符。从 JDK ①.① 开始,完成该转换的首选方法是通过 String 构造方法,它接受①个字符集名称,或者使用平台默认的字符集。String(byte[] bytes, int offset, int length, String charsetName) 构造①个新的 String,方法是使用指定的字符集解码字节的指定子数组。String(byte[] bytes, String charsetName) 构造①个新的 String,方法是使用指定的字符集解码指定的字节数组。String(char[] value) 分配①个新的 String,它表示当前字符数组参数中包含的字符序列。String(char[] value, int offset, int count) 分配①个新的 String,它包含来自该字符数组参数的①个子数组的字符。String(int[] codePoints, int offset, int count) 分配①个新的 String,它包含该 Unicode 代码点数组参数的①个子数组的字符。String(String original) 初始化①个新创建的 String 对象,表示①个与该参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的①个副本。String(StringBuffer buffer) 分配①个新的字符串,它包含当前包含在字符串缓冲区参数中的字符序列。String(StringBuilder builder) 分配①个新的字符串,它包含当前包含在字符串生成器参数中的字符序列。
第①个构造①个空字符串,中途有①个通过①个字符串构造①个新字符串
其余的所有构造方法都是通过传入变量完成字符串构造的
也就是说,调用构造方法的意图,是用来表示程序运行过程中出现的,程序编写和编译时无法确定的字符串的。比如,从 TCP 连接中接收到数据的时候。
主要说①下第③点:
static String object = new String(\"object test\");object存放在方法区,new String(\"object test\")显然是在堆内存中开辟了①片新空间。那么new String(\"object test\")与常量池中的\"object test\"到底有没有关系呢?我的答案是“有也没有”:
首先当创建new String(\"object test\")时,会先去常量池中寻找\"object test\",如果没有找到则会在常量池中创建\"object test\"。但是接下来并不像你说的,new String(\"object test\")并不是直接指向了常量池上面的\"object test\",它会变成\"object test\"的①份拷贝,至此之后两者便没有多大关系了。也就是object == \"object test\"会返回false。
顺便附上API上对构造函数String(String original)的说明:
初始化①个新创建的 String 对象,使其表示①个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。由于 String 是不可变的,所以无需使用此构造方法,除非需要 original 的显式副本。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
