Java中包装器的概念

时间:2014-03-09 14:06:19

标签: java oop

在阅读Hadoop材料时,总是会遇到一些我不太熟悉的Java概念。关于以下内容,“包装器”的概念在这里意味着什么?我们何时需要这种包装器,它在面向对象的语言中扮演的角色是什么?

enter image description here

4 个答案:

答案 0 :(得分:4)

任何时候你需要使用引用类型(即一个对象 - 比如Integer)而不是原始类型(比如int)。

这在泛型中很常用,你需要指定一个类而不是一个原语:

HashMap<String, Integer> foo = new HashMap<String, Integer>();

在这里,您可能会认为:

HashMap<String, int> foo = new HashMap<String, int>();

会起作用,但不会,因为int不是引用类型(类)而是基元。

我们有所有原始类型的包装类:

Integer的{​​p> intByte的{​​{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