你好,我是田哥
最近,有不少朋友来找我聊,作为java开发者,到底需要掌握哪些技能才能在这行业混下去,不至于找不到工作。
可怜的Java开发者,你要学的东西实在是太多了,但是,也不必恐慌,毕竟很多知识可以等你找到一个工作后,边工作边学。
我之前分享过(快速版):手把手教:如何准备面试!
我之前画过很多思维导图:
知识星球免费共享
但是很多人都成了收藏家,打开图一点点看,感觉没有文档形式来地直接。
本文是《Java必备知识篇(上)》
,咱们开始正题。
Java基础
生存必备技能,每天都要与之打交道,来吧,看看有些什么东东。
- 注释
- 类和对象
- 基本数据类型
- 变量类型
- 变量命名规则
- 值传递与引用传递
- 修饰符
- 运算符
- 循环结构
- 条件语句
- switch case
- 异常处理
- 集成
- 封装
- 抽象类
- 接口
- 枚举
- 泛型
- 流(Stream)、文件(File)和IO
- 网络编程
- 序列化与反序列化
- 多线程编程
以上差不多就是Java基础,掌握了就表示你对Java有所知晓,离实际开发还远着。
JDK常用类
在 JDK(Java Development Kit
)中,有许多常用的类,这些类提供了丰富的功能和工具,用于在Java编程中处理各种任务。以下列举了一些 JDK 中常用的类及其功能:
- java.lang包:
- String:用于处理字符串的类。
- Integer、Double、Float等包装类:用于基本数据类型和对象之间的转换。
- Math:提供数学函数。
- Object:是所有类的基类。
- System:提供与系统交互的方法。
- java.util包:
- ArrayList、LinkedList:用于存储和操作集合元素的类。
- HashMap、LinkedHashMap、TreeMap:用于存储键值对的类。
- Date、Calendar:用于处理日期和时间。
- Scanner:用于从控制台或文件中读取输入。
- Arrays:包含各种数组操作方法。
- java.io包:
- File、FileInputStream、FileOutputStream:用于文件操作。
- BufferedReader、PrintWriter:用于帮助读取和写入数据。
- java.net包:
- URL、URLConnection:用于创建和打开URL连接。
- Socket、ServerSocket:用于网络通信。
- java.nio包:提供了新的 I/O 类,支持非阻塞 I/O。
- java.util.concurrent包:提供了并发编程的工具和框架。
- java.sql包:提供了 JDBC(Java Database Connectivity)用于与数据库进行交互。
- java.text包:用于处理文本格式化和解析。
- java.security包:提供了加密、数字签名等安全相关的类和工具。
这些是 JDK 中一些常用的类,涵盖了基本数据类型、集合框架、输入输出、网络编程、并发编程、数据库连接等方面的功能。
可能有些类不是你常用的,也没关系,你可以花点时间适当了解了解,因为现在的人工智能很强大的,只要你会问问题,基本都能给你答案,另外,关于这些常用类的使用,网上也是一大堆的文章。
数据结构与算法
数据结构与算法是计算机科学中的核心概念,对于编写高效、可维护的代码至关重要。以下是数据结构与算法中常见的内容:
数据结构:
- 数组(Array):存储固定大小元素的线性数据结构。
- 链表(Linked List):由节点组成的线性数据结构,可以分为单向链表、双向链表和循环链表。
- 栈(Stack):后进先出(LIFO)的数据结构。
- 队列(Queue):先进先出(FIFO)的数据结构,包括普通队列、双端队列和优先队列。
- 树(Tree):层次结构,包括二叉树、平衡树、二叉搜索树等。
- 图(Graph):由节点和边组成的非线性数据结构,包括有向图和无向图。
- 堆(Heap):特殊的树形数据结构,包括最大堆和最小堆。
- 哈希表(Hash Table):根据键(key)直接访问数据的数据结构。
- 集合(Set)和映射(Map):用于存储唯一值和键值对的数据结构。
算法:
- 排序算法:如冒泡排序、插入排序、选择排序、快速排序、归并排序等。
- 搜索算法:如线性搜索、二分搜索、深度优先搜索(DFS)和广度优先搜索(BFS)。
- 递归与回溯:用于解决复杂问题的重要技术。
- 动态规划和贪心算法:解决最优化问题的常用方法。
- 图论算法:如最短路径算法、最小生成树算法等。
- 字符串算法:如字符串匹配、编辑距离、KMP算法等。
- 位运算:用于处理位级别的操作,如位与、位或、位移等。
- 数学算法:如求解最大公约数、快速幂运算等数学问题的算法。
其他重要概念:
- 时间复杂度和空间复杂度:评估算法效率的重要指标。
- 算法设计原则:包括分治策略、贪心算法、动态规划等。
- 数据结构与算法的应用:在实际问题中,如优化算法、解决实际工程应用问题等。
掌握数据结构与算法有助于编写出高效、可维护的代码,解决各种复杂问题。在软件开发过程中,理解和应用好数据结构与算法是提高我们的编码能力和解决实际问题的效率。
但是,对于我们普通Java开发来说,不需要全部掌握,个人觉得我们需要掌握:数组、链表、哈希、集合、树,其他几个的特性你需要知道。算法我们只需要有所了解,能深入是更好,没时间也没问题,重点掌握冒泡、快排、二分,其他了解即可。
以上我是站在工作中实际使用情况来的,有的为了面试,那就学的越多越好。
举几个例子:
- 数组在工作中,使用频率那肯定是非常高了,另外,像ArrayList、String类等这些底层都用到了数组,所以,数组是排在第一位的。ArrayList、String类又是我们使用频率超级高的类,也是面试常问的。
- 链表在HashMap、LinkedList等类中也有用到。
- 树在HashMap、MySQL等都有用到,所以,有必要掌握。
计算机网络
对于 Java 程序员,了解计算机网络知识可以帮助他们更好地开发网络应用、进行调试和排错,以及优化程序的性能。
以下是 Java 程序员需要掌握的一些计算机网络知识:
- 基本网络概念:了解计算机网络的基本概念,如 OSI 模型、TCP/IP 协议栈、IP 地址、子网、MAC 地址等。
- HTTP 协议:了解 HTTP 协议,包括请求方法、状态码、头部信息等,以及 RESTful API 设计理念。
- TCP/IP 协议:深入了解 TCP 和 UDP 协议,包括连接建立、数据传输、可靠性、流量控制等。
- Socket 编程:掌握 Java 中基于 Socket 的网络编程,能够实现客户端与服务器之间的通信。
- 网络编程框架:了解常用的网络编程框架,如 Netty,用于构建高性能的网络应用。
- DNS 解析:理解 DNS 解析的过程,域名解析的原理,以及 DNS 缓存的作用。
- 安全与加密:熟悉 HTTPS 加密通信,了解 SSL/TLS 协议,以及如何保护网络通信的安全性。
- 代理和负载均衡:了解代理服务器和负载均衡的概念,以及如何通过它们优化网络通信性能。
- 网络性能调优:掌握网络性能调优的方法,包括减少网络延迟、调整 TCP 参数等技术。
- 网络诊断工具:熟悉网络诊断工具的使用,如 Wireshark、Ping、Traceroute,用于分析网络问题。
- Restful API:了解 Restful API 的设计原则和最佳实践,能够设计和开发符合 Restful 风格的接口。
- 网络安全:了解常见的网络安全攻击类型,如 DDos 攻击、SQL 注入,以及如何防范这些攻击。
掌握这些计算机网络知识可以使 Java 程序员更加全面地理解网络应用程序的开发与运行机制,有助于提升他们在网络编程方面的能力和水平。
Linux
对于 Java 程序员而言,熟悉 Linux 系统是至关重要的,因为大部分的服务器和开发环境都是基于 Linux。
但是,对于普通开发而言,不需要把所有Linux命名都掌握,只需要掌握部分就能应对工作了。
以下是一些常见的 Linux 命令,Java 程序员应该掌握这些命令以便在 Linux 环境中更高效地工作:
ls:列出当前目录下的文件和子目录。
代码语言:javascript复制ls
cd:切换工作目录。
代码语言:javascript复制cd /path/to/directory
pwd:显示当前工作目录的绝对路径。
代码语言:javascript复制pwd
mkdir:创建新目录。
代码语言:javascript复制mkdir new_directory
rm:删除文件或目录。
代码语言:javascript复制rm filename
rm -r directory
cp:复制文件或目录。
代码语言:javascript复制cp source_file destination
cp -r source_directory destination
mv:移动文件或目录。
代码语言:javascript复制mv source_file destination
mv source_directory destination
grep:在文件中搜索指定的文本。
代码语言:javascript复制grep "search_text" filename
ps:显示当前进程的状态。
代码语言:javascript复制ps
kill:终止一个进程。
代码语言:javascript复制kill process_id
- chmod:修改文件权限。
chmod permissions filename
- chown:修改文件的所有者。
chown owner:group filename
- tar:用于压缩和解压文件。
tar -cvzf archive_name.tar.gz directory_to_compress
tar -xvzf archive_name.tar.gz
- ssh:建立安全的远程连接。
ssh username@hostname
- top:实时显示系统中各个进程资源占用情况。
top
这些 Linux 命令可以帮助 Java 程序员在 Linux 环境中更加熟练地进行文件操作、进程管理、权限管理以及系统监控等工作。熟练掌握这些命令将有助于提高我们的工作效率和解决问题的能力。
JVM
Java 虚拟机(JVM)是 Java 代码运行的核心组件,负责将 Java 字节码转换为机器码并在计算机上执行。以下是 JVM 的一些核心知识点:
- 类加载器(ClassLoader):
- JVM 使用类加载器来加载类文件,将类的字节码数据加载到内存中并创建对应的 Class 对象。
- 分为三种类加载器:Bootstrap ClassLoader、Extension ClassLoader、Application ClassLoader。
- 类加载机制、双亲委派模式、打破双亲委派模型、自定义类加载器
- 运行时数据区:
可以适当了解一下JDK各版本的区别
- JVM 将内存分为不同区域,包括方法区、堆、栈、程序计数器和本地方法栈。
- 堆(Heap)用于存储对象实例,方法区(Method Area)存储类信息、常量池等。
- 垃圾回收(Garbage Collection):
- 垃圾回收算法
- JVM 支持自动内存管理,包括垃圾回收机制来处理不再使用的对象,并释放内存。
- 垃圾回收器的选择和调优对应用程序的性能至关重要。
- 即时编译器(Just-In-Time Compiler):
- JVM 包含即时编译器,将字节码转换为本地机器码,提高程序的执行效率。
- HotSpot JVM 中包含客户端编译器(C1)和服务器端编译器(C2)。
- 内存模型(Memory Model):
- Java 内存模型定义了多线程并发访问内存时的可见性、有序性和原子性规则。
- 理解内存模型对编写正确并发代码至关重要。
- 线程管理和调度:
- JVM 负责线程的创建、调度和同步管理。
- 理解线程栈、线程安全、锁机制对于多线程编程至关重要。
- 性能监控和调优:
- -Xms: 初始堆大小。
- -Xmx: 最大堆大小。
- -Xmn: 设置新生代大小。
- -XX: UseG1GC: 启用 G1 垃圾回收器。
- -XX: UseConcMarkSweepGC: 启用 CMS 垃圾回收器。
- -XX: UseParallelGC: 启用并行垃圾回收器。
- -XX:MaxPermSize: 设置永久代最大大小。
- -XX:PermSize: 设置永久代初始大小。
- -XX:MaxMetaspaceSize: 设置元空间最大大小。
- -XX:MetaspaceSize: 设置元空间初始大小。
- -XX: PrintGC: 打印 GC 日志。
- -XX: PrintGCDetails: 打印详细的 GC 日志。
- -XX: PrintGCDateStamps: 打印 GC 日期时间戳。
- -Xloggc:filename: 将 GC 日志输出到指定文件。
- -Xss: 每个线程的栈大小。
- JVM 提供了丰富的性能监控工具,如 JConsole、VisualVM 、MAT、GChisto 、Arthas 等。
- 通过调整堆大小、垃圾回收策略等参数可以优化应用程序的性能。
- 常见调优参数:
- 调优命令:
- jps:Java 进程状态工具,可以列出 Java 进程的 PID。
- jstat:Java 统计监视工具,用于收集各种与 JVM 运行相关的统计信息。
- jmap:Java 内存分析工具,用于生成堆转储快照(heap dump)以及查看堆内存情况。
- jstack:Java 堆栈跟踪工具,用于打印 Java 进程的 Java 堆栈信息。
- jcmd:Java 控制台监控工具,用于发送诊断命令请求到 JVM。
- jinfo:Java 配置信息工具,用于查看和调整 JVM 的启动参数和系统属性。
- jconsole:Java 监视和管理控制台,提供了一个 GUI 界面用于监控 JVM 的性能和资源使用情况。
- 安全管理:
- JVM 提供了安全管理器来控制应用程序对系统资源的访问权限。
- 安全管理器可以确保程序不会越权访问系统资源。
编译过程也可以适当了解一下
这些是 Java 虚拟机(JVM)的一些核心知识点,深入理解这些概念可以帮助开发人员编写高效、稳定的 Java 应用程序。
JVM对于我们开发而言,其实,更多需要我们知道我们写的代码是怎么运行的、怎么存储的、怎么调用的。 现在的垃圾收集器越来越好,硬件也越来越便宜,导致很少需要你调优了。 如果为了面试,那你需要自己取模拟尝试如何解决OOM之类的问题。
开发工具
maven
maven 是 Java 开发中常用的项目管理工具和构建工具,Java 程序员需要掌握以下关键内容来有效地使用 maven:
- 项目构建:
- POM 文件:理解和配置项目对象模型(POM)文件,其中包含项目的元数据和依赖管理信息。
- 依赖管理:在 POM 文件中定义和管理项目的依赖,包括外部库和框架。
- 生命周期和阶段:了解 Maven 构建生命周期,以及各个构建阶段的目的和执行顺序。
- 插件管理:
- 内置插件:熟悉常用的内置插件,如 compiler、surefire 等,可以配置这些插件以定制构建过程。
- 自定义插件:了解如何编写和使用自定义 Maven 插件,以满足特定需求。
- 构建过程:
- clean:清理项目构建中的临时文件和目录。
- compile:编译项目源代码。
- test:运行单元测试。
- package:打包项目,生成可部署的 artifact。
- install:将 artifact 安装到本地 Maven 仓库以供其他项目使用。
- deploy:将 artifact 部署到远程 Maven 仓库。
- 多模块项目:
- 了解如何管理多模块项目,定义模块间的依赖关系,以及如何进行跨模块的构建。
- 依赖管理和仓库:
- 理解 Maven 仓库的概念,包括本地仓库和远程仓库。
- 了解如何配置仓库镜像和代理,以加快构建速度。
- 学会解决依赖冲突和版本管理问题,通过 exclusions、dependencyManagement 等方式处理依赖关系。
- Profile 和属性:
- 使用 Maven Profile 定制不同环境下的构建配置,如开发环境、测试环境、生产环境。
- 熟悉如何在 POM 文件中使用属性来提取配置信息,使构建过程更灵活。
- 发布和部署:
- 了解如何发布构建好的 artifact 到 Maven 中央仓库或私有仓库。
- 学会使用 Maven 插件进行项目的部署和发布。
- 集成其他工具:
- 与 IDE 整合:掌握如何在常见的集成开发环境如 IntelliJ IDEA、Eclipse 中使用 Maven。
- 与持续集成工具整合:了解如何与持续集成工具如 Jenkins 集成,实现自动化构建和部署。
掌握以上内容可以帮助 Java 程序员更高效地管理和构建项目。
Git
对于 Java 程序员来说,熟练掌握 Git 是非常重要的,因为 Git 是开发中最常用的版本控制系统之一。以下是 Java 程序员需要掌握的一些 Git 内容:
- 基本概念:
- 仓库(Repository):代码存储库,包含项目的所有文件和版本历史记录。
- 提交(Commit):将更改保存到本地仓库的操作。
- 分支(Branch):用于在不同的开发线上进行工作,有助于并行开发和功能独立性。
- 合并(Merge):将不同分支的更改合并到一起。
- 基本操作:
- clone:克隆远程仓库到本地。
- add:将文件添加到暂存区。
- commit:将暂存区的更改提交到本地仓库。
- push:将本地提交推送到远程仓库。
- pull:从远程仓库拉取最新更改到本地。
- fetch:从远程仓库获取最新提交但不合并到当前分支。
- 分支管理:
- branch:创建新分支。
- checkout:切换分支。
- merge:合并分支。
- rebase:将一个分支的更改应用到另一个分支。
- cherry-pick:选择并应用单个提交。
- 解决冲突:
- 理解冲突是如何产生的,以及如何解决代码冲突。
- 使用合并工具(如 Visual Studio Code、IntelliJ IDEA)解决冲突。
- 标签管理:
- tag:打标签,标记版本发布。
- 查看标签:查看所有标签。
- 远程仓库:
- remote:管理远程仓库。
- fetch/pull/push:与远程仓库交互。
- 撤销操作:
- reset:撤销提交。
- revert:撤销已发布的提交。
- Git 工作流:
- 了解常见的 Git 工作流程,如集中式工作流、Gitflow 等,选择适合项目的工作流程。
- Git 协作:
- 了解如何与团队协作,处理分支、合并和冲突等问题。
- 使用 Pull Request 进行代码审查和合并。
- Git 工具:
- 使用 Git GUI 工具(如 SourceTree、GitKraken)简化 Git 操作。
- 熟练使用命令行工具进行 Git 操作。
掌握这些 Git 内容可以帮助 Java 程序员更有效地进行版本控制、团队协作和代码管理,保证项目的稳定性和可维护性。
下面列出了一些常见的 Git 命令,以及与这些命令相关的示例。这些命令覆盖了 Git 的基本操作、分支管理、远程仓库交互等方面。
1. 基本操作
git init: 初始化一个本地仓库。
代码语言:javascript复制git init
git clone: 克隆一个远程仓库到本地。
代码语言:javascript复制git clone https://github.com/example/example.git
git add: 将文件添加到暂存区。
代码语言:javascript复制git add file.txt
git commit: 将暂存区的更改提交到本地仓库。
代码语言:javascript复制git commit -m "Add new feature"
git status: 查看当前工作区和暂存区的状态。
代码语言:javascript复制git status
2. 分支管理
git branch: 列出所有分支,包括本地和远程。
代码语言:javascript复制git branch -a
git checkout: 切换到另一个分支。
代码语言:javascript复制git checkout new-feature
git merge: 将指定分支的更改合并到当前分支。
代码语言:javascript复制git merge development
3. 远程仓库交互
git remote: 查看远程仓库信息。
代码语言:javascript复制git remote -v
git fetch: 从远程仓库拉取最新提交但不合并到当前分支。
代码语言:javascript复制git fetch origin
git pull: 从远程仓库拉取最新更改并合并到当前分支。
代码语言:javascript复制git pull origin main
git push: 将本地分支的更改推送到远程仓库。
代码语言:javascript复制git push origin main
4. 撤销操作
git reset: 撤销提交。
代码语言:javascript复制git reset --soft HEAD^
git revert: 撤销已发布的提交。
代码语言:javascript复制git revert <commit-hash>
示例操作
克隆远程仓库:
代码语言:javascript复制git clone https://github.com/example/example.git
添加文件并提交更改:
代码语言:javascript复制git add .
git commit -m "Add new feature"
创建新分支并切换到该分支:
代码语言:javascript复制git checkout -b feature-branch
将本地分支更改推送到远程仓库:
代码语言:javascript复制git push origin feature-branch
合并特性分支到主分支:
代码语言:javascript复制git checkout main
git merge feature-branch
其他工具
MySQL数据库客户端Navicat、IntelliJ IDEA 、JUnit 、Jenkins 。
篇幅有限,现在都8000多字了,所以,本文就只给大家安排上篇。