在这篇文章中,我们将讨论 Integer 类。让我们考虑这些问题:
从实际意义上讲,原语及其包装类有很多共同点。大多数操作的执行方式相同。然而,包装类具有许多基元所没有的特征。首先,有类:当使用包装类时,我们使用对象。其次(接下来的一切都从第一点开始),这些对象可以为空。第三,包装类提供了许多常量和方法,使使用特定数据类型变得更加容易。在本文中,我们将仔细研究 Integer 类的使用。
Integer类是基本类型int的包装类。该类包含一个 int 类型的字段。作为一个包装类,Integer 提供了各种处理 int 的方法,以及许多将 int 转换为 String 以及将 String 转换为 int 的方法。下面我们将看看与班级合作的各种示例。让我们从创作开始吧。最常用(也是最容易使用)的是以下创建选项:
然而,尽管如此,您需要小心并记住 Integer 是一种引用数据类型,并且这种类型的变量可以为 null。在这种情况下(如果变量为 null),最好避免算术运算(以及 null 不是什么好兆头的任何其他运算)。这是一个例子:
让我们通过运行以下代码来查看所有这些常量的值:
- 什么是包装类;
- 原语的自动打包/解包;
- Integer 类及其方法和常量的操作。
原始类型的包装类
大家知道,Java有多种数据类型,可以分为两大块:- 原始;
- 参考。
- 整数 - byte、short、int、long;
- 浮点数(实数)- float、double;
- 逻辑数据类型 - 布尔值;
- 字符数据类型 - char。
原始型 | 类包装器 |
---|---|
字节 | 字节 |
短的 | 短的 |
整数 | 整数 |
长的 | 长的 |
漂浮 | 漂浮 |
双倍的 | 双倍的 |
布尔值 | 布尔值 |
字符 | 特点 |
整数_
Integer类是基本类型int的包装类。该类包含一个 int 类型的字段。作为一个包装类,Integer 提供了各种处理 int 的方法,以及许多将 int 转换为 String 以及将 String 转换为 int 的方法。下面我们将看看与班级合作的各种示例。让我们从创作开始吧。最常用(也是最容易使用)的是以下创建选项:
Integer a = 3;
也就是说,这种情况下 Integer 变量的初始化与 int 变量的初始化类似。此外,可以使用 int 变量的值来初始化 Integer 变量:
int i = 5;
Integer x = i;
System.out.println(x); // 5
在上述情况下,自动打包是隐式发生的。我们将在下面详细讨论它。除了上面列出的初始化选项之外,还可以像其他对象一样使用构造函数和 new 关键字创建 Integer 变量:
Integer x = new Integer(25);
System.out.println(x);
然而,写入需要更长的时间,读取也需要更长的时间,因此该选项是最不常见的。您可以使用 Integer 变量执行所有可以使用 int 变量执行的操作。他们可以:
折叠 |
|
减去 |
|
乘 |
|
划分 |
|
增量 |
|
递减 |
|
Integer a = null;
Integer b = a + 1; // Здесь мы упадем с "Exception in thread "main" java.lang.NullPointerException"
System.out.println(b);
大多数比较操作的执行方式与基本类型 int 相同:
Integer a = 1;
Integer b = 2;
System.out.println(a > b);
System.out.println(a >= b);
System.out.println(a < b);
System.out.println(a <= b);
输出:
false
false
true
true
比较两个整数变量的操作很突出。这里的重点是Integer是一种引用数据类型,它的变量存储的是对值的引用,而不是值本身(对象)。执行以下代码片段时可以观察到这一事实的表现:
Integer a = 1;
Integer b = 1;
Integer c = new Integer(1);
System.out.println(a == b); // true
System.out.println(a == c); // false
第一个相等的结果将为 true,第二个相等的结果将为 false。发生这种情况是因为在第一种情况下,我们比较存储对同一对象的引用的两个变量(“a”和“b”)。在第二种情况下,我们比较引用两个不同对象的两个变量(在创建变量“c”时,我们创建了一个新对象)。我们再举一个有趣的例子:
Integer a = 1;
Integer b = 1;
Integer x = 2020;
Integer y = 2020;
System.out.println(a == b); // true
System.out.println(x == y); // false
可以看到,第一次比较的结果为 true,第二次比较的结果为 false。这都是关于缓存的。所有在 -128 到 127 范围内的整数(这些值可以自定义)都会被缓存。因此,当我们创建一个新变量并为其分配 -128 到 127 之间的整数值时,我们并不是在创建一个新对象,而是为该变量分配对缓存中已创建对象的引用。现在,知道了这个事实,上面的例子就显得不再那么神秘了。变量 a 和 b 引用同一个对象 - 来自缓存的对象。并且在变量x和y的初始化过程中,我们每次都创建了一个新对象,并且这些变量存储了对不同对象的引用。而且如你所知,==运算符比较的是变量的值,而引用变量的值就是引用。要准确检查两个 Integer 变量之间的相等性,必须使用 equals 方法(无论听起来多么微不足道)。让我们重写一下上面的例子:
Integer a = 1;
Integer b = 1;
Integer x = 2020;
Integer y = 2020;
System.out.println(a.equals(b)); // true
System.out.println(x.equals(y)); // true
自动打包和解包整数
什么是自动装箱和拆箱?创建新的整数变量时,我们使用以下结构:Integer a = 2020;
这样我们就创建了一个新对象,而无需使用 new 键运算符。这要归功于原始类型 int 的自动打包机制。将原始 int 变量分配给 Integer 引用变量的值时,会发生相反的过程:
Integer a = 2020;
int x = a;
在这种情况下,我们似乎给一个原始变量分配了一个引用(即对对象的引用是变量“a”的值)。但事实上,由于自动拆包机制,值 2020 被写入到“x”变量中。自动打包/拆包是 Java 中非常常见的现象。通常它会自行发生,有时甚至在程序员不知情的情况下发生。但你仍然需要了解这个现象。我们在 Javarush 上有一篇关于这个主题的有趣文章。
整数类常量
Integer 类提供了用于处理整数的各种常量和方法。在本节中,我们将在实践中仔细研究其中的一些。让我们从常量开始。下表显示了所有类常量:科斯坦塔 | 描述 |
---|---|
尺寸 | int类型在两位数制中所占的位数 |
字节数 | int类型占用的两位数系统中的字节数 |
MAX_VALUE | int类型可以容纳的最大值 |
MIN_VALUE | int类型可以容纳的最小值 |
类型 | 从 int 类型返回 Class 类型的对象 |
public static void main(String[] args) {
System.out.println(Integer.SIZE);
System.out.println(Integer.BYTES);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.TYPE);
}
结果,我们得到以下输出:
32
4
2147483647
-2147483648
int
Integer 类的方法
现在让我们快速浏览一下 Integer 类最常用的方法。因此,“顶级”方法以从字符串转换数字或从数字转换字符串的方法为首。让我们从将字符串转换为数字开始。parseInt方法用于这些目的,其签名如下:-
static int parseInt(String s)
int i = Integer.parseInt("10");
System.out.println(i); // 10
如果无法进行转换(例如,我们将一个单词传递给 parseInt 方法),则会抛出 NumberFormatException。parseInt(String s) 方法有一个重载的同级方法:
-
static int parseInt(String s, int radix)
System.out.println(Integer.parseInt("0011", 2)); // 3
System.out.println(Integer.parseInt("10", 8)); // 8
System.out.println(Integer.parseInt("F", 16)); // 15
parseInt 方法返回原始数据类型 int。这些方法有一个类似的方法 - valueOf方法。此方法的一些变体只是在内部调用 parseInt。与 parseInt 的区别在于 valueOf 的结果将是 Integer,而不是 int。下面让我们考虑一下此方法的所有选项以及其工作原理的示例:
- static Integer valueOf(int i) - 返回值为 i 的 Integer;
- static Integer valueOf(String s) - 与 parseInt(String s) 类似,但结果将为 Integer;
- static Integer valueOf(String s, int radix) - 与 parseInt(String s, int radix) 类似,但结果将是 Integer。
int a = 5;
Integer x = Integer.valueOf(a);
Integer y = Integer.valueOf("20");
Integer z = Integer.valueOf("20", 8);
System.out.println(x); // 5
System.out.println(y); // 20
System.out.println(z); // 16
我们研究了允许将 String 转换为 int/Integer 的方法。相反的过程是使用toString方法实现的。您可以在任何 Integer 对象上调用 toString 方法并获取其字符串表示形式:
Integer x = 5;
System.out.println(x.toString()); // 5
然而,由于 toString 方法经常在对象上隐式调用(例如,将对象发送到控制台进行打印时),因此开发人员很少显式使用该方法。还有一个静态方法 toString,它接受一个 int 参数并将其转换为字符串表示形式。例如:
System.out.println(Integer.toString(5)); // 5
但是,与非静态 toString 方法一样,显式使用静态方法的情况很少见。更有趣的是静态方法 toString,它带有 2 个整数参数:
- static String toString(int i, int radix) - 将 i 转换为基数系统中的字符串表示形式。
System.out.println(Integer.toString(5, 2)); // 101
Integer 类有几种方法用于查找两个数字的最大值/最小值:
- static int max(int a, int b) 将返回传递的变量中的最大值;
- static int min(int a, int b) 将返回传递的变量中的最小值。
int x = 4;
int y = 40;
System.out.println(Integer.max(x,y)); // 40
System.out.println(Integer.min(x,y)); // 4
结论
在本文中,我们研究了 Integer 类。我们讨论了这是一个什么样的类以及什么是包装类。我们从实践的角度来看待这门课。我们研究了算术运算的示例,包括比较运算。我们研究了比较两个整数变量的复杂性,并研究了缓存对象的概念。我们还提到了原始数据类型的自动打包/解包现象。此外,我们还设法查看了 Integer 类的一些方法以及一些常量。他们给出了将数字从一种数字系统转换为另一种数字系统的示例。家庭作业
-
研究一下 Integer 类还有哪些其他方法(您可以在官方文档的网站上研究它们),在评论中写下您认为您研究过的哪种方法(不包括文章中给出的方法)最有用(将是您最常使用的)。并提供你的观点的理由。
PS 这里没有正确答案,但是这个活动可以让你更好地学习课程。
-
解决一个简单的小问题来巩固材料。
我们有两个数字:
1100001001 - 二进制数系统
33332 - 五进制数系统有必要仅使用 Integer 类的方法来确定两个给定数字之间的最大值,然后显示三进制数字系统中最大值和最小值之间的差异。
-
将最大可能的整数值转换为八进制数字系统并显示结果数字中的位数(以编程方式计算数字)。
GO TO FULL VERSION