原语和包装器数据类型的使用有什么不同以及包装器数据类型的需求是什么?

时间:2017-04-05 09:07:40

标签: java wrapper primitive

我在网上搜索了所有内容,但所有答案都只是差异所在。我知道不同之处,但我不明白他们的应用程序的差异。

例如,假设我们必须使用两个浮点值,如果我们使用double,我们可以使用a==b轻松比较,而如果我们使用Double,则必须使用a.equals(b)

3 个答案:

答案 0 :(得分:6)

您可以在blog

上找到它

<强> 1。第一

Double是引用类型,因此您可以将其用作模板参数

例如:

public class Tmp<T> {
    public Tmp() {
    }
}

如果你想创建一个类似的那个。

然后你必须传递引用类型,同时创建in的对象。 例如

new Tmp<Integer>()

如果您创建对象,则会出现错误:

new Tmp<int>()

<强> 2。第二

只有因为Wrapper类才可以进行通用数据类型编程。

例如,bellow方法接受任何类型的数字(Byte, Integer, Double, Short, Float, Long, BigDecimal, BigInteger, AtomicInteger, AtomicLong)并返回Integer个数字。

public Integer add(Number a, Number b){
    return a.intValue() + b.intValue();
}

第3。第三

早期版本的Java不支持AutoBoxing和AutoUnboxing。 因此,如果您使用该版本的Java,那么您可以轻松区分这两者。

例如,如果您使用Java 1.4或更早版本,则:

Integer a = 1; // Auto Boxing(Not Works)
Integer a2 = new Integer(2); // Boxing (It Works)

<强> 4。第四

两者的存储也不同原始类型存储在Stack中,而引用类型存储在Heap

<强> 5。第五

您可以使用该类的功能,例如将字符串解析为Integer,Double等,并使用相同的同意。

以下是Integer class

的功能和同意

enter image description here

<强> 6。第六

您可以使用Integer

序列化int

<强> 7。第七

您可以将Integer作为RMI方法传递,但int

无法实现相同的效果

注意:Integerint都可以成为RMI参数中另一个对象的一部分,实际上它们在Integer类中存储了int中的值。

<强> 8。第八

int的变量是可变的(final int不是这种情况),而Integer是不可变的。当我们更改值时,它将创建新对象。

答案 1 :(得分:3)

幕后还有更多内容。其中一个原因是如何使用Java开发Collections API ...

考虑到你不能做任何事情:

List<int> myList 
在Java中

。您将需要该

的包装器
List<Integer> myList 

因为集合使用对象而不是基元。

另一方面,包装器是为开发人员提供一组很好的方法/常量的对象,这些方法/常量使得“更快更容易”#34;一些操作如:

int x = 17;

现在,感谢你可以做的包装:

String pars= Integer.toBinaryString(x);
pars= Integer.toHexString(x);
Integer.MAX_VALUE;
Integer.highestOneBit(x);

如果没有这个,你会感到颈部疼痛,因为原始x对你没有多大帮助。

答案 2 :(得分:2)

当你使用Collections 时,你必须使用对象而不是原语。

List<double> list = new ArrayList<double>; // not allowed
List<Double> list = new ArrayList<Double>; // allowed
Map<double, String> map = new HashMap<double, String>(); // not allowed
Map<Double, String> map = new HashMap<Double, String>(); // allowed

或者,如果您希望Double可以为空。例如,对Hibernate的实体和DTO or POJO

有用
private int number; // default: 0
private Integer number; // default: null

Double可让您快速投射

double.intValue();
double.toString();