一、引言
Java 作为一门广泛应用的编程语言,在软件开发领域占据着重要地位。无论是桌面应用、移动应用还是企业级应用开发,都能看到 Java 的身影。对于想要学习 Java 的开发者来说,梳理其知识结构,建立系统的知识体系至关重要。本文将对 Java 语言的知识点进行全面梳理,助力大家更好地学习和掌握 Java。
二、Java 基础部分
(一)Java 的历史和特点
Java 语言于 1995 年正式推出,由 Sun Microsystems 公司研发。其显著特点之一是跨平台性,通过 Java 虚拟机(JVM)实现,一次编写,到处运行,极大地提高了开发效率和代码的可移植性。同时,Java 是典型的面向对象编程语言,封装、继承、多态三大特性使其能更好地模拟现实世界,便于代码的组织和复用。此外,Java 还具备良好的安全性,通过字节码验证、类加载器等机制,有效防止恶意代码的攻击。而且 Java 拥有强大的垃圾回收机制,自动管理内存,减少了内存泄漏的问题;还有丰富的类库,为开发者提供了众多现成的工具和功能,加速开发进程。
(二)语法基础
数据类型:分为基本数据类型和引用数据类型。基本数据类型包括 byte(1 字节)、short(2 字节)、int(4 字节)、long(8 字节)、float(4 字节)、double(8 字节)、char(2 字节)、boolean(1 字节),它们直接存储数据值。引用数据类型则包括类、接口、数组等,存储的是对象的引用。
变量和常量:变量是可以改变值的标识符,需要先声明类型再使用,其作用域分为局部变量、成员变量等。常量是值不可改变的标识符,用 final 关键字修饰,命名通常使用全大写字母,多个单词之间用下划线分隔。
运算符:包括算术运算符(+、-、、/、%、++、-- 等)、关系运算符(>、<、==、!=、>=、<= 等)、逻辑运算符(&&、||、! 等)、赋值运算符(=、+=、-=、=、/= 等)以及位运算符(&、|、^、~、<<、>>、>>> 等)。其中,&& 和 & 的区别在于,&& 具有短路功能,当左边表达式为 false 时,右边表达式不再执行;而 & 则会执行两边的表达式。
流程控制语句:条件语句有 if-else、switch-case,用于根据不同条件执行不同的代码块。if-else 可以处理复杂的条件判断,switch-case 适用于判断条件为等值的情况,JDK1.7 及以上版本支持 String 类型的 switch-case。循环语句包括 for、while、do-while,用于重复执行一段代码。for 循环适用于已知循环次数的情况,while 和 do-while 适用于循环次数不确定的情况,do-while 至少会执行一次循环体。
注释:用于解释代码,提高代码的可读性,不会被编译器执行。主要分为单行注释(// 注释内容)、多行注释(/注释内容/)和文档注释(/*注释内容/)。文档注释可以通过 javadoc 工具生成 API 文档。
数组:是相同数据类型元素的集合,具有固定的长度。数组的声明方式有两种:数据类型 [] 数组名;或数据类型 数组名 []。数组的初始化分为静态初始化(如 int [] arr = {1,2,3};)和动态初始化(如 int [] arr = new int [3];)。可以通过数组的 length 属性获取数组的长度,数组的遍历可以使用 for 循环或增强 for 循环(foreach)。
三、Java 核心部分
(一)面向对象编程
类和对象:类是对现实事物的抽象描述,包含属性和方法。对象是类的实例,通过 new 关键字创建。例如,定义一个 Person 类,包含 name 和 age 属性以及 eat ()、sleep () 方法,通过 Person person = new Person (); 创建 Person 对象。
封装:将对象的属性和方法隐藏起来,只提供公共的访问接口,提高代码的安全性和可维护性。通常将属性用 private 修饰,通过 public 的 getter 和 setter 方法来访问和修改属性。
继承:子类可以继承父类的属性和方法,并可以在此基础上进行扩展和重写。例如,动物类是父类,哺乳动物类继承动物类,猫、狗等子类又继承哺乳动物类。继承使用 extends 关键字,Java 中只支持单继承,但可以通过接口实现多继承的效果。
多态:同一方法在不同对象上有不同的实现方式,包括编译时多态(方法重载)和运行时多态(方法重写)。方法重载是指在同一个类中,方法名相同,参数列表不同(参数个数、类型、顺序不同);方法重写是指子类重写父类的方法,方法名、参数列表、返回值类型都相同,子类方法的访问权限不能低于父类方法。
接口和抽象类:接口是一种抽象类型,只包含方法声明,没有方法实现,类可以实现多个接口。抽象类包含抽象方法和具体方法,子类必须实现抽象方法,且一个类只能继承一个抽象类。接口使用 interface 关键字定义,类实现接口使用 implements 关键字;抽象类使用 abstract 关键字定义。
(二)Java 集合框架
List:有序可重复的集合,常用实现类有 ArrayList、LinkedList、Vector。ArrayList 基于数组实现,查询效率高;LinkedList 基于链表实现,增删效率高;Vector 是线程安全的,但效率较低,现在一般不推荐使用。
Set:无序不可重复的集合,常用实现类有 HashSet、TreeSet、LinkedHashSet。HashSet 基于哈希表实现,查询速度快;TreeSet 可以对元素进行排序,底层使用红黑树;LinkedHashSet 兼具 HashSet 和 LinkedList 的特点,有序且查询效率高。
Map:以键值对形式存储数据的集合,常用实现类有 HashMap、TreeMap、LinkedHashMap、Hashtable。HashMap 基于哈希表实现,查询效率高,线程不安全;TreeMap 可以对键进行排序;LinkedHashMap 可以保持插入顺序;Hashtable 是线程安全的,但效率较低。
集合工具类:Collections 类提供了许多操作集合的静态方法,如排序(sort ())、查找(binarySearch ())、反转(reverse ())等;Arrays 类用于操作数组,如排序(sort ())、转换为集合(asList ())等。
(三)多线程编程
线程的创建方式:可以通过继承 Thread 类或实现 Runnable 接口来创建线程,JDK1.5 及以上版本还可以通过实现 Callable 接口和使用 FutureTask 类创建线程,这种方式可以获取线程执行的返回值。实现 Runnable 接口更灵活,因为一个类可以实现多个接口,而只能继承一个类。
线程的生命周期:包括新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)五个状态。当调用线程的 start () 方法后,线程进入就绪状态;获得 CPU 资源后进入运行状态;在运行过程中,可能因等待资源、睡眠等进入阻塞状态;线程执行完毕或出现异常则进入死亡状态。
同步机制:为了避免多线程并发访问共享资源时出现数据不一致的问题,可以使用 synchronized 关键字实现同步(同步方法和同步代码块),也可以使用 Lock 接口及其实现类(如 ReentrantLock)等方式。synchronized 是隐式锁,自动获取和释放锁;Lock 是显式锁,需要手动获取和释放锁,更灵活。
线程通信:通过 wait ()、notify ()、notifyAll () 方法实现线程之间的通信,这些方法必须在同步代码块或同步方法中使用。wait () 使线程进入等待状态,释放锁;notify () 唤醒一个等待的线程;notifyAll () 唤醒所有等待的线程。
线程池:JDK1.5 及以上版本提供了 Executor 框架来创建和管理线程池,常用的线程池有 FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPool 等。线程池可以减少线程创建和销毁的开销,提高性能。
(四)I/O 流
字节流和字符流:字节流以字节为单位处理数据,适用于所有类型的文件;字符流以字符为单位处理数据,适用于文本文件。字节流的顶层抽象类是 InputStream 和 OutputStream;字符流的顶层抽象类是 Reader 和 Writer。
常用流类:字节流有 FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream 等;字符流有 FileReader、FileWriter、BufferedReader、BufferedWriter、InputStreamReader、OutputStreamWriter 等。BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter 带有缓冲区,能提高读写效率。InputStreamReader 和 OutputStreamWriter 是字节流和字符流之间的转换流。
对象序列化:将对象转换为字节序列的过程,反序列化是将字节序列恢复为对象的过程。实现序列化需要让类实现 Serializable 接口,使用 ObjectOutputStream 和 ObjectInputStream 类进行序列化和反序列化操作。
(五)异常处理
异常的分类:分为 Checked 异常和 Unchecked 异常。Checked 异常在编译时会被检查,必须进行处理,如 IOException、SQLException 等;Unchecked 异常在运行时才会出现,可不处理,但最好进行捕获,如 NullPointerException、IndexOutOfBoundsException 等。Throwable 是所有异常和错误的父类,其下有 Error 和 Exception 两个子类,Error 表示严重错误,通常无法处理;Exception 表示异常,可以处理。
处理方式:可以使用 try-catch-finally 语句捕获并处理异常,也可以使用 throws 关键字声明抛出异常,让调用者处理。try 块中放可能出现异常的代码;catch 块用于捕获并处理异常,一个 try 可以有多个 catch 块;finally 块中的代码无论是否出现异常都会执行,通常用于释放资源。
自定义异常:当 Java 提供的异常类不能满足需求时,可以自定义异常类,通常继承 Exception 或 RuntimeException 类。
(六)泛型
泛型的概念:泛型是一种参数化类型的机制,允许在定义类、接口和方法时使用类型参数,在使用时指定具体的类型。泛型可以在编译时检查类型安全性,避免类型转换错误,提高代码的复用性。
泛型类和泛型接口:定义泛型类的语法为 class 类名,其中 T 是类型参数;泛型接口的定义类似,interface 接口名。例如,List就是一个泛型接口。
泛型方法:在方法声明中使用类型参数的方法,语法为 public 返回值类型 方法名 (T 参数)。泛型方法可以在普通类或泛型类中定义。
通配符:泛型通配符有?、? extends 上限、? super 下限。? 表示任意类型;? extends 上限表示只能是上限类型或其子类型;? super 下限表示只能是下限类型或其父类型。
(七)枚举
枚举的定义:枚举是一种特殊的类,用于定义固定数量的常量。使用 enum 关键字定义枚举,例如 enum Week {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY}。
枚举的特点:枚举类的构造方法默认是 private 的,不能通过 new 关键字创建对象;枚举常量是枚举类的实例,默认被 public static final 修饰;枚举类可以实现接口,也可以有自己的方法。
四、Java 高级部分
(一)网络编程
Socket 编程:是 Java 进行网络通信的关键,通过 Socket 和 ServerSocket 类实现客户端和服务器端的通信。客户端创建 Socket 对象连接服务器,服务器创建 ServerSocket 对象监听端口,接受客户端的连接。
TCP 和 UDP 协议:TCP 协议是面向连接的、可靠的协议,适用于对数据可靠性要求高的场景,如文件传输、邮件发送等;UDP 协议是无连接的、不可靠的协议,适用于对实时性要求高的场景,如视频会议、在线游戏等。
URL 和 URLConnection:URL 类表示统一资源定位符,可以通过 URL 获取网络资源;URLConnection 类用于建立与 URL 所指向资源的连接,进行数据的读写操作。
(二)数据库编程
JDBC 技术是 Java 操作数据库的基础,连接数据库的步骤如下:
加载数据库驱动(如 Class.forName ("com.mysql.jdbc.Driver"));
建立数据库连接(通过 DriverManager.getConnection () 方法,传入数据库 URL、用户名和密码);
创建 Statement 对象或 PreparedStatement 对象执行 SQL 语句,PreparedStatement 可以防止 SQL 注入,效率更高;
处理查询结果(对于查询语句,通过 ResultSet 对象获取结果);
关闭连接、释放资源(按照 ResultSet、Statement、Connection 的顺序关闭,避免资源泄漏)。
此外,还可以使用数据库连接池(如 C3P0、Druid 等)来管理数据库连接,提高性能。
(三)Java 高级特性
泛型:(前面已详细介绍,此处不再赘述)
注解:用于为代码提供元数据,可以在编译时、类加载时或运行时被读取和处理。注解分为内置注解(如 @Override、@Deprecated、@SuppressWarnings)、元注解(用于修饰注解的注解,如 @Target、@Retention、@Documented、@Inherited)和自定义注解。自定义注解使用 @interface 关键字定义,可以通过反射获取注解信息。其中,@Target 用于指定注解可以修饰的元素类型,如 METHOD(方法)、TYPE(类、接口等);@Retention 用于指定注解的保留策略,如 SOURCE(只在源代码中保留)、CLASS(在 class 文件中保留)、RUNTIME(在运行时保留)。
反射:允许程序在运行时获取类的信息(如类名、属性、方法、构造方法等),并动态操作类的属性和方法,增强了程序的灵活性。反射的核心类有 Class、Constructor、Field、Method 等。通过 Class.forName ()、对象.getClass () 或类名.class 可以获取 Class 对象,然后通过 Class 对象获取其他信息并进行操作。例如,使用 getDeclaredFields () 方法获取类的所有属性,使用 getMethod () 方法获取类的方法,使用 newInstance () 方法创建对象实例等。但反射会降低程序的性能,应谨慎使用,一般在框架开发等需要动态处理类的场景中使用。
Lambda 表达式:JDK1.8 引入的新特性,用于简化函数式接口的实现,使代码更简洁。函数式接口是指只有一个抽象方法的接口。Lambda 表达式的语法为 (参数列表) -> {代码块},例如 (x, y) -> x + y。当参数列表只有一个参数时,括号可以省略;当代码块只有一条语句时,大括号和分号可以省略,且如果是返回语句,return 关键字也可以省略。Lambda 表达式可以与 Stream API 结合使用,提高集合操作的效率,例如对集合进行过滤、排序等操作时,使用 Lambda 表达式能让代码更简洁直观。
Stream API:JDK1.8 引入,用于对集合进行高效的操作,如过滤、映射、排序、聚合等。Stream 操作分为中间操作(返回 Stream 对象,如 filter ()、map ())和终端操作(返回具体结果,如 collect ()、count ())。中间操作是惰性的,只有当执行终端操作时,中间操作才会真正执行。例如,list.stream ().filter (s -> s.startsWith ("a")).collect (Collectors.toList ()),表示从集合中过滤出以 "a" 开头的元素并收集到新的集合中。Stream API 还支持并行流(parallelStream ()),可以利用多核处理器提高处理大量数据的效率。
Java 8 新特性补充:除了 Lambda 表达式和 Stream API,JDK1.8 还引入了方法引用(用于简化 Lambda 表达式的写法,如 ClassName::methodName)、默认方法(接口中可以有默认实现的方法,使用 default 关键字修饰)、Optional 类(用于处理空指针异常,避免 NullPointerException)等。默认方法可以在不破坏现有实现的情况下扩展接口的功能;Optional 类通过 of ()、ofNullable () 等方法创建实例,使用 isPresent () 判断是否有值,使用 orElse () 设置默认值等。
JVM 相关知识:Java 虚拟机是 Java 跨平台的核心,了解 JVM 知识对于 Java 开发者很重要。包括 JVM 的内存结构(如方法区、堆、虚拟机栈、本地方法栈、程序计数器)、类加载机制(加载、验证、准备、解析、初始化五个阶段)、垃圾回收机制(垃圾回收算法如标记 - 清除算法、复制算法、标记 - 整理算法、分代收集算法;垃圾回收器如 Serial GC、Parallel GC、CMS GC、G1 GC 等)。例如,堆是 JVM 中最大的一块内存区域,用于存储对象实例;类加载器有 Bootstrap ClassLoader、Extension ClassLoader、Application ClassLoader,采用双亲委派模型加载类。
五、Java EE 相关知识
Servlet:运行在服务器端的 Java 程序,用于处理客户端的请求并生成响应。Servlet 的生命周期包括初始化(init ())、处理请求(service ())和销毁(destroy ())三个阶段。当 Servlet 第一次被访问时,服务器会创建 Servlet 实例并调用 init () 方法进行初始化;之后每次有请求到来时,都会调用 service () 方法处理请求,service () 方法会根据请求的方式(GET、POST 等)调用对应的 doGet ()、doPost () 等方法。Servlet 通过 HttpServletRequest 对象获取客户端请求信息,通过 HttpServletResponse 对象向客户端发送响应。为了使 Servlet 能被客户端访问,需要在 web.xml 文件中配置 Servlet 的映射路径,或者使用 @WebServlet 注解进行配置。
JSP:Java Server Pages,是一种动态网页技术,允许在 HTML 中嵌入 Java 代码。JSP 本质上是 Servlet,在运行时会被翻译成 Servlet 类。JSP 的语法包括脚本片段(<% Java 代码 %>)、表达式(<%= 表达式 %>)、声明(<%! 变量或方法声明 %>)、指令(<%@ 指令名 属性 = 值 %>)和动作标签(<jsp: 动作名 ...>)。常用的 JSP 指令有 page 指令(用于设置页面属性,如 contentType、pageEncoding 等)、include 指令(用于静态包含其他文件)。JSP 有九大内置对象,分别是 request(请求对象)、response(响应对象)、session(会话对象)、application(应用对象)、out(输出对象)、page(页面对象)、pageContext(页面上下文对象)、config(配置对象)、exception(异常对象),这些内置对象可以直接在 JSP 中使用,无需手动创建。
Spring 框架:是一个轻量级的企业级应用开发框架,以 IOC(Inverse of Control,控制反转)和 AOP(Aspect-Oriented Programming,面向切面编程)为核心。
- IOC:将对象的创建和依赖关系的管理交给 Spring 容器,实现了对象之间的解耦。Spring 通过 DI(Dependency Injection,依赖注入)的方式实现 IOC,常用的注入方式有构造方法注入、setter 方法注入和注解注入(如 @Autowired)。
- AOP:将那些与业务无关,但却为业务模块所共同调用的逻辑(如日志记录、事务管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度。AOP 的核心概念包括切面(Aspect)、连接点(JoinPoint)、切入点(Pointcut)、通知(Advice)和目标对象(Target)。
- Spring MVC:是 Spring 的一个模块,用于实现 MVC(Model-View-Controller)设计模式。其工作流程为:客户端发送请求到 DispatcherServlet(前端控制器),DispatcherServlet 根据请求信息调用 HandlerMapping(处理器映射器)找到对应的 Handler(处理器),Handler 处理请求后返回 ModelAndView,DispatcherServlet 再调用 ViewResolver(视图解析器)将 ModelAndView 解析为具体的视图,最后将视图响应给客户端。
MyBatis:是一个优秀的持久层框架,用于简化数据库操作。MyBatis 通过 XML 或注解的方式配置 SQL 语句,将 Java 对象和数据库记录进行映射。MyBatis 的核心组件包括 SqlSessionFactory(会话工厂)、SqlSession(会话)、Mapper 接口和 Mapper XML 文件。使用 MyBatis 的步骤大致为:配置 MyBatis 的核心配置文件(如 mybatis-config.xml),定义 Mapper 接口和对应的 Mapper XML 文件(或使用注解),通过 SqlSessionFactory 获取 SqlSession,再通过 SqlSession 获取 Mapper 接口的代理对象,最后调用 Mapper 接口的方法执行数据库操作。MyBatis 支持动态 SQL,可以根据不同的条件生成不同的 SQL 语句,常用的动态 SQL 标签有 if、where、foreach 等。
Spring Boot:是 Spring 的扩展,旨在简化 Spring 应用的初始化和开发过程。Spring Boot 具有自动配置、起步依赖、嵌入式服务器(如 Tomcat、Jetty 等)等特点。自动配置可以根据类路径下的 jar 包和配置文件自动配置 Spring 应用;起步依赖将常用的依赖打包在一起,简化了依赖的管理;嵌入式服务器使得开发者无需手动部署应用到外部服务器,直接运行主类即可启动应用。Spring Boot 还提供了 Actuator 模块,用于监控和管理应用。
Spring Cloud:是一系列框架的有序集合,基于 Spring Boot 实现,为微服务架构提供了完整的解决方案。Spring Cloud 包含多个子项目,如 Eureka(服务注册与发现)、Ribbon(负载均衡)、Feign(声明式服务调用)、Hystrix(服务熔断与降级)、Zuul(网关)等。Eureka 用于实现服务的注册和发现,使服务之间能够相互感知;Ribbon 用于客户端的负载均衡,将请求分发到不同的服务实例;Feign 基于 Ribbon 和 Hystrix,简化了服务调用的代码;Hystrix 用于在服务出现故障时进行熔断和降级,防止故障蔓延;Zuul 作为网关,负责请求的路由、过滤等。
Hibernate:是一个开源的对象关系映射(ORM)框架,它对 JDBC 进行了轻量级的封装,使开发者可以使用面向对象的思想来操作数据库。Hibernate 通过配置文件(如 hbm.xml)或注解将 Java 类与数据库表进行映射,自动生成 SQL 语句执行数据库操作。Hibernate 的核心接口包括 SessionFactory(会话工厂)、Session(会话)、Transaction(事务)等。Session 是 Hibernate 与数据库交互的主要接口,提供了保存、更新、删除、查询等方法。
Java EE 其他技术:还包括 JPA(Java Persistence API,Java 持久化 API)、JMS(Java Message Service,Java 消息服务)、JTA(Java Transaction API,Java 事务 API)等。JPA 是一种 ORM 规范,Hibernate 是 JPA 的一种实现;JMS 用于实现分布式系统中不同组件之间的异步通信;JTA 用于管理分布式事务,保证多个数据库操作的原子性。