Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java文字数组声明和with new方法之间的差异_Java_Arrays - Fatal编程技术网

java文字数组声明和with new方法之间的差异

java文字数组声明和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("

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("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));// 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));// 对于声明数组,这两种方法都是可行的

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};内部没有区别,对吗?(与字符串相反)@jwkoo
newstring(string)
是一个无意义的复制构造函数。你的两个
int[]
示例是相同的(第一个是语法糖,第二个是语法糖)。对不起,“无意义”是什么意思?由于字符串测试的情况=新字符串(“o”);,该测试字符串变量指向字符串“o”@jwkoo
String test=“o”-我们为什么要复制
字符串
文字?使用更多内存来复制不可变对象有什么意义?我不理解“复制”的含义,它说文字创建的字符串对象进入堆常量池,而非文字字符串对象进入堆。完全不同。我认为这不仅仅是复制,而是创建新对象;和int[]arr=新的int[]{1,2,3};内部没有区别,对吗?(与字符串相反)@jwkoo
newstring(string)
是一个无意义的复制构造函数。你的两个
int[]
示例是相同的(第一个是语法糖,第二个是语法糖)。对不起,“无意义”是什么意思?由于字符串测试的情况=新字符串(“o”);,该测试字符串变量指向字符串“o”@jwkoo
String test=“o”-我们为什么要复制
字符串
文字?使用更多内存来复制不可变对象有什么意义?我不理解“复制”的含义,它说文字创建的字符串对象进入堆常量池,而非文字字符串对象进入堆。完全不同。我认为不仅仅是复制,而是创建新对象。
a = new int[] {1,1,1,1};  // ok
b = {2,2,2,2,2};          // error: illegal start of expression