这篇内容专门为Java 零基础新手打造,覆盖新手最容易踩坑的问题、必须掌握的核心基础知识点,最后附上 20 道有一定难度、适合巩固基础的编程题,帮你快速夯实 Java 基础。
一、Java 初学者最常遇到的问题与详解
1. 环境配置问题:JDK 安装、环境变量配置失败
- 问题 :cmd 输入
java -version/javac提示 "不是内部或外部命令" - 原因 :未配置
JAVA_HOME、Path 环境变量,或 JDK 版本与系统不匹配 - 解决 :
- 下载对应系统的 JDK8(新手首选,最稳定)
- 配置
JAVA_HOME=JDK 安装路径 - Path 中添加
%JAVA_HOME%\bin - 重启 cmd 再验证命令
2. 大小写混淆、语法拼写错误
- 问题 :
String写成string、System写成system、分号漏写 / 写错 - 原因 :Java 是强类型、严格大小写语言,关键字和类名必须严格匹配
- 解决 :牢记 Java 规则:类名首字母大写、方法 / 变量首字母小写、语句必须以
;结尾
3. 数据类型使用错误
- 问题 :整数用
double存储、字符串比较用==、数值溢出 - 详解 :
==比较引用地址 ,字符串内容比较必须用equals()- 整数用
int/long,小数用double,布尔用boolean - 超出类型范围会自动溢出,需选择合适类型
4. 流程控制逻辑混乱
- 问题:if-else 嵌套报错、for 循环死循环、switch 语法错误
- 原因:括号不匹配、条件写反、循环变量未更新
- 解决:养成代码缩进习惯,先写框架再填逻辑,debug 单步执行排查
5. 数组使用报错
- 问题 :数组下标越界
ArrayIndexOutOfBoundsException、空指针异常 - 原因:访问了数组不存在的下标(如长度 5,访问索引 5)、数组未初始化
- 解决 :数组索引从
0开始,最大索引 = 长度 - 1,使用前必须初始化
6. 方法定义与调用错误
- 问题:方法返回值和定义不匹配、静态方法调用非静态成员报错
- 详解 :
static方法只能调用static成员,非静态需要创建对象- 有返回值的方法必须
return对应类型的值
7. 编译与运行命令错误
- 问题 :
.java文件编译成功,运行提示 "找不到主类" - 原因 :类名和文件名不一致、运行时带了
.class后缀 - 解决 :文件名 = 主类名,运行命令:
java 类名(不加后缀)
二、Java 初期核心知识点(必掌握)
1. Java 基础语法
- 关键字:
public、class、static、void、if、for等 - 注释:单行
//、多行/* */、文档注释/** */ - 命名规范:见名知意,小驼峰(变量 / 方法)、大驼峰(类)
2. 变量与数据类型
- 基本数据类型(8 种):
byte、short、int、long、float、double、char、boolean - 引用数据类型:
String、数组、类、接口 - 变量定义:
数据类型 变量名 = 值;
3. 运算符
- 算术:
+ - * / % - 关系:
> < >= <= == != - 逻辑:
&& || ! - 自增自减:
++ --
4. 流程控制语句
- 选择结构:
if-else、if-else if-else、switch-case - 循环结构:
for、while、do-while - 跳转语句:
break、continue、return
5. 数组
- 定义:
int[] arr = new int[5];/int[] arr = {1,2,3}; - 遍历:普通 for 循环、增强 for 循环
- 核心:长度固定、索引从 0 开始
6. 方法(函数)
- 定义格式:
修饰符 返回值类型 方法名(参数列表){方法体} - 重载:方法名相同,参数列表不同(个数 / 类型 / 顺序)
- 静态方法:
static修饰,直接调用;非静态:需要对象调用
7. 面向对象基础
-
类与对象:类是模板,对象是实例
-
成员变量、成员方法、构造方法
-
封装:私有成员变量,提供
get/set方法三、20 道 Java 进阶练习题(含代码 + 解析)
1. 数组原地反转
java
public class Test1 {
public static void reverse(int[] arr){
int left = 0;
int right = arr.length-1;
while(left < right){
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
reverse(a);
for(int num:a) System.out.print(num+" ");
}
}
思路:双指针首尾交换,无需新数组
2. 数组求最大、最小、总和、平均值
java
public class Test2 {
public static void main(String[] args) {
int[] arr = {12,45,7,89,23};
int max=arr[0],min=arr[0],sum=0;
for(int i:arr){
if(i>max) max=i;
if(i<min) min=i;
sum+=i;
}
double avg = sum*1.0/arr.length;
System.out.println("最大:"+max+" 最小:"+min+" 和:"+sum+" 平均:"+avg);
}
}
3. 统计数组奇偶个数
java
public class Test3 {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7};
int ji=0,ou=0;
for(int n:arr){
if(n%2==0) ou++;
else ji++;
}
System.out.println("奇数:"+ji+" 偶数:"+ou);
}
}
4. 数组去重
java
import java.util.ArrayList;
public class Test4 {
public static void main(String[] args) {
int[] arr = {1,1,2,2,3,3,4};
ArrayList<Integer> list = new ArrayList<>();
for(int n:arr){
if(!list.contains(n)){
list.add(n);
}
}
System.out.println(list);
}
}
5. 查找元素所有下标
java
public class Test5 {
public static void findIndex(int[] arr,int key){
for(int i=0;i<arr.length;i++){
if(arr[i]==key){
System.out.print(i+" ");
}
}
}
public static void main(String[] args) {
int[] a={2,5,2,8,2};
findIndex(a,2);
}
}
6. 判断回文字符串
java
public class Test6 {
public static boolean isHuiWen(String s){
int l=0,r=s.length()-1;
while(l<r){
if(s.charAt(l)!=s.charAt(r)) return false;
l++;r--;
}
return true;
}
public static void main(String[] args) {
System.out.println(isHuiWen("abcba"));
}
}
7. 统计字符串大小写、数字、空格
java
public class Test7 {
public static void main(String[] args) {
String str = "Abc 123 Xyz";
int big=0,small=0,num=0,space=0;
for(char c:str.toCharArray()){
if(Character.isUpperCase(c)) big++;
else if(Character.isLowerCase(c)) small++;
else if(Character.isDigit(c)) num++;
else if(c==' ') space++;
}
System.out.println("大写:"+big+" 小写:"+small+" 数字:"+num+" 空格:"+space);
}
}
8. 自定义字符串截取
java
public class Test8 {
public static String subStr(String s,int start,int len){
StringBuilder sb = new StringBuilder();
for(int i=start;i<start+len&&i<s.length();i++){
sb.append(s.charAt(i));
}
return sb.toString();
}
public static void main(String[] args) {
System.out.println(subStr("helloworld",2,3));
}
}
9. 字符串大小写互换
java
public class Test9 {
public static String swapCase(String s){
char[] ch = s.toCharArray();
for(int i=0;i<ch.length;i++){
if(Character.isUpperCase(ch[i])){
ch[i] = Character.toLowerCase(ch[i]);
}else if(Character.isLowerCase(ch[i])){
ch[i] = Character.toUpperCase(ch[i]);
}
}
return new String(ch);
}
public static void main(String[] args) {
System.out.println(swapCase("AbC123"));
}
}
10. 判断异位词
java
import java.util.Arrays;
public class Test10 {
public static boolean isYiWei(String s1,String s2){
char[] c1 = s1.toCharArray();
char[] c2 = s2.toCharArray();
Arrays.sort(c1);
Arrays.sort(c2);
return Arrays.equals(c1,c2);
}
public static void main(String[] args) {
System.out.println(isYiWei("listen","silent"));
}
}
11. 判断闰年
java
public class Test11 {
public static boolean isRun(int year){
return (year%4==0 && year%100!=0) || (year%400==0);
}
public static void main(String[] args) {
System.out.println(isRun(2024));
}
}
12. 三个数从大到小排序
java
public class Test12 {
public static void main(String[] args) {
int a=3,b=1,c=5;
int max,mid,min;
max = Math.max(a,Math.max(b,c));
min = Math.min(a,Math.min(b,c));
mid = a+b+c-max-min;
System.out.println(max+" "+mid+" "+min);
}
}
13. 打印 99 乘法表
java
public class Test13 {
public static void main(String[] args) {
for(int i=1;i<=9;i++){
for(int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+i*j+"\t");
}
System.out.println();
}
}
}
14. 1~100 所有素数
java
public class Test14 {
public static boolean isPrime(int n){
if(n<2) return false;
for(int i=2;i*i<=n;i++){
if(n%i==0) return false;
}
return true;
}
public static void main(String[] args) {
for(int i=2;i<=100;i++){
if(isPrime(i)) System.out.print(i+" ");
}
}
}
15. 斐波那契数列
java
public class Test15 {
//循环
public static int fib(int n){
if(n<=2) return 1;
int a=1,b=1,c=0;
for(int i=3;i<=n;i++){
c=a+b;
a=b;
b=c;
}
return c;
}
public static void main(String[] args) {
System.out.println(fib(10));
}
}
16. 猜数字游戏
java
import java.util.Random;
import java.util.Scanner;
public class Test16 {
public static void main(String[] args) {
Random r = new Random();
int num = r.nextInt(100)+1;
Scanner sc = new Scanner(System.in);
while(true){
System.out.print("输入数字:");
int guess = sc.nextInt();
if(guess>num) System.out.println("大了");
else if(guess<num) System.out.println("小了");
else {System.out.println("猜对了");break;}
}
}
}
17. 最大公约数 + 最小公倍数
java
public class Test17 {
//辗转相除法
public static int gcd(int a,int b){
while(b!=0){
int t = a%b;
a=b;b=t;
}
return a;
}
public static void main(String[] args) {
int a=12,b=18;
int g = gcd(a,b);
int lcm = a*b/g;
System.out.println("最大公约数:"+g+" 最小公倍数:"+lcm);
}
}
18. 判断几位数 + 逆序输出
java
public class Test18 {
public static void main(String[] args) {
int n = 12345;
int count=0,rev=0;
while(n>0){
rev=rev*10+n%10;
n/=10;
count++;
}
System.out.println("位数:"+count+" 逆序:"+rev);
}
}
19. 冒泡排序
java
public class Test19 {
public static void bubbleSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
}
public static void main(String[] args) {
int[] a={5,3,8,1,2};
bubbleSort(a);
for(int i:a) System.out.print(i+" ");
}
}
20. 简易身份证校验
java
public class Test20 {
public static boolean checkId(String id){
if(id.length()!=18) return false;
for(int i=0;i<17;i++){
if(!Character.isDigit(id.charAt(i))){
return false;
}
}
char last = id.charAt(17);
return Character.isDigit(last)||last=='X'||last=='x';
}
public static void main(String[] args) {
System.out.println(checkId("11010119990101123X"));
}
}