<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[前端工程师年薪30万，就靠这套教程！持续更新最新知识]]></title><description><![CDATA[]]></description><link>https://blog.csdn.net/ITHHH111</link><language>zh-cn</language><generator>https://blog.csdn.net/</generator><copyright><![CDATA[Copyright &copy; ITHHH111]]></copyright><item><title><![CDATA[Java入门到架构师知识点整理 | IO | 使用Files]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124497065</link><guid>https://blog.csdn.net/ITHHH111/article/details/124497065</guid><author>ITHHH111</author><pubDate>Fri, 29 Apr 2022 15:27:08 +0800</pubDate><description><![CDATA[从Java 7开始，提供了Files这个工具类，能极大地方便我们读写文件。
虽然Files是java.nio包里面的类，但他俩封装了很多读写文件的简单方法，例如，我们要把一个文件的全部内容读取为一个byte[]，可以这么写：
byte[] data = Files.readAllBytes(Path.of("/path/to/file.txt"));


如果是文本文件，可以把一个文件的全部内容读取为String：
// 默认使用UTF-8编码读取:
String content1 = Files.read]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | IO | PrintStream和PrintWriter]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124497051</link><guid>https://blog.csdn.net/ITHHH111/article/details/124497051</guid><author>ITHHH111</author><pubDate>Fri, 29 Apr 2022 15:26:36 +0800</pubDate><description><![CDATA[PrintStream是一种FilterOutputStream，它在OutputStream的接口上，额外提供了一些写入各种数据类型的方法：

写入int：print(int)
写入boolean：print(boolean)
写入String：print(String)
写入Object：print(Object)，实际上相当于print(object.toString())
…

以及对应的一组println()方法，它会自动加上换行符。
我们经常使用的System.out.println()实际上就]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | IO | Writer]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124497034</link><guid>https://blog.csdn.net/ITHHH111/article/details/124497034</guid><author>ITHHH111</author><pubDate>Fri, 29 Apr 2022 15:26:01 +0800</pubDate><description><![CDATA[Reader是带编码转换器的InputStream，它把byte转换为char，而Writer就是带编码转换器的OutputStream，它把char转换为byte并输出。
Writer和OutputStream的区别如下：




OutputStream
Writer




字节流，以byte为单位
字符流，以char为单位


写入字节（0~255）：void write(int b)
写入字符（0~65535）：void write(int c)


写入字节数组：void write(byte[]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | IO | Reader]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124497001</link><guid>https://blog.csdn.net/ITHHH111/article/details/124497001</guid><author>ITHHH111</author><pubDate>Fri, 29 Apr 2022 15:25:19 +0800</pubDate><description><![CDATA[Reader是Java的IO库提供的另一个输入流接口。和InputStream的区别是，InputStream是一个字节流，即以byte为单位读取，而Reader是一个字符流，即以char为单位读取：




InputStream
Reader




字节流，以byte为单位
字符流，以char为单位


读取字节（-1，0~255）：int read()
读取字符（-1，0~65535）：int read()


读到字节数组：int read(byte[] b)
读到字符数组：int read(ch]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | IO | 序列化]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124496979</link><guid>https://blog.csdn.net/ITHHH111/article/details/124496979</guid><author>ITHHH111</author><pubDate>Fri, 29 Apr 2022 15:24:29 +0800</pubDate><description><![CDATA[序列化是指把一个Java对象变成二进制内容，本质上就是一个byte[]数组。
为什么要把Java对象序列化呢？因为序列化后可以把byte[]保存到文件中，或者把byte[]通过网络传输到远程，这样，就相当于把Java对象存储到文件或者通过网络传输出去了。
有序列化，就有反序列化，即把一个二进制内容（也就是byte[]数组）变回Java对象。有了反序列化，保存到文件中的byte[]数组又可以“变回”Java对象，或者从网络上读取byte[]并把它“变回”Java对象。
我们来看看如何把一个Java对象序列化。]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | IO | 读取classpath资源]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124496959</link><guid>https://blog.csdn.net/ITHHH111/article/details/124496959</guid><author>ITHHH111</author><pubDate>Fri, 29 Apr 2022 15:23:53 +0800</pubDate><description><![CDATA[很多Java程序启动的时候，都需要读取配置文件。例如，从一个.properties文件中读取配置：
String conf = "C:\\conf\\default.properties";
try (InputStream input = new FileInputStream(conf)) {
    // TODO:
}


这段代码要正常执行，必须在C盘创建conf目录，然后在目录里创建default.properties文件。但是，在Linux系统上，路径和Windows的又不一样。
因此，从磁盘]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | IO | 操作Zip]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124496930</link><guid>https://blog.csdn.net/ITHHH111/article/details/124496930</guid><author>ITHHH111</author><pubDate>Fri, 29 Apr 2022 15:23:03 +0800</pubDate><description><![CDATA[ZipInputStream是一种FilterInputStream，它可以直接读取zip包的内容：
┌───────────────────┐
│    InputStream    │
└───────────────────┘
          ▲
          │
┌───────────────────┐
│ FilterInputStream │
└───────────────────┘
          ▲
          │
┌───────────────────┐
│In]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | IO | Filter模式]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124496859</link><guid>https://blog.csdn.net/ITHHH111/article/details/124496859</guid><author>ITHHH111</author><pubDate>Fri, 29 Apr 2022 15:20:30 +0800</pubDate><description><![CDATA[Java的IO标准库提供的InputStream根据来源可以包括：

FileInputStream：从文件读取数据，是最终数据源；
ServletInputStream：从HTTP请求读取数据，是最终数据源；
Socket.getInputStream()：从TCP连接读取数据，是最终数据源；
…

如果我们要给FileInputStream添加缓冲功能，则可以从FileInputStream派生一个类：
BufferedFileInputStream extends FileInputStream


]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | IO | OutputStream]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124496819</link><guid>https://blog.csdn.net/ITHHH111/article/details/124496819</guid><author>ITHHH111</author><pubDate>Fri, 29 Apr 2022 15:19:38 +0800</pubDate><description><![CDATA[和InputStream相反，OutputStream是Java标准库提供的最基本的输出流。
和InputStream类似，OutputStream也是抽象类，它是所有输出流的超类。这个抽象类定义的一个最重要的方法就是void write(int b)，签名如下：
public abstract void write(int b) throws IOException;


这个方法会写入一个字节到输出流。要注意的是，虽然传入的是int参数，但只会写入一个字节，即只写入int最低8位表示字节的部分（相当于b]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | IO | InputStream]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124481311</link><guid>https://blog.csdn.net/ITHHH111/article/details/124481311</guid><author>ITHHH111</author><pubDate>Thu, 28 Apr 2022 19:11:18 +0800</pubDate><description><![CDATA[InputStream就是Java标准库提供的最基本的输入流。它位于java.io这个包里。java.io包提供了所有同步IO的功能。
要特别注意的一点是，InputStream并不是一个接口，而是一个抽象类，它是所有输入流的超类。这个抽象类定义的一个最重要的方法就是int read()，签名如下：
public abstract int read() throws IOException;


这个方法会读取输入流的下一个字节，并返回字节表示的int值（0~255）。如果已读到末尾，返回-1表示不能继续读]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | IO | IO初认识]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124481148</link><guid>https://blog.csdn.net/ITHHH111/article/details/124481148</guid><author>ITHHH111</author><pubDate>Thu, 28 Apr 2022 18:59:42 +0800</pubDate><description><![CDATA[IO是指Input/Output，即输入和输出。以内存为中心：


Input指从外部读入数据到内存，例如，把文件从磁盘读取到内存，从网络读取数据到内存等等。


Output指把数据从内存输出到外部，例如，把数据从内存写入到文件，把数据从内存输出到网络等等。


为什么要把数据读到内存才能处理这些数据？因为代码是在内存中运行的，数据也必须读到内存，最终的表示方式无非是byte数组，字符串等，都必须存放在内存里。
从Java代码来看，输入实际上就是从外部，例如，硬盘上的某个文件，把内容读到内存，并且以Jav]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | 集合 | 使用Collections]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124481113</link><guid>https://blog.csdn.net/ITHHH111/article/details/124481113</guid><author>ITHHH111</author><pubDate>Thu, 28 Apr 2022 18:58:48 +0800</pubDate><description><![CDATA[Collections是JDK提供的工具类，同样位于java.util包中。它提供了一系列静态方法，能更方便地操作各种集合。
注意Collections结尾多了一个s，不是Collection！
我们一般看方法名和参数就可以确认Collections提供的该方法的功能。例如，对于以下静态方法：
public static boolean addAll(Collection&lt;? super T&gt; c, T... elements) { ... }


addAll()方法可以给一个Collecti]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | 集合 | 使用Iterator]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124481096</link><guid>https://blog.csdn.net/ITHHH111/article/details/124481096</guid><author>ITHHH111</author><pubDate>Thu, 28 Apr 2022 18:57:04 +0800</pubDate><description><![CDATA[Java的集合类都可以使用for each循环，List、Set和Queue会迭代每个元素，Map会迭代每个key。以List为例：
List&lt;String&gt; list = List.of("Apple", "Orange", "Pear");
for (String s : list) {
    System.out.println(s);
}


实际上，Java编译器并不知道如何遍历List。上述代码能够编译通过，只是因为编译器把for each循环通过Iterator改写为了普通的fo]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | 集合 | 使用Deque]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124407607</link><guid>https://blog.csdn.net/ITHHH111/article/details/124407607</guid><author>ITHHH111</author><pubDate>Mon, 25 Apr 2022 16:07:14 +0800</pubDate><description><![CDATA[我们知道，Queue是队列，只能一头进，另一头出。
如果把条件放松一下，允许两头都进，两头都出，这种队列叫双端队列（Double Ended Queue），学名Deque。
Java集合提供了接口Deque来实现一个双端队列，它的功能是：

既可以添加到队尾，也可以添加到队首；
既可以从队首获取，又可以从队尾获取。

我们来比较一下Queue和Deque出队和入队的方法：





Queue
Deque




添加元素到队尾
add(E e) / offer(E e)
addLast(E e) / of]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | 集合 | 使用PriorityQueue]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124407589</link><guid>https://blog.csdn.net/ITHHH111/article/details/124407589</guid><author>ITHHH111</author><pubDate>Mon, 25 Apr 2022 16:06:44 +0800</pubDate><description><![CDATA[我们知道，Queue是一个先进先出（FIFO）的队列。
在银行柜台办业务时，我们假设只有一个柜台在办理业务，但是办理业务的人很多，怎么办？
可以每个人先取一个号，例如：A1、A2、A3……然后，按照号码顺序依次办理，实际上这就是一个Queue。
如果这时来了一个VIP客户，他的号码是V1，虽然当前排队的是A10、A11、A12……但是柜台下一个呼叫的客户号码却是V1。
这个时候，我们发现，要实现“VIP插队”的业务，用Queue就不行了，因为Queue会严格按FIFO的原则取出队首元素。我们需要的是优先队列]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | 集合 | 使用Queue]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124407543</link><guid>https://blog.csdn.net/ITHHH111/article/details/124407543</guid><author>ITHHH111</author><pubDate>Mon, 25 Apr 2022 16:05:26 +0800</pubDate><description><![CDATA[队列（Queue）是一种经常使用的集合。Queue实际上是实现了一个先进先出（FIFO：First In First Out）的有序表。它和List的区别在于，List可以在任意位置添加和删除元素，而Queue只有两个操作：

把元素添加到队列末尾；
从队列头部取出元素。

超市的收银台就是一个队列：

在Java的标准库中，队列接口Queue定义了以下几个方法：

int size()：获取队列长度；
boolean add(E)/boolean offer(E)：添加元素到队尾；
E remove()/]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | 集合 | 使用Set]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124407523</link><guid>https://blog.csdn.net/ITHHH111/article/details/124407523</guid><author>ITHHH111</author><pubDate>Mon, 25 Apr 2022 16:04:44 +0800</pubDate><description><![CDATA[我们知道，Map用于存储key-value的映射，对于充当key的对象，是不能重复的，并且，不但需要正确覆写equals()方法，还要正确覆写hashCode()方法。
如果我们只需要存储不重复的key，并不需要存储映射的value，那么就可以使用Set。
Set用于存储不重复的元素集合，它主要提供以下几个方法：

将元素添加进Set&lt;E&gt;：boolean add(E e)
将元素从Set&lt;E&gt;删除：boolean remove(Object e)
判断是否包含元素：boolean ]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | 集合 | 使用Properties]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124407393</link><guid>https://blog.csdn.net/ITHHH111/article/details/124407393</guid><author>ITHHH111</author><pubDate>Mon, 25 Apr 2022 16:04:03 +0800</pubDate><description><![CDATA[在编写应用程序的时候，经常需要读写配置文件。例如，用户的设置：
# 上次最后打开的文件:
last_open_file=/data/hello.txt
# 自动保存文件的时间间隔:
auto_save_interval=60


配置文件的特点是，它的Key-Value一般都是String-String类型的，因此我们完全可以用Map&lt;String, String&gt;来表示它。
因为配置文件非常常用，所以Java集合库提供了一个Properties来表示一组“配置”。由于历史遗留原因，Proper]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | 集合 | 使用TreeMap]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124407365</link><guid>https://blog.csdn.net/ITHHH111/article/details/124407365</guid><author>ITHHH111</author><pubDate>Mon, 25 Apr 2022 15:59:55 +0800</pubDate><description><![CDATA[我们已经知道，HashMap是一种以空间换时间的映射表，它的实现原理决定了内部的Key是无序的，即遍历HashMap的Key时，其顺序是不可预测的（但每个Key都会遍历一次且仅遍历一次）。
还有一种Map，它在内部会对Key进行排序，这种Map就是SortedMap。注意到SortedMap是接口，它的实现类是TreeMap。
       ┌───┐
       │Map│
       └───┘
         ▲
    ┌────┴─────┐
    │          │
┌──────]]></description><category></category></item><item><title><![CDATA[Java入门到架构师知识点整理 | 集合 | 使用EnumMap]]></title><link>https://blog.csdn.net/ITHHH111/article/details/124407343</link><guid>https://blog.csdn.net/ITHHH111/article/details/124407343</guid><author>ITHHH111</author><pubDate>Mon, 25 Apr 2022 15:59:07 +0800</pubDate><description><![CDATA[因为HashMap是一种通过对key计算hashCode()，通过空间换时间的方式，直接定位到value所在的内部数组的索引，因此，查找效率非常高。
如果作为key的对象是enum类型，那么，还可以使用Java集合库提供的一种EnumMap，它在内部以一个非常紧凑的数组存储value，并且根据enum类型的key直接定位到内部数组的索引，并不需要计算hashCode()，不但效率最高，而且没有额外的空间浪费。
我们以DayOfWeek这个枚举类型为例，为它做一个“翻译”功能：
import java.tim]]></description><category></category></item></channel></rss>