我有以下简单的测试用例
@Test
public void testArraysAsList() {
Character[] chars1 = new Character[]{'a', 'b'};
System.out.println(Arrays.asList(chars1).size());
char[] chars2 = new char[]{'a', 'b'};
System.out.println(Arrays.asList(chars2).size());
}
结果是: 2 1
我不明白Arrays.asList(chars2)
,为什么Arrays.asList(char[])
使一个大小的列表,元素是char[]。
这是因为List只接受对象,不接受原语。所以当你传递一个对象数组时,它会获取这些对象并创建一个列表。但是当你传递一个原语数组时,它会获取数组本身(也就是一个对象)并创建列表。在第一种情况下,有两个对象,所以列表的长度是2。而在第二种情况下,只有一个对象(也就是数组本身),所以现在长度是1。
下面的代码将说明这一点
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.testArraysAsList();
}
public void testArraysAsList() {
Character[] chars1 = new Character[]{'a', 'b'};
System.out.println(Arrays.asList(chars1).size());
char[] chars2 = new char[]{'a', 'b'};
System.out.println(Arrays.asList(chars2).size());
Integer[] int1 = new Integer[]{1, 2};
System.out.println(Arrays.asList(int1));
int[][] int2 = new int[][]{{1,2},{1,2} };
System.out.println(Arrays.asList(int2));
}
}
现在看看在我的机器上运行上述代码所获得的输出。
2
1
[1, 2]
[[I@1540e19d, [I@677327b6]
因为int2
数组是二维数组,所以它有两个数组。所以它有两个物体。在这种情况下,长度是2。您可以在输出中看到它,[[I@1540e19d
和[I@677327b6]
是这次的两个数组对象。
希望这能说明问题。
集合只能包含对象,不能包含基元类型。
java.util.Arrays.asList(T... a)这里T可以是一个非基元的对象。
在数组的情况下。作为列表(char[]),它将把char[]视为一个对象(T)。因此,您将在下面的打印中看到意外字符:
系统出来println(Arrays.asList(chars2));
输出:
[C@15db9742]
对于基元类型数组,大小将始终为1。
正如@Andy解释的那样,泛型只适用于引用类型
Character[] chars1 = new Character[]{'a', 'b'};
List<Character> list1 = Arrays.asList(chars1);
char[] chars2 = new char[]{'a', 'b'};
List<char[]> list2 = Arrays.asList(chars2);
比较数组。asList(chars2)
与此字符串
示例(其中输入也是单个元素):
String test = "test";
List<String> asList = Arrays.asList(test);
返回一个大小为1的列表
我目前正在读一本名为Java的完整参考的书。第18章介绍了基元类型包装器。 正如本书第一部分所提到的,出于性能原因,Java使用基本类型,如int和char。这些数据类型不是对象层次结构的一部分。它们通过值传递给方法,不能直接通过引用传递。另外,有时两个方法无法引用同一个int实例,您需要为这些基元类型之一创建对象表示。例如,第19章讨论的集合类只处理对象;若要在这些类中的一个中存储基元类型,需要
为了便于操作基本类型值,JavaScript 还提供了3个特殊的引用类型:Boolean、Number 和 String。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。来看下面的例子。 var s1 = "some text"; var s2 = s1.substring(2); 这个例子中的变量 s1 包含一个字符串,
为了便于操作基本类型值,ECMAScript 还提供了3 个特殊的引用类型:Boolean、Number 和String。这些类型与本章介绍的其他引用类型相似,但同时也具有与各自的基本类型相应的特殊行为。实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。来看下面的例子。 var s1 = "some text"; var s2
基本包装类型 基本包装类型包括:Number、Boolean、String。 每当 读取(访问)基本类型值时,后台就会创建一个 对应的基本包装类型的对象。从而让我们能调用一些方法来操作这个数据。 注:后台自动创建的基本包装类型的生命周期只存在于 执行 这行代码 的瞬间。 var s1 = "hellow javaScript"; var s2 = s1.substring(2); 这个例子中,
在下面的代码中,行显示为false。但是当我们再次比较另一个整数包装类时,它返回true。为什么包装器类的比较在第一种情况下是false,而在第二种情况下是true?
问题内容: 这是我的问题和我的项目结构 我有一个要使用的类型 但是,当我尝试将其添加到导入中时,这些问题会出现: 虽然我在函数声明中使用了它 这是什么问题? 我试图用导入 问题答案: 您不能“ 从 包中导入”。您所能做的就是“导入 整个 程序包”。这意味着,如果您和该程序包在开始时就声明自己被称为foo ,则该程序包中的所有内容都必须由以下字符限定: 如果调用了包,则声明变量将使整个包变色:因此,