<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Java基础 on 随记</title><link>https://blog.liuyi2026.asia/zh/tags/Java%E5%9F%BA%E7%A1%80/</link><description>Recent content in Java基础 on 随记</description><generator>Hugo</generator><language>zh</language><atom:link href="https://blog.liuyi2026.asia/zh/tags/Java%E5%9F%BA%E7%A1%80/index.xml" rel="self" type="application/rss+xml"/><item><title>Java基础常见面试题总结(上)</title><link>https://blog.liuyi2026.asia/zh/docs/technology/Interview/java/basis/java-basic-questions-01/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.liuyi2026.asia/zh/docs/technology/Interview/java/basis/java-basic-questions-01/</guid><description>&lt;h2 id="基础概念与常识">基础概念与常识&lt;a class="anchor" href="#%e5%9f%ba%e7%a1%80%e6%a6%82%e5%bf%b5%e4%b8%8e%e5%b8%b8%e8%af%86">#&lt;/a>&lt;/h2>
&lt;h3 id="java-语言有哪些特点">Java 语言有哪些特点?&lt;a class="anchor" href="#java-%e8%af%ad%e8%a8%80%e6%9c%89%e5%93%aa%e4%ba%9b%e7%89%b9%e7%82%b9">#&lt;/a>&lt;/h3>
&lt;ol>
&lt;li>简单易学（语法简单，上手容易）；&lt;/li>
&lt;li>面向对象（&lt;mark>封装，继承，多态&lt;/mark>）；&lt;/li>
&lt;li>&lt;mark>平台无关&lt;/mark>性（ Java 虚拟机实现平台无关性）；&lt;/li>
&lt;li>支持多线程（ C++ 语言没有内置的多线程机制，因此必须调用操作系统的多线程功能来进行多线程程序设计，而 Java 语言却提供了多线程支持）；&lt;/li>
&lt;li>可靠性（具备异常处理和自动内存管理机制）；&lt;/li>
&lt;li>安全性（Java 语言本身的设计就提供了多重安全防护机制如访问权限修饰符、限制程序直接访问操作系统资源）；&lt;/li>
&lt;li>高效性（通过 Just In Time 编译器等技术的优化，Java 语言的运行效率还是非常不错的）；&lt;/li>
&lt;li>支持网络编程并且很方便；&lt;/li>
&lt;li>编译与解释并存；&lt;/li>
&lt;li>……&lt;/li>
&lt;/ol>
&lt;blockquote class='book-hint '>
&lt;p>&lt;mark>🐛 修正（参见：
&lt;a target="_blank" href="https://github.com/Snailclimb/JavaGuide/issues/544">issue#544&lt;/a>）&lt;/mark>：C&lt;ins>11 开始（2011 年的时候）,C&lt;/ins>就引入了多线程库，在 windows、linux、macos 都可以使用&lt;code>std::thread&lt;/code>和&lt;code>std::async&lt;/code>来创建线程。参考链接：
&lt;a target="_blank" href="http://www.cplusplus.com/reference/thread/thread/?kw=thread">http://www.cplusplus.com/reference/thread/thread/?kw=thread&lt;/a>&lt;/p>&lt;/blockquote>&lt;p>🌈 拓展一下：&lt;/p>
&lt;p>“Write Once, Run Anywhere（一次编写，随处运行）”这句宣传口号，真心经典，流传了好多年！以至于，直到今天，依然有很多人觉得跨平台是 Java 语言最大的优势。实际上，跨平台已经不是 Java 最大的卖点了，各种 JDK 新特性也不是。目前市面上虚拟化技术已经非常成熟，比如你&lt;mark>通过 Docker 就很容易实现跨平台&lt;/mark>了。在我看来，&lt;mark>Java 强大的生态&lt;/mark>才是！&lt;/p>
&lt;h3 id="java-se-vs-java-ee">Java SE vs Java EE&lt;a class="anchor" href="#java-se-vs-java-ee">#&lt;/a>&lt;/h3>
&lt;ul>
&lt;li>Java &lt;mark>SE&lt;/mark>（Java Platform，Standard Edition）: &lt;mark>Java 平台标准版&lt;/mark>，Java 编程语言的基础，它包含了支持 Java 应用程序开发和运行的&lt;mark>核心类库以及虚拟机&lt;/mark>等核心组件。Java SE 可以用于构建&lt;mark>桌面应用程序或简单的服务器&lt;/mark>应用程序。&lt;/li>
&lt;li>Java EE（Java Platform, Enterprise Edition ）：Java 平台企业版，建立在 Java SE 的基础上，包含了支持&lt;mark>企业级应用程序开发和部署的标准和规范&lt;/mark>（比如 &lt;mark>Servlet、JSP、EJB、JDBC、JPA、JTA、JavaMail、JMS&lt;/mark>）。 Java EE 可以用于构建&lt;mark>分布式、可移植、健壮、可伸缩和安全的服务端 Java 应用程序，例如 Web 应用程序&lt;/mark>。&lt;/li>
&lt;/ul>
&lt;p>简单来说，Java SE 是 Java 的基础版本，Java EE 是 Java 的高级版本。Java SE 更适合开发&lt;mark>桌面应用程序或简单的服务器&lt;/mark>应用程序，Java EE 更适合开发&lt;mark>复杂的企业级应用程序或 Web 应用程序&lt;/mark>。&lt;/p></description></item><item><title>Java基础常见面试题总结(下)</title><link>https://blog.liuyi2026.asia/zh/docs/technology/Interview/java/basis/java-basic-questions-03/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.liuyi2026.asia/zh/docs/technology/Interview/java/basis/java-basic-questions-03/</guid><description>&lt;h2 id="异常">异常&lt;a class="anchor" href="#%e5%bc%82%e5%b8%b8">#&lt;/a>&lt;/h2>
&lt;p>&lt;mark>Java 异常类层次结构图概览&lt;/mark>：&lt;/p>
&lt;p>&lt;img src="img/942f855926e30aff652d2169b861401b_MD5.jpg" alt="Java 异常类层次结构图" />&lt;/p>
&lt;h3 id="exception-和-error-有什么区别">Exception 和 Error 有什么区别？&lt;a class="anchor" href="#exception-%e5%92%8c-error-%e6%9c%89%e4%bb%80%e4%b9%88%e5%8c%ba%e5%88%ab">#&lt;/a>&lt;/h3>
&lt;p>在 Java 中，所有的异常都有一个共同的祖先 &lt;code>java.lang&lt;/code> 包中的 &lt;code>Throwable&lt;/code> 类。&lt;code>Throwable&lt;/code> 类有两个重要的子类:&lt;/p>
&lt;ul>
&lt;li>&lt;mark>&lt;code>Exception&lt;/code>&lt;/mark> :程序本身可以处理的异常，可以通过 &lt;code>catch&lt;/code> 来进行捕获。&lt;code>Exception&lt;/code> 又可以分为 Checked Exception (受检查异常，必须处理) 和 Unchecked Exception (不受检查异常，可以不处理)。&lt;/li>
&lt;li>&lt;mark>&lt;code>Error&lt;/code>&lt;/mark>：&lt;code>Error&lt;/code> 属于程序无法处理的错误 ，&lt;del>我们没办法通过 &lt;code>catch&lt;/code> 来进行捕获&lt;/del>不建议通过&lt;code>catch&lt;/code>捕获 。例如 Java 虚拟机运行错误（&lt;code>Virtual MachineError&lt;/code>）、虚拟机内存不够错误(&lt;code>OutOfMemoryError&lt;/code>)、类定义错误（&lt;code>NoClassDefFoundError&lt;/code>）等 。这些异常发生时，Java 虚拟机（JVM）一般会选择线程终止。&lt;/li>
&lt;/ul>
&lt;h3 id="checked-exception-和-unchecked-exception-有什么区别">Checked Exception 和 Unchecked Exception 有什么区别？&lt;a class="anchor" href="#checked-exception-%e5%92%8c-unchecked-exception-%e6%9c%89%e4%bb%80%e4%b9%88%e5%8c%ba%e5%88%ab">#&lt;/a>&lt;/h3>
&lt;p>&lt;mark>Checked Exception&lt;/mark> 即 受检查异常 ，Java 代码在编译过程中，如果受检查异常没有被 &lt;code>catch&lt;/code>或者&lt;code>throws&lt;/code> 关键字处理的话，就没办法通过编译。&lt;/p>
&lt;p>比如下面这段 IO 操作的代码：&lt;/p>
&lt;p>&lt;img src="img/b543eb42c3c240a76795caf829942cb1_MD5.jpg" alt="" />&lt;/p>
&lt;p>除了&lt;code>RuntimeException&lt;/code>及其子类以外，其他的&lt;code>Exception&lt;/code>类及其子类都属于受检查异常 。常见的受检查异常有：IO 相关的异常、&lt;code>ClassNotFoundException&lt;/code>、&lt;code>SQLException&lt;/code>&amp;hellip;。&lt;/p>
&lt;p>&lt;mark>Unchecked Exception&lt;/mark> 即 &lt;mark>不受检查异常&lt;/mark> ，Java 代码在编译过程中 ，我们即使不处理不受检查异常也可以正常通过编译。&lt;/p></description></item><item><title>Java基础常见面试题总结(中)</title><link>https://blog.liuyi2026.asia/zh/docs/technology/Interview/java/basis/java-basic-questions-02/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.liuyi2026.asia/zh/docs/technology/Interview/java/basis/java-basic-questions-02/</guid><description>&lt;h2 id="面向对象基础">面向对象基础&lt;a class="anchor" href="#%e9%9d%a2%e5%90%91%e5%af%b9%e8%b1%a1%e5%9f%ba%e7%a1%80">#&lt;/a>&lt;/h2>
&lt;h3 id="面向对象和面向过程的区别">面向对象和面向过程的区别&lt;a class="anchor" href="#%e9%9d%a2%e5%90%91%e5%af%b9%e8%b1%a1%e5%92%8c%e9%9d%a2%e5%90%91%e8%bf%87%e7%a8%8b%e7%9a%84%e5%8c%ba%e5%88%ab">#&lt;/a>&lt;/h3>
&lt;p>面向过程编程（Procedural-Oriented Programming，POP）和面向对象编程（Object-Oriented Programming，OOP）是两种常见的编程范式，两者的主要区别在于解决问题的方式不同：&lt;/p>
&lt;ul>
&lt;li>&lt;mark>面向过程编程（POP）&lt;/mark>：面向过程把解决问题的过程拆成一个个方法，通过一个个方法的执行解决问题。&lt;/li>
&lt;li>&lt;mark>面向对象编程（OOP）&lt;/mark>：面向对象会先抽象出对象，然后用对象执行方法的方式解决问题。&lt;/li>
&lt;/ul>
&lt;p>相比较于 POP，OOP 开发的程序一般具有下面这些优点：&lt;/p>
&lt;ul>
&lt;li>&lt;mark>易维护&lt;/mark>：由于良好的结构和封装性，OOP 程序通常更容易维护。&lt;/li>
&lt;li>&lt;mark>易复用&lt;/mark>：通过继承和多态，OOP 设计使得代码更具复用性，方便扩展功能。&lt;/li>
&lt;li>&lt;mark>易扩展&lt;/mark>：模块化设计使得系统扩展变得更加容易和灵活。&lt;/li>
&lt;/ul>
&lt;p>POP 的编程方式通常更为简单和直接，适合处理一些较简单的任务。&lt;/p>
&lt;p>POP 和 OOP 的性能差异主要取决于它们的运行机制，而不仅仅是编程范式本身。因此，简单地比较两者的性能是一个常见的误区（相关 issue : 
&lt;a target="_blank" href="https://github.com/Snailclimb/JavaGuide/issues/431">面向过程：面向过程性能比面向对象高？？&lt;/a> ）。&lt;/p>
&lt;p>&lt;img src="img/2c0d720fe57dd4b32b7302a98a93e59c_MD5.jpg" alt="POP 和 OOP 性能比较不合适" />&lt;/p>
&lt;p>在选择编程范式时，性能并不是唯一的考虑因素。代码的可维护性、可扩展性和开发效率同样重要。&lt;/p>
&lt;p>现代编程语言基本都支持多种编程范式，既可以用来进行面向过程编程，也可以进行面向对象编程。&lt;/p>
&lt;p>下面是一个求圆的面积和周长的示例，简单分别展示了面向对象和面向过程两种不同的解决方案。&lt;/p>
&lt;p>&lt;mark>面向对象&lt;/mark>：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-java" data-lang="java">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">class&lt;/span> &lt;span style="color:#a6e22e">Circle&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 定义圆的半径&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">private&lt;/span> &lt;span style="color:#66d9ef">double&lt;/span> radius;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 构造函数&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#a6e22e">Circle&lt;/span>(&lt;span style="color:#66d9ef">double&lt;/span> radius) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">this&lt;/span>.&lt;span style="color:#a6e22e">radius&lt;/span> &lt;span style="color:#f92672">=&lt;/span> radius;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 计算圆的面积&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">double&lt;/span> &lt;span style="color:#a6e22e">getArea&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> Math.&lt;span style="color:#a6e22e">PI&lt;/span> &lt;span style="color:#f92672">*&lt;/span> radius &lt;span style="color:#f92672">*&lt;/span> radius;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 计算圆的周长&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">double&lt;/span> &lt;span style="color:#a6e22e">getPerimeter&lt;/span>() {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> 2 &lt;span style="color:#f92672">*&lt;/span> Math.&lt;span style="color:#a6e22e">PI&lt;/span> &lt;span style="color:#f92672">*&lt;/span> radius;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">public&lt;/span> &lt;span style="color:#66d9ef">static&lt;/span> &lt;span style="color:#66d9ef">void&lt;/span> &lt;span style="color:#a6e22e">main&lt;/span>(String&lt;span style="color:#f92672">[]&lt;/span> args) {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 创建一个半径为3的圆&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> Circle circle &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#66d9ef">new&lt;/span> Circle(3.&lt;span style="color:#a6e22e">0&lt;/span>);
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#75715e">// 输出圆的面积和周长&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;圆的面积为：&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> circle.&lt;span style="color:#a6e22e">getArea&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> System.&lt;span style="color:#a6e22e">out&lt;/span>.&lt;span style="color:#a6e22e">println&lt;/span>(&lt;span style="color:#e6db74">&amp;#34;圆的周长为：&amp;#34;&lt;/span> &lt;span style="color:#f92672">+&lt;/span> circle.&lt;span style="color:#a6e22e">getPerimeter&lt;/span>());
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> }
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>我们定义了一个 &lt;code>Circle&lt;/code> 类来表示圆，该类包含了圆的半径属性和计算面积、周长的方法。&lt;/p></description></item></channel></rss>