java int >128 ==_为什么 Java Integer 中“128==128”为false,而”100==100“为true?
时间: 2023-10-01 09:06:45 浏览: 70
这是因为 Java 中的 Integer 类型是一个对象,而不是一个基本数据类型。当你使用“==”来比较两个对象时,它会比较它们在内存中的引用地址,而不是它们的值。
对于范围在-128到127之间的整数,Java 中会对它们进行缓存,所以当你使用 Integer.valueOf() 方法来创建 Integer 对象时,如果值在-128到127之间,它会返回一个缓存的对象。因此,当你比较两个范围在-128到127之间的整数时,它们实际上是同一个对象,所以“128==128”返回false。
但是,对于超出此范围的整数,Java不会进行缓存,因此每个整数都会具有不同的引用地址。因此,“100==100”返回true,因为它们都是不同的对象,但它们的值相同。
相关问题
java中 int比较用==还是equals
在Java中,对于基本数据类型`int`,比较通常使用`==`,因为`==`比较的是两个数值是否相等。
而对于对象类型的`Integer`,比较应该使用`equals()`方法,因为`Integer`是一个类,使用`==`比较的是两个对象在内存中的地址是否相同,而不是它们所包含的数值是否相等。
举个例子,如果有如下代码:
```
int a = 5;
int b = 5;
Integer c = new Integer(5);
Integer d = new Integer(5);
```
那么`a==b`的结果是`true`,因为`a`和`b`都是基本数据类型,比较的是它们的数值是否相等。
而`c==d`的结果是`false`,因为`c`和`d`是两个不同的对象,它们在内存中的地址不同。
但是`c.equals(d)`的结果是`true`,因为`equals()`方法比较的是两个`Integer`对象所包含的数值是否相等,而不是它们在内存中的地址是否相同。
综上所述,对于基本数据类型`int`,使用`==`进行比较即可,而对于对象类型的`Integer`,应该使用`equals()`方法进行比较。
import java.util.*; public class Main { public static List<String> split(String input_str) { //空格分割 List<String> v = new ArrayList<>(); while (input_str.indexOf(" ") != -1) { int found = input_str.indexOf(" "); v.add(input_str.substring(0, found)); input_str = input_str.substring(found + 1); } v.add(input_str); return v; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input_number_str = scanner.nextLine(); int number = Integer.parseInt(input_number_str);//数据的范围 List<List<String>> operations = new ArrayList<>();//添加和删除语句 for (int i = 0; i < 2 * number; i++) { String input_str = scanner.nextLine(); operations.add(split(input_str)); } int queue_size = 0;//队列长度 boolean in_order = true;//是否按顺序删除 int result = 0;//最小的调整顺序次数 for (int i = 0; i < operations.size(); i++) { List<String> operation = operations.get(i); if (operation.get(0).equals("head")) {//从头部添加元素 if (queue_size > 0 && in_order) {//不按顺序删除 in_order = false; } queue_size++; } else if (operation.get(0).equals("tail")) {//从尾部添加元素 queue_size++; } else {//删除元素 if (queue_size == 0) { continue; } if (!in_order) {//不按顺序删除 result++; in_order = true; } queue_size--; } } System.out.println(result);//输出最小的调整顺序次数 } },每行都注释下
这段代码实现了一个关于队列操作的问题,接下来我将逐行解释代码的含义:
```java
import java.util.*;
public class Main {
// 定义函数 split,将字符串按照空格分割成多个字符串,并返回一个 List
public static List<String> split(String input_str) {
List<String> v = new ArrayList<>();
while (input_str.indexOf(" ") != -1) {
int found = input_str.indexOf(" ");
v.add(input_str.substring(0, found));
input_str = input_str.substring(found + 1);
}
v.add(input_str);
return v;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input_number_str = scanner.nextLine();
int number = Integer.parseInt(input_number_str); // 获取数据的范围
List<List<String>> operations = new ArrayList<>(); // 定义二维 List,用于存储添加和删除的操作
// 循环读取输入的操作,将每个操作按照空格分割成多个字符串,然后添加到 operations 中
for (int i = 0; i < 2 * number; i++) {
String input_str = scanner.nextLine();
operations.add(split(input_str));
}
int queue_size = 0; // 定义队列长度
boolean in_order = true; // 定义是否按顺序删除
int result = 0; // 定义最小的调整顺序次数
// 循环遍历 operations 中的操作
for (int i = 0; i < operations.size(); i++) {
List<String> operation = operations.get(i); // 获取当前操作
if (operation.get(0).equals("head")) { // 如果是从头部添加元素
if (queue_size > 0 && in_order) { // 如果队列长度大于 0,且之前是按顺序删除的,则将 in_order 置为 false
in_order = false;
}
queue_size++; // 队列长度加 1
} else if (operation.get(0).equals("tail")) { // 如果是从尾部添加元素
queue_size++; // 队列长度加 1
} else { // 如果是删除元素
if (queue_size == 0) { // 如果队列长度为 0,则忽略该操作
continue;
}
if (!in_order) { // 如果之前不是按顺序删除的,则将 result 加 1,然后将 in_order 置为 true
result++;
in_order = true;
}
queue_size--; // 队列长度减 1
}
}
System.out.println(result); // 输出最小的调整顺序次数
}
}
```
总的来说,这个问题是要求实现一个队列,支持从头和尾部添加元素以及删除元素,并计算最小的调整顺序次数,使得删除元素时按顺序删除。其中,添加元素的操作是不需要考虑顺序的,只有删除元素时才需要按照之前添加的顺序进行删除。