java中怎么让两个相加
- 后端开发
- 2025-07-15
- 4663
Java中,两个数字相加可通过定义变量后使用加号运算符实现,如int a = 5, b = 6; int sum = a + b; 也可用Scanner类获取用户输入后相加
Java中,实现两个数相加的方法多种多样,具体取决于数据类型、操作方式以及应用场景,以下是几种常见的实现方式及其详细解释:
基本数据类型的相加
对于整数、浮点数等基本数据类型,可以直接使用运算符进行相加。
int a = 5; int b = 10; int sum = a + b; // sum为15
对于浮点数,同样适用:
double x = 3.5; double y = 2.5; double result = x + y; // result为6.0
需要注意的是,如果操作数类型不同,Java会自动进行类型转换,并将结果转换为较大的类型。int与double相加时,int会被提升为double,结果也是double类型。
字符串的“相加”
在Java中,字符串的“相加”实际上是字符串的连接操作。
String str1 = "Hello"; String str2 = "World"; String combined = str1 + " " + str2; // combined为"Hello World"
如果尝试将字符串与非字符串类型(如数字)相加,Java会先将非字符串类型转换为字符串,然后进行连接。

String numStr = "The number is: "; int num = 42; String result = numStr + num; // result为"The number is: 42"
大整数的相加(BigInteger)
对于超出基本数据类型范围的大整数,可以使用java.math.BigInteger类。
import java.math.BigInteger;
BigInteger bigInt1 = new BigInteger("12345678901234567890");
BigInteger bigInt2 = new BigInteger("98765432109876543210");
BigInteger sum = bigInt1.add(bigInt2); // sum为"111111111011111111100"
BigInteger提供了丰富的数学运算方法,包括加、减、乘、除等,适用于高精度计算场景。
链表表示的数字相加(LeetCode题目)
在LeetCode等算法题中,经常会遇到用链表表示数字并求和的情况,给定两个非空链表l1和l2,表示两个非负整数,每个节点存储一位数字,且链表按逆序排列(即个位在头结点),要求将两数相加并返回表示和的链表,以下是几种解法:
逐位相加 + 虚拟头结点
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(-1); // 虚拟头结点简化操作
ListNode cur = dummy;
int carry = 0; // 进位值
while (l1 != null || l2 != null || carry != 0) {
int num1 = (l1 != null) ? l1.val : 0;
int num2 = (l2 != null) ? l2.val : 0;
int sum = num1 + num2 + carry;
carry = sum / 10;
cur.next = new ListNode(sum % 10);
cur = cur.next;
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
}
return dummy.next;
}
}
核心思路:

- 使用虚拟头结点简化链表操作,无需单独处理头结点初始化。
- 逐位相加,同时遍历两链表对应节点,计算当前位和进位。
- 若最后仍有进位,需额外创建节点。
复用原链表节点(空间优化)
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode head = null;
ListNode cur = null;
int carry = 0;
while (l1 != null || l2 != null || carry != 0) {
int num1 = (l1 != null) ? l1.val : 0;
int num2 = (l2 != null) ? l2.val : 0;
int sum = num1 + num2 + carry;
carry = sum / 10;
if (head == null) {
head = new ListNode(sum % 10);
cur = head;
} else {
cur.next = new ListNode(sum % 10);
cur = cur.next;
}
if (l1 != null) l1 = l1.next;
if (l2 != null) l2 = l2.next;
}
return head;
}
}
核心思路:
- 优先复用较长的链表节点,减少新节点创建。
- 动态构造结果链表,直接修改原链表节点值,避免额外空间开销。
栈方法(适用于正序存储链表)
import java.util.Stack;
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
Stack<Integer> s1 = new Stack<>();
Stack<Integer> s2 = new Stack<>();
while (l1 != null) {
s1.push(l1.val);
l1 = l1.next;
}
while (l2 != null) {
s2.push(l2.val);
l2 = l2.next;
}
ListNode head = null;
int carry = 0;
while (!s1.isEmpty() || !s2.isEmpty() || carry != 0) {
int sum = carry;
if (!s1.isEmpty()) sum += s1.pop();
if (!s2.isEmpty()) sum += s2.pop();
ListNode node = new ListNode(sum % 10);
node.next = head;
head = node;
carry = sum / 10;
}
return head;
}
}
适用场景:若链表按正序存储(如题目445. 两数相加 II),需使用栈或反转链表处理,本题虽为逆序,但为拓展思路,简要介绍栈解法。
用户输入的两个数相加
通过Scanner类获取用户输入并进行相加:
import java.util.Scanner;
public class AddTwoNumbers {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter the first number: ");
int num1 = scanner.nextInt();
System.out.print("Enter the second number: ");
int num2 = scanner.nextInt();
int sum = num1 + num2;
System.out.println("The sum is: " + sum);
scanner.close();
}
}
注意事项:

- 使用
Scanner类读取用户输入时,需注意输入类型的匹配(如nextInt()用于读取整数)。 - 关闭
Scanner对象以释放资源。
相关FAQs
Q1: 如何确保两个数相加时不会溢出?
A1: 对于基本数据类型,Java的运算符在溢出时会按照二进制补码规则进行处理,不会抛出异常,但如果需要处理大整数或高精度计算,应使用BigInteger类。
BigInteger bigInt1 = new BigInteger("999999999999999999");
BigInteger bigInt2 = new BigInteger("1");
BigInteger sum = bigInt1.add(bigInt2); // sum为"1000000000000000000"
Q2: 如何将两个字符串表示的数字相加?
A2: 可以将字符串转换为BigInteger或Integer后再进行相加。
String numStr1 = "123456789"; String numStr2 = "987654321"; int sum = Integer.parseInt(numStr1) + Integer.parseInt(numStr2); // 注意可能溢出 // 或使用BigInteger BigInteger bigSum = new BigInteger(numStr1).add(new BigInteger(numStr2));
如果字符串表示的数字非常大,建议使用`
