Java 为什么集合不能直接存储基元类型
原始类型是Java语言中最基本的数据类型。这种类型只有一个目的–包含纯粹的、简单的一类值。由于java是一种静态类型的语言,每个变量和表达式的类型在编译时就已经知道了,因此你不能为这种原始类型定义新的操作。
说明:
Invalid : vector.addElement(3) ;
Valid : vector.addElelment("3") ;
结论:
- Java的原始类型不是被引用的类型。例如,int不是一个Object。
- Java使用引用类型的类型擦除来做泛型。例如,A List<?> 在运行时实际上是一个List
集合是用于存储和操作一组对象的框架。Java集合意味着一个单一的对象单元。由于上述两个声明是真的,通用的Java集合不能直接存储原始类型。
封装类提供了一种将原始数据类型(int, boolean, etc.)作为对象使用的方法,或者说封装类是一个其对象封装或包含原始数据类型的类。它催生了以下两个概念。
- Autoboxing
- Unboxing
原始数据类型 | Wrapper Class |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
自动排版是指将原始类型自动转换为其对应的封装类的对象,这被称为自动排版。例如。
- 将int转换为整数
- 长的转换为长
- 双倍数转换为双倍数,等等。
解箱只是自动装箱的反向过程。将一个封装类的对象自动转换为其相应的原始类型被称为拆箱。例如–将Integer转换为int,Long转换为long,Double转换为double,等等。
说明: Autoboxing
// Importing input output classes
import java.io.*;
class GFG {
// Main driver method
public static void main(String args[])
{
// Custom input
Integer i = new Integer(21);
// Boxing
Integer j = 5;
System.out.println("i=" + i + "\n j=" + j);
}
}
输出:
i=21
j=5
Illustration 2: Unboxing
// Import input output classes
import java.io.*;
// Class
public class GFG {
// MAin driver method
public static void main(String args[])
{
// Custom input
Integer i = new Integer(50);
// Unboxing
int a = i;
// Unboxing
int b = i.intValue();
// Print and display
System.out.println("a=" + a + "\nb=" + b);
}
}
输出:
a=50
b=50
实现: 当使用集合时,java编译器从原始类型创建一个封装对象,并使用泛型将其添加到集合中。
示例 1:
// Java Program to illustrate Collections
// are not directly storing primitives types
// Importing input output classes
import java.io.*;
// Importing all classes from
// java.util package
import java.util.*;
// Class
class GFG {
// Main driver method
public static void main(String[] args)
{
// Creating a list of elements of Integer type.
List<Integer> list = new ArrayList<Integer>();
// Iterating over elements of List object
for (int i = 0; i < 10; i++) {
// Adding the int primitives type values
// If elements are added using add() method
// then compiler automatically treats as
// add(Integer.valueOf(i))
list.add(i);
// This is what compiler does and
// hence the goal achieved.
// Print the primitive values
System.out.println(i);
}
}
}
输出
0
1
2
3
4
5
6
7
8
9
示例 2: 用于存储原始数据类型的集合
// Java Program to illustrate Collections
// are not directly storing primitives types
// Importing Map and HashMap classes
// from java.util package
import java.util.HashMap;
import java.util.Map;
// Class
public class GFG {
// Main driver method
public static void main(String[] args) throws Exception
{
// Creating an object of Map type
Map map = new HashMap();
// Creating int wrapper object
// Custom input
Integer var = new Integer(21);
// Storing int to map
map.put("key", var);
// Getting int value from map
Integer refVar = (Integer)map.get("key");
// Get the integer value from wrapper object
int i = refVar.intValue();
// Display message for successful compilation
System.out.print("Successfully compiled and executed");
}
}
输出:
Successfully compiled and executed