在阅读Hadoop材料时,总是会遇到一些我不太熟悉的Java概念。关于以下内容,“包装器”的概念在这里意味着什么?我们何时需要这种包装器,它在面向对象的语言中扮演的角色是什么?
答案 0 :(得分:4)
任何时候你需要使用引用类型(即一个对象 - 比如Integer
)而不是原始类型(比如int
)。
这在泛型中很常用,你需要指定一个类而不是一个原语:
HashMap<String, Integer> foo = new HashMap<String, Integer>();
在这里,您可能会认为:
HashMap<String, int> foo = new HashMap<String, int>();
会起作用,但不会,因为int
不是引用类型(类)而是基元。
我们有所有原始类型的包装类:
Integer
的{p> int
,Byte
的{{1}},byte
的{{1}},Double
的{{1}}等等。
答案 1 :(得分:1)
包装类提供了一种使用基本类型作为对象的方法,比如int,我们将Integer作为包装类
Main use of Wrappers is with generics
like you can have an ArrayList<Integer>, but not an ArrayList<int> same with Other Collections etc. To get type safety we use generics and generics need objects not primitives.
我要添加的另一件事是,当您需要适合面向对象世界的类型时,可以使用包装器。
答案 2 :(得分:1)
到目前为止,答案仅通过参考类型提及原始类型的表示。
但是在Hadoop(或其他上下文)的上下文中存在这些可写包装器的主要理由之一尚未被提及:
你可以写出来!
也就是说,它们允许某种“通过引用传递”,这在Java中通常是不可能的。想象一下,你有一个像
这样的方法public void computeSomething(int resultA, int resultB)
{
resultA = 123;
resultB = 234;
}
// Used as
int a = 0;
int b = 0;
computeSomething(a, b);
System.out.println(a); // Prints 0
System.out.println(b); // Prints 0
显然,修改方法中的参数对外界没有影响。与此相反,您可以使用可写包装器来实现所需的效果:
public void computeSomething(IntWritable resultA, IntWritable resultB)
{
resultA.set(123);
resultB.set(234);
}
// Used as
IntWritable a = new IntWritable(0);
IntWritable b = new IntWritable(0);
computeSomething(a, b);
System.out.println(a); // Prints 123
System.out.println(b); // Prints 234
答案 3 :(得分:0)
包装类是包含另一个类或基本类型的类。包装器类是专门制作的,因此它为包装的基本类型类提供了附加功能。包装类的一个示例是java.lang.[Integer/Character/Float/etc]
,它可以与泛型一起使用,与基本类型不同。
作为另一个例子,假设我想为String添加其他功能。字符串是最终的,所以我无法扩展它。但是,我可以创建一个包装类:
class StringWrapper
{
public String str;
public StringWrapper(String str)
{
this.str = str;
}
public void reverse()
{
char[] temp = new char[str.length()];
for(int i = 0; i < str.length(); i++)
{
temp[str.length() - i] = str.charAt(i);
}
str = new String(temp);
}
}
我可以说:
StringWrapper strW = new StringWrapper("abc");
strW.reverse();
System.out.println(strW.str);
哪个输出:
CBA