java文字数组声明和with new方法之间的差异
test1和test2指向同一个对象,因此结果为truejava文字数组声明和with new方法之间的差异,java,arrays,Java,Arrays,test1和test2指向同一个对象,因此结果为true String test1 = "test"; String test2 = "test"; System.out.println(test1 == test2); // true test1和test2指向不同的对象,因此结果为false 所以问题是,两者之间的区别是什么 String test1 = new String("test"); String test2 = new String("
String test1 = "test";
String test2 = "test";
System.out.println(test1 == test2); // true
test1和test2指向不同的对象,因此结果为false
所以问题是,两者之间的区别是什么
String test1 = new String("test");
String test2 = new String("test");
System.out.println(test1 == test2); // false
我对此感到困惑,因为
int[] test = {1,2,3}; // literal
int[] test = new int[] {1,2,3}; // non-literal
及
我希望后一种情况的结果是正确的,这与上面的字符串示例的原因相同
test1和test2是否指向不同的数组对象?Java
int[]
永远都不是。仅字符串
(包装器类型用于有限的值)tl;dr不要将对象相等性与=
进行比较。它仅将引用与实例类型进行比较。这里,可以使用和String
以及String.equals来确定数组相等性。数组不重写Object#equals(Object)
int[]test1={1,2,3};
int[]test2={1,2,3};
System.out.println(Arrays.equals(test1,test2));// Javaint[]
是永远不会的。仅字符串
(包装器类型用于有限的值)tl;dr不要将对象相等性与=
进行比较。它仅将引用与实例类型进行比较。这里,可以使用和String
以及String.equals来确定数组相等性。数组不重写Object#equals(Object)
int[]test1={1,2,3};
int[]test2={1,2,3};
System.out.println(Arrays.equals(test1,test2));// 对于声明数组,这两种方法都是可行的
int[] test1 = { 1, 2, 3 };
int[] test2 = { 1, 2, 3 };
System.out.println(Arrays.equals(test1, test2)); // <-- true
System.out.println(test1.equals(test2)); // <-- false
但是在声明之后,使用第一种方法,您可以将新数组分配给相同类型的现有变量,第二种方法是no
int[] a = new int[] {1,2,3,4,5};
int[] b = {7,8,9,10};
对于声明数组,这两种方法都是可行的
int[] test1 = { 1, 2, 3 };
int[] test2 = { 1, 2, 3 };
System.out.println(Arrays.equals(test1, test2)); // <-- true
System.out.println(test1.equals(test2)); // <-- false
但是在声明之后,使用第一种方法,您可以将新数组分配给相同类型的现有变量,第二种方法是no
int[] a = new int[] {1,2,3,4,5};
int[] b = {7,8,9,10};
String和int不一样int[]test1={1,2,3}代码>每次都创建一个新数组。@Murat K。我已经读过那篇文章了。我知道String和int不一样。但是它的int数组。所以test1指向堆区域中的数组。我错了吗?@assylias用string类以literal方式创建string对象会覆盖上一个对象,但不会覆盖用literal方式创建的数组对象?for循环是否会混淆读者?JVM可能会意识到,如果将同一个问题重复三次,结果会随着时间的推移而改变吗?String和int不一样int[]test1={1,2,3}代码>每次都创建一个新数组。@Murat K。我已经读过那篇文章了。我知道String和int不一样。但是它的int数组。所以test1指向堆区域中的数组。我错了吗?@assylias用string类以literal方式创建string对象会覆盖上一个对象,但不会覆盖用literal方式创建的数组对象?for循环是否会混淆读者?JVM可能会意识到,如果您将同一个问题重复三次,您是否相信结果会随着时间的推移而改变,您对结果持怀疑态度?谢谢,所以int[]arr={1,2,3};和int[]arr=新的int[]{1,2,3};内部没有区别,对吗?(与字符串相反)@jwkoonewstring(string)
是一个无意义的复制构造函数。你的两个int[]
示例是相同的(第一个是语法糖,第二个是语法糖)。对不起,“无意义”是什么意思?由于字符串测试的情况=新字符串(“o”);,该测试字符串变量指向字符串“o”@jwkooString test=“o”代码>-我们为什么要复制字符串
文字?使用更多内存来复制不可变对象有什么意义?我不理解“复制”的含义,它说文字创建的字符串对象进入堆常量池,而非文字字符串对象进入堆。完全不同。我认为这不仅仅是复制,而是创建新对象;和int[]arr=新的int[]{1,2,3};内部没有区别,对吗?(与字符串相反)@jwkoonewstring(string)
是一个无意义的复制构造函数。你的两个int[]
示例是相同的(第一个是语法糖,第二个是语法糖)。对不起,“无意义”是什么意思?由于字符串测试的情况=新字符串(“o”);,该测试字符串变量指向字符串“o”@jwkooString test=“o”代码>-我们为什么要复制字符串
文字?使用更多内存来复制不可变对象有什么意义?我不理解“复制”的含义,它说文字创建的字符串对象进入堆常量池,而非文字字符串对象进入堆。完全不同。我认为不仅仅是复制,而是创建新对象。
a = new int[] {1,1,1,1}; // ok
b = {2,2,2,2,2}; // error: illegal start of expression