Skip to content

Commit

Permalink
feat(all): 完善文章
Browse files Browse the repository at this point in the history
  • Loading branch information
李济芝 committed Dec 22, 2024
1 parent b1a34c8 commit 360481e
Show file tree
Hide file tree
Showing 21 changed files with 182 additions and 119 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,84 +7,93 @@ slug: "interview-junior-javaer"
top: true
---

为方便面试,不至于在网上像一个无头苍蝇乱翻,整理了一篇关于面试的资料。本文几乎涵盖了Java所有的知识点,包括:Java基础、网络与安全、常见框架、分布式服务治理、数据库、算法与数据结构、开发中遇到的一些问题以及一些架构设计方案。
如果全都理解并吸收,相信你能轻松吊打绝大多数面试官。
为方便面试,不至于在网上像一个无头苍蝇乱翻,整理了一系列关于面试的资料。本系列文章几乎涵盖了Java所有的知识点,包括:Java基础、网络与安全、常见框架、分布式服务治理、数据库、算法与数据结构、开发中遇到的一些问题以及一些架构设计方案。 如果全都理解并吸收,相信你能轻松吊打绝大多数面试官。

本文中的面试题更偏向于底层,为方便阅读,在此只简短概述面试题的答案,不做详细解析。
本资料完全公开免费,资料中的面试题,大多为原创,但也有小部分参考于网络,我将尽可能的把问题和答案概括的通俗易懂。
本系列中的面试题更偏向于底层,为方便阅读,在此只简短概述面试题的答案,不做详细解析。 我承诺本资料完全公开免费,资料中的面试题,大多为原创,但也有小部分参考于网络,我将尽可能的把问题和答案概括的通俗易懂。

本人时间精力有限,如有遗漏或错误,欢迎在评论留言补充,我会及时的完善修正。

## Java基础

### 基础汇总
#### 如何复制一个对象
在实际开发中,复制、转换对象是非常常用的操作,如将一个DTO转化成PO,PO转换成VO等
在实际开发过程中,对象的复制与转换是非常常见且重要的操作。这类操作通常出现在不同层之间的数据传递或转换中,例如将数据传输对象(DTO)转换为持久化对象(PO),或是将持久化对象(PO)转化为视图对象(VO)。数据转换有助于隔离各层之间的业务逻辑,避免不同层之间的紧耦合,同时优化代码的可维护性和可扩展性,提升模块或系统之间的数据兼容性

要想复制一个对象,需要实现`Cloneable`接口,然后重写`clone()`方法。至于你想要怎么克隆,是深克隆还是浅克隆,关键是你这个`clone()`方法怎么写。
虽然`Cloneable``clone()`方法在Java中是标准的浅拷贝方式,但它们在实际开发中不太常用。主要是因为使用`clone()`方法来拷贝一个对象即复杂又有风险,它会抛出异常,并且还需要类型转换。
在实际开发中,一般都是使用第三方类库,如`BeanUtils`,不过这种方式大多为浅拷贝。
要想复制一个对象,需要实现`Cloneable`接口,然后重写`clone()`方法。至于你想要怎么克隆,是深克隆还是浅克隆,关键是你这个`clone()`方法怎么写。虽然`Cloneable``clone()`方法在Java中是标准的浅拷贝方式,但它们在实际开发中不太常用。主要是因为使用`clone()`方法来拷贝一个对象即复杂又有风险,它会抛出异常,并且还需要类型转换。

不过面试问这种问题,一般都是在问浅拷贝和深拷贝。
- 浅拷贝创建一个新对象,这个新对象的字段内容与原对象相同,但如果字段是引用类型(比如数组、对象),浅拷贝只复制引用地址,不复制引用的实际对象。
```java
class MyObject implements Cloneable {
int value;
int[] array;

MyObject(int value, int[] array) {
this.value = value;
this.array = array;
}

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // 浅拷贝
}

public static void main(String[] args) {
try {
int[] arr = {1, 2, 3};
MyObject original = new MyObject(42, arr);
MyObject copy = (MyObject) original.clone();
original.array[0] = 99;
System.out.println(copy.array[0]); // 输出 99
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
在实际开发中,对象转换通常依赖于第三方类库(如`BeanUtils`),不过这种方式大多是浅拷贝,适用于简单的属性复制。对于更复杂的需求,常见的转换方式包括手动映射、工具类辅助转换,或使用框架(如`MapStruct``ModelMapper`)来实现自动化处理。手动映射虽然能够提供更细粒度的控制,但在字段较多或逻辑复杂时,可能导致代码冗长且不易维护。自动化框架则能简化转换过程,尤其是在涉及复杂的类型转换、字段过滤或自定义映射规则时,能够有效提升数据转换的准确性与一致性。

不过面试问这种问题,一般都是在问浅拷贝和深拷贝,所以答的时候要从这两方面答。

浅拷贝创建一个新对象,这个新对象的字段内容与原对象相同,当字段是基本数据类型时,值被直接复制;但如果字段是引用类型(如数组或其他对象),则只复制引用地址,而不会复制实际的引用对象。
- 对于基本数据类型字段,浅拷贝会将值从原对象复制到新对象。
- 对于引用类型字段,浅拷贝只复制引用地址,因此原对象和新对象的引用类型字段会指向同一个内存地址,修改其中一个对象的引用类型字段内容会影响另一个对象。

浅拷贝举例:
```java
class MyObject implements Cloneable {
int value;
int[] array;

MyObject(int value, int[] array) {
this.value = value;
this.array = array;
}
```
- 深拷贝创建一个新对象,这个新对象和原对象完全独立,包括复制所有引用类型字段的实际对象,而不仅仅是引用地址。
```java
class MyObject implements Cloneable {
int value;
int[] array;

MyObject(int value, int[] array) {
this.value = value;
this.array = array;
}

@Override
protected MyObject clone() throws CloneNotSupportedException {
int[] arrayCopy = array.clone(); // 复制数组
return new MyObject(value, arrayCopy);

@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // 浅拷贝
}

public static void main(String[] args) {
try {
int[] arr = {1, 2, 3};
MyObject original = new MyObject(42, arr);
MyObject copy = (MyObject) original.clone();
original.array[0] = 99;
System.out.println(copy.array[0]); // 输出 99
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}

public static void main(String[] args) {
try {
int[] arr = {1, 2, 3};
MyObject original = new MyObject(42, arr);
MyObject copy = original.clone();
original.array[0] = 99;
System.out.println(copy.array[0]); // 输出 1
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
}
```

深拷贝是创建一个新对象,该新对象与原对象完全独立。它不仅复制原对象的基本数据类型字段,还递归地复制所有引用类型字段所指向的实际对象,而不是仅复制引用地址。这意味着,深拷贝后的对象和原对象在内存中完全隔离,修改其中一个对象的字段不会影响另一个对象。
- 复制基本类型字段:和浅拷贝一样,深拷贝会复制原对象中所有的基本数据类型字段(如 int、char 等)的值。
- 递归复制引用类型字段:对于引用类型字段(如对象、数组、集合等),深拷贝会递归地创建新的对象,而不仅仅是复制引用地址。这样两个对象的引用类型字段指向不同的内存地址,它们的数据完全独立。
- 完全独立的副本:经过深拷贝后,原对象和新对象在内存中完全独立,修改其中一个对象的内容不会影响另一个对象,避免了引用类型字段的共享问题。

深拷贝举例:
```java
class MyObject implements Cloneable {
int value;
int[] array;

MyObject(int value, int[] array) {
this.value = value;
this.array = array;
}

@Override
protected MyObject clone() throws CloneNotSupportedException {
int[] arrayCopy = array.clone(); // 复制数组
return new MyObject(value, arrayCopy);
}

public static void main(String[] args) {
try {
int[] arr = {1, 2, 3};
MyObject original = new MyObject(42, arr);
MyObject copy = original.clone();
original.array[0] = 99;
System.out.println(copy.array[0]); // 输出 1
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
}
```
}
```

#### String类为什么设计成不可变的
面试问这个问题,可以从`String`类的优点这个思路回答。
Expand Down
2 changes: 1 addition & 1 deletion blog-site/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ <h1>

<div class="post animated fadeInDown">
<div class="post_title">
<h2><a href='/iblog/posts/java/javaessay/net-program-java/'>网络编程</a></h2>
<h2><a href='/iblog/posts/java/javaessay/net-program-java/'>网络与安全</a></h2>
</div>

<div class="list">
Expand Down
4 changes: 2 additions & 2 deletions blog-site/public/index.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<lastBuildDate>Sun, 24 Nov 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/iblog/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>网络编程</title>
<title>网络与安全</title>
<link>http://localhost:1313/iblog/posts/java/javaessay/net-program-java/</link>
<pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/iblog/posts/java/javaessay/net-program-java/</guid>
Expand Down Expand Up @@ -139,7 +139,7 @@
<link>http://localhost:1313/iblog/posts/java/keepupd/interview-junior-javaer/</link>
<pubDate>Mon, 17 Jun 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/iblog/posts/java/keepupd/interview-junior-javaer/</guid>
<description>为方便面试,不至于在网上像一个无头苍蝇乱翻,整理了一篇关于面试的资料。本文几乎涵盖了Java所有的知识点,包括:Java基础、网络与安全、常见框架、分布式服务治</description>
<description>为方便面试,不至于在网上像一个无头苍蝇乱翻,整理了一系列关于面试的资料。本系列文章几乎涵盖了Java所有的知识点,包括:Java基础、网络与安全、常见框架、分布</description>
</item>
<item>
<title>MySQL详解</title>
Expand Down
2 changes: 1 addition & 1 deletion blog-site/public/page/2/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ <h2><a href='/iblog/posts/java/keepupd/interview-junior-javaer/'>速览Java程

<div class="list">
<div class="post_content markdown">
<p>为方便面试,不至于在网上像一个无头苍蝇乱翻,整理了一篇关于面试的资料。本文几乎涵盖了Java所有的知识点,包括:Java基础、网络与安全、常见框架、分布式服务治......</p>
<p>为方便面试,不至于在网上像一个无头苍蝇乱翻,整理了一系列关于面试的资料。本系列文章几乎涵盖了Java所有的知识点,包括:Java基础、网络与安全、常见框架、分布......</p>
</div>
</div>

Expand Down
2 changes: 1 addition & 1 deletion blog-site/public/posts/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ <h1>

<div class="listing_item">
<div class="listing_post">
<a href="/iblog/posts/java/javaessay/net-program-java/">网络编程</a>
<a href="/iblog/posts/java/javaessay/net-program-java/">网络与安全</a>
<div class="post_time"><span class="date">11-24</span></div>
</div>
</div>
Expand Down
4 changes: 2 additions & 2 deletions blog-site/public/posts/index.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<lastBuildDate>Sun, 24 Nov 2024 00:00:00 +0000</lastBuildDate>
<atom:link href="http://localhost:1313/iblog/posts/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>网络编程</title>
<title>网络与安全</title>
<link>http://localhost:1313/iblog/posts/java/javaessay/net-program-java/</link>
<pubDate>Sun, 24 Nov 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/iblog/posts/java/javaessay/net-program-java/</guid>
Expand Down Expand Up @@ -139,7 +139,7 @@
<link>http://localhost:1313/iblog/posts/java/keepupd/interview-junior-javaer/</link>
<pubDate>Mon, 17 Jun 2024 00:00:00 +0000</pubDate>
<guid>http://localhost:1313/iblog/posts/java/keepupd/interview-junior-javaer/</guid>
<description>为方便面试,不至于在网上像一个无头苍蝇乱翻,整理了一篇关于面试的资料。本文几乎涵盖了Java所有的知识点,包括:Java基础、网络与安全、常见框架、分布式服务治</description>
<description>为方便面试,不至于在网上像一个无头苍蝇乱翻,整理了一系列关于面试的资料。本系列文章几乎涵盖了Java所有的知识点,包括:Java基础、网络与安全、常见框架、分布</description>
</item>
<item>
<title>MySQL详解</title>
Expand Down
52 changes: 49 additions & 3 deletions blog-site/public/posts/java/javaessay/net-program-java/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@



<title>网络编程 | 脚踏实地</title>
<title>网络与安全 | 脚踏实地</title>



Expand Down Expand Up @@ -390,6 +390,34 @@



<ul class="nav">

<ul class="nav">

<ul class="nav">


<li class="nav-item">
<a class="nav-link text-left" href="#%e6%94%be%e7%81%ab%e5%a2%99">
放火墙
</a>
</li>


</ul>

</ul>

</ul>









<ul class="nav">

<ul class="nav">
Expand Down Expand Up @@ -533,7 +561,7 @@ <h1>
<div class="post_page">
<div class="post animate__animated animate__fadeInDown">
<div class="post_title post_detail_title">
<h2 id="post_single_title">网络编程</h2>
<h2 id="post_single_title">网络与安全</h2>
<span id="post_page_title_date" class="date">2024.11.24</span>

<span id="busuanzi_container_page_pv" class="m-l-10">
Expand Down Expand Up @@ -882,7 +910,25 @@ <h3 id="常见网络攻击及防护">常见网络攻击及防护</h3>
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">fileType</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="s">&#34;image/jpeg&#34;</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="o">!</span><span class="n">fileType</span><span class="p">.</span><span class="na">equals</span><span class="p">(</span><span class="s">&#34;image/png&#34;</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Exception</span><span class="p">(</span><span class="s">&#34;Invalid file type.&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><h3 id="网络加密技术">网络加密技术</h3>
</span></span></span></code></pre></div><h3 id="放火墙">放火墙</h3>
<p>防火墙是一种用于保护计算机网络的安全设备,通过对进出网络的流量进行监控和控制来防止未经授权的访问或恶意攻击。</p>
<p>工作流程:</p>
<ol>
<li>当外部或内部请求数据包进入防火墙时,防火墙会根据预定义的规则对数据包进行检查。</li>
<li>防火墙会评估数据包的各个字段(如源IP、目标IP、端口号、协议等),判断数据包是否符合安全规则。</li>
<li>根据判断结果,防火墙决定允许、拒绝或进一步处理数据包。</li>
<li>对于符合规则的数据包,防火墙将其转发到目标设备或服务。对于不符合规则的数据包,防火墙会阻止其进入或离开网络。</li>
</ol>
<p>工作原理:</p>
<ol>
<li>数据包过滤: 防火墙首先会检查网络中的数据包,基于预设的规则(如IP地址、端口号、协议类型等)决定是否允许这些数据包通过。例如,防火墙可能允许来自某个IP地址的流量,但拒绝来自其他地址的流量。</li>
<li>状态检测: 在基本的数据包过滤的基础上,防火墙会使用状态检测技术,跟踪每个连接的状态(如TCP连接的三次握手过程)。这使得防火墙能够判断数据包是否属于已建立的合法连接,并允许合法的流量通过,同时阻止伪造的连接。</li>
<li>代理服务: 在代理模式下,防火墙充当网络请求和响应之间的中介。客户端发出的请求首先到达防火墙,防火墙代理请求并代表客户端发送到目标服务器。通过这种方式,防火墙能够隐藏内部网络的真实IP地址,从而增加系统的安全性。</li>
<li>网络地址转换(NAT): 防火墙还可以执行NAT功能,将内部网络的私有IP地址转换为公共IP地址。这样,外部网络只能看到防火墙的IP地址,而无法直接访问内部网络的设备,增强了网络的隐蔽性和安全性。</li>
<li>入侵检测与防御: 一些高级防火墙具备入侵检测和防御功能,可以实时监测网络流量,识别潜在的攻击或异常行为,并采取相应的防御措施,如阻断可疑流量或报警。</li>
<li>访问控制策略: 防火墙根据事先定义的访问控制列表(ACL)进行工作,规则可能包括允许或拒绝某些IP地址、端口、协议的流量。这些控制策略帮助管理员制定精细的流量过滤和访问管理策略。</li>
</ol>
<h3 id="网络加密技术">网络加密技术</h3>
<p>网络加密技术是为了保证网络中传输的数据的安全性,防止数据在传输过程中被窃取、篡改或伪造。加密技术主要通过将明文数据转化为密文,使得即便数据被截获,也无法被未经授权的第三方读取或理解。网络加密技术广泛应用于网络通信协议、数据存储和身份验证等多个领域。</p>
<table>
<thead>
Expand Down
Loading

0 comments on commit 360481e

Please sign in to comment.