-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
348 lines (167 loc) · 257 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>Java 面试题精选(持续更新)</title>
<link href="/2023/09/25/JavaQuestions/"/>
<url>/2023/09/25/JavaQuestions/</url>
<content type="html"><![CDATA[<h1 id="Java-面试题精选"><a href="#Java-面试题精选" class="headerlink" title="Java 面试题精选"></a>Java 面试题精选</h1><h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><p>在这篇博客中,我汇总了一些常见的Java面试题以及它们的答案。这些问题涵盖了Java编程的各个方面,如果有错误欢迎在评论区指出。</p><h1 id="JavaOOP基础"><a href="#JavaOOP基础" class="headerlink" title="JavaOOP基础"></a>JavaOOP基础</h1><details class="folding-tag" blue><summary> 1、什么是B/S架构?什么是C/S架构? </summary> <div class='content'> <p>B/S(Browser/Server),浏览器/服务器程序,Web应用<br>C/S(Client/Server),客户端/服务端,桌面应用程序</p> </div> </details><details class="folding-tag" blue><summary> 2、Java都有那些开发平台? </summary> <div class='content'> <ol><li>JAVASE:主要用在客户端开发</li><li>JAVAEE:主要用在web应用程序开发</li><li>JAVAME:主要用在嵌入式应用程序开发</li></ol> </div> </details><details class="folding-tag" blue><summary> 3、什么是JDK?什么是JRE? </summary> <div class='content'> <p>JDK:java development kit,java开发工具包,是开发人员所需要安装的环境<br>JRE:java runtime environment,java运行环境,java程序运行所需要安装的环境</p> </div> </details><details class="folding-tag" blue><summary> 4、面向对象和面向过程的区别 </summary> <div class='content'> <p>面向过程:强调功能行为,使用函数(方法)一步一步实现<br>面向对象:强调具备某种功能的对象,更加符合常规思维方式</p> </div> </details><details class="folding-tag" blue><summary> 5、Java的数据结构有哪些? </summary> <div class='content'> <ol><li>线性表(ArrayList)</li><li>链表(LinkedList)</li><li>栈(Stack)</li><li>队列(Queue)</li><li>图(Map)</li><li>树(Tree)</li></ol> </div> </details><details class="folding-tag" blue><summary> 6、类与对象的关系? </summary> <div class='content'> <p>类是对象的抽象,对象是类的具体,类是对象的模板,对象是类的实例。</p> </div> </details><details class="folding-tag" blue><summary> 7、Java中有几种基本数据类型 </summary> <div class='content'> <ol><li>整形:byte, short, int, long</li><li>浮点型:float, double</li><li>字符型:char</li><li>布尔型:boolean</li></ol> </div> </details><details class="folding-tag" blue><summary> 8、标识符的命名规则 </summary> <div class='content'> <ul><li>标识符可以包含英文字母、0-9的数字、$和_</li><li>标识符不能以数字开头</li><li>标识符不能是关键字</li><li>命名规范:类名大驼峰,变量名和方法名小驼峰</li></ul> </div> </details><details class="folding-tag" blue><summary> 9、instanceof 关键字的作用 </summary> <div class='content'> <p>instanceof用于测试一个对象是否为一个类的实例。</p> </div> </details><details class="folding-tag" blue><summary> 10、什么是隐式转换,什么是显式转换 </summary> <div class='content'> <ul><li>隐式转换是大范围的变量接受小范围的数据</li><li>显式转换是强制类型转换,将大类型的数据赋值给小类型的数据</li></ul> </div> </details><details class="folding-tag" blue><summary> 11、char类型能不能转成int类型?能不能转化成String类型,能不能转成double类型? </summary> <div class='content'> <p>char类型可以隐式转换成int和double类型,但不能隐式转换成String类型。</p> </div> </details><details class="folding-tag" blue><summary> 12、什么是拆装箱? </summary> <div class='content'> <p>装箱是将基本数据类型转换为包装器类型,拆箱是将包装器类型转换为基本数据类型。</p> </div> </details><details class="folding-tag" blue><summary> 13、Java中的包装类都有哪些? </summary> <div class='content'> <ul><li>byte: Byte</li><li>short: Short</li><li>int: Integer</li><li>long: Long</li><li>float: Float</li><li>double: Double</li><li>char: Character</li><li>boolean: Boolean</li></ul> </div> </details><details class="folding-tag" blue><summary> 14、一个java类中包含哪些内容? </summary> <div class='content'> <p>一个Java类包括属性、方法、内部类、构造方法和代码块。</p> </div> </details><details class="folding-tag" blue><summary> 15、如何解决浮点型数据运算出现的误差? </summary> <div class='content'> <p>可以使用BigDecimal类进行浮点型数据的运算。</p> </div> </details><details class="folding-tag" blue><summary> 16、面向对象的特征有哪些方面? </summary> <div class='content'> <p>面向对象的特征包括继承、封装、多态性和抽象。</p> </div> </details><details class="folding-tag" red><summary> 17、访问修饰符 public </summary> <div class='content'> <div class="table-container"><table><thead><tr><th><strong>修饰符</strong></th><th><strong>当前类</strong></th><th><strong>同 包</strong></th><th><strong>子 类</strong></th><th><strong>其他包</strong></th></tr></thead><tbody><tr><td>public</td><td>能</td><td>能</td><td>能</td><td>能</td></tr><tr><td>protected</td><td>能</td><td>能</td><td>能</td><td>不能</td></tr><tr><td>default</td><td>能</td><td>能</td><td>不能</td><td>不能</td></tr><tr><td>private</td><td>能</td><td>不能</td><td>不能</td><td>不能</td></tr></tbody></table></div><p> 类的成员不写访问修饰时默认为 default。默认对于同一个包中的其他类相当于公 开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私 有。Java 中,外部类的修饰符只能是 public 或默认,类的成员(包括内部类)的 修饰符可以是以上四种。</p> </div> </details><details class="folding-tag" blue><summary> 18、String是基本数据类型吗? </summary> <div class='content'> <p>不是。Java 中的基本数据类型只有 8 个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(reference type),Java 5 以后引入的枚举类型也算是一种比较特殊的引用类型。</p> </div> </details><details class="folding-tag" blue><summary> 19、float f=3.4;是否正确? </summary> <div class='content'> <p>不正确。3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换 float f =(float)3.4; 或者写成 float f =3.4F;。</p> </div> </details><details class="folding-tag" blue><summary> 20、short s1 =1; s1=s1+1;有错吗? short s1 =1; s1+=1;有错吗? </summary> <div class='content'> <p>对于 short s1 = 1; s1 = s1 + 1; 由于1是int类型,因此 s1+1 运算结果也是 int 型,需要强制转换类型才能赋值给short 型。而 short s1 = 1; s1 += 1; 可以正确编译,因为 s1 += 1; 相当于 s1 = (short)(s1 +1); 其中有隐含的强制类型转换。</p> </div> </details><details class="folding-tag" blue><summary> 21、重载和重写的区别 </summary> <div class='content'> <p>重写(Override)</p><p>从字面上看,重写就是重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动地继承父类中的某个方法,所以在方法名、参数列表、返回类型(除非子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下,对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。</p><p>重载(Overload)</p><p>在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。</p> </div> </details><details class="folding-tag" blue><summary> 22、equals与==的区别 </summary> <div class='content'> <p>==:</p><p>比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指向同一个对象。比较的是真正意义上的指针操作。</p><p>equals:</p><p>equals 用来比较的是两个对象的内容是否相等,由于所有的类都是继承自 java.lang.Object 类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是 Object 类中的方法,而 Object 中的 equals 方法返回的却是 == 的判断。</p> </div> </details><details class="folding-tag" blue><summary> 23、++i与i++的区别 </summary> <div class='content'> <p>i++:先赋值,后计算</p><p>++i:先计算,后赋值</p> </div> </details><details class="folding-tag" blue><summary> 24、程序的结构有那些? </summary> <div class='content'> <p>程序的结构包括:</p><p>顺序结构<br>选择结构<br>循环结构</p> </div> </details><details class="folding-tag" blue><summary> 25、数组实例化有几种方式? </summary> <div class='content'> <p>静态实例化:创建数组的时候已经指定数组中的元素,</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> [] a= <span class="keyword">new</span> <span class="title class_">int</span>[]{ <span class="number">1</span> , <span class="number">3</span> , <span class="number">3</span>};</span><br></pre></td></tr></table></figure><p>动态实例化:实例化数组的时候,只指定了数组长度,数组中所有元素都是数组类型的默认值</p> </div> </details><details class="folding-tag" blue><summary> 26、Java中各种数据默认值 </summary> <div class='content'> <p>byte, short, int, long 默认都是0</p><p>boolean 默认值是false</p><p>char 类型的默认值是’ ‘</p><p>float 与 double 类型的默认值是0.0</p><p>对象类型的默认值是null</p> </div> </details><details class="folding-tag" blue><summary> 27、Java常用包有那些? </summary> <div class='content'> <p>Java.lang</p><p>Java.io</p><p>Java.sql</p><p>Java.util</p><p>Copy code<br>java.util.concurrent</p> </div> </details><details class="folding-tag" blue><summary> 28、Object类常用方法有那些? </summary> <div class='content'> <p>equals</p><p>hashCode</p><p>toString</p><p>wait</p><p>notify</p><p>clone</p> </div> </details><details class="folding-tag" blue><summary> 29、java中有没有指针? </summary> <div class='content'> <p>有指针,但是隐藏了,开发人员无法直接操作指针,由jvm来操作指针</p> </div> </details><details class="folding-tag" blue><summary> 30、java中是值传递还是引用传递? </summary> <div class='content'> <p>理论上说,java都是引用传递,对于基本数据类型,传递的是值的副本,而不是值本身。对于对象类型,传递的是对象的引用,当在一个方法操作参数的时候,其实操作的是引用所指向的对象。</p> </div> </details><details class="folding-tag" blue><summary> 31、实例化数组后,能不能改变数组长度呢? </summary> <div class='content'> <p>不能,数组一旦实例化,它的长度就是固定的</p> </div> </details><details class="folding-tag" red><summary> 32、假设数组内有5个元素,如果对数组进行反序,该如何做? </summary> <div class='content'> <p>下面示例演示了不同的方法来反序整数数组。你可以根据需要选择其中之一。在使用 Collections.reverse() 或流的方法时,注意数组类型需要是对象类型(如Integer)而不是基本数据类型(如int)。</p><div class="tabs" id="test1"><ul class="nav-tabs"><button type="button" class="tab active" data-href="test1-1">循环</button><button type="button" class="tab " data-href="test1-2">Collections.reverse()方法(适用于数组列表)</button><button type="button" class="tab " data-href="test1-3">Java 8的流和Arrays.stream()方法</button></ul><div class="tab-contents"><div class="tab-item-content active" id="test1-1"><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">reverseArray</span><span class="params">(<span class="type">int</span>[] arr)</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> arr.length;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < n / <span class="number">2</span>; i++) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">temp</span> <span class="operator">=</span> arr[i];</span><br><span class="line"> arr[i] = arr[n - i - <span class="number">1</span>];</span><br><span class="line"> arr[n - i - <span class="number">1</span>] = temp;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></div><div class="tab-item-content" id="test1-2"><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="keyword">import</span> java.util.Collections;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">reverseArray</span><span class="params">(Integer[] arr)</span> {</span><br><span class="line"> List<Integer> list = Arrays.asList(arr);</span><br><span class="line"> Collections.reverse(list);</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></div><div class="tab-item-content" id="test1-3"><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">reverseArray</span><span class="params">(<span class="type">int</span>[] arr)</span> {</span><br><span class="line"> <span class="type">int</span>[] reversed = Arrays.stream(arr)</span><br><span class="line"> .boxed()</span><br><span class="line"> .sorted(Collections.reverseOrder())</span><br><span class="line"> .mapToInt(Integer::intValue)</span><br><span class="line"> .toArray();</span><br><span class="line"> System.arraycopy(reversed, <span class="number">0</span>, arr, <span class="number">0</span>, arr.length);</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div> </div> </details><details class="folding-tag" blue><summary> 33、形参与实参区别 </summary> <div class='content'> <p>实参(argument):</p><p>全称为”实际参数”是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。</p><p>形参(parameter):</p><p>全称为”形式参数” 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意 实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。</p><p>形参出现在函数定义中,在整个函数体内都可以使用, 离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。</p><p>形参和实参的功能是作数据传送。发生函数调用时, 主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。</p><p>1.形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。</p><p>2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。</p><p>3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。</p><p>4.函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。</p><p>5.当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同 的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。</p><p>而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使 用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。</p> </div> </details><details class="folding-tag" blue><summary> 35、构造方法能不能显式调用? </summary> <div class='content'> <p>不能,构造方法当成普通方法调用,只有在创建对象的时候它才会被系统调用。</p> </div> </details><details class="folding-tag" blue><summary> 36、什么是方法重载? </summary> <div class='content'> <p>方法的重载就是在同一个类中允许同时存在一个以上的同名方法,只要它们的参数个数或者类型不同即可。在这种情况下,该方法就叫被重载了,这个过程称为方法的重载(override)</p> </div> </details><details class="folding-tag" blue><summary> 37、构造方法能不能重写?能不能重载? </summary> <div class='content'> <p>可以重载。构造器不能被继承,因此不能被重写。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">* 是否能被继承?</span><br><span class="line">* <span class="number">1.</span>成员变量、成员方法 可以继承</span><br><span class="line">* <span class="number">2.</span>私有的属性 可以继承</span><br><span class="line">* <span class="number">3.</span>静态的成员 不可以继承,静态成员是所有实例共享</span><br><span class="line">* <span class="number">4.</span>构造方法 不可以继承</span><br><span class="line">*</span><br><span class="line">* 是否能进行方法重写?</span><br><span class="line">* <span class="number">1.</span>成员变量不存在重写的问题</span><br><span class="line">* <span class="number">2.</span>构造方法 不可以重写</span><br><span class="line">* <span class="number">3.</span>静态方法 不可以重写</span><br><span class="line">* <span class="number">4.</span>私有方法 不可以重写</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" blue><summary> 38、内部类与静态内部类的区别? </summary> <div class='content'> <p>静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中变量、方法。如果要访 问的话,必须要new一个外部类的对象,使用new出来的对象来访问。但是可以直接访问静态的变量、 调用静态的方法;</p><p>普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法。</p><p>如果外部类要访问内部类的属性或者调用内部类的方法,必须要创建一个内部类的对象,使用该对象访问属性或者调用方法。</p><p>如果其他的类要访问普通内部类的属性或者调用普通内部类的方法,必须要在外部类中创建一个普通内部类的对象作为一个属性,外同类可以通过该属性调用普通内部类的方法或者访问普通内部类的属性</p><p>如果其他的类要访问静态内部类的属性或者调用静态内部类的方法,直接创建一个静态内部类对象即可。</p> </div> </details><details class="folding-tag" blue><summary> 39、static关键字有什么作用? </summary> <div class='content'> <p>static关键字有以下作用:</p><ol><li>修饰静态内部类、静态方法、静态变量、静态代码块。</li><li>静态方法属于类而不是实例,可以直接使用类名来调用,不依赖于对象。</li><li>静态变量是类级别的变量,所有实例共享同一个静态变量的值。</li><li>静态代码块用于类的初始化,只会在类加载时执行一次。</li></ol> </div> </details><details class="folding-tag" red><summary> 40、final在java中的作用,有哪些用法? </summary> <div class='content'> <ol><li><p>被final修饰的类不可以被继承</p></li><li><p>被final修饰的方法不可以被重写</p></li><li><p>被final修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.</p></li><li><p>被final修饰的方法,JVM会尝试将其内联,以提高运行效率</p></li><li><p>被final修饰的常量,在编译阶段会存入常量池中.</p></li></ol><p>除此之外,编译器对final域要遵守的两个重排序规则:(重排:编译器的特点)</p><p>1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序.</p><p>(创建final修饰的引用时,一定是先在堆内存中创建对象,后再将引用指向,确保这个引用一定有值。)</p><p>2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序.</p> </div> </details><details class="folding-tag" red><summary> 41、String、StringBuffer 和 StringBuilder 的区别是什么? </summary> <div class='content'> <p> String是只读字符串,它并不是基本数据类型,而是一个对象。从底层源码来看是一个final类型的字符数组,所引用的字符串不能被改变,一经定义,无法再增删改。每次对String的操作都会生成新的String对象。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">final</span> <span class="type">char</span> value[];</span><br></pre></td></tr></table></figure><p> 每次+操作 : 隐式在堆上new了一个跟原字符串相同的StringBuilder对象,再调用append方法拼接+后面的字符。 </p><p> StringBuffer与StringBuilder都继承了AbstractStringBuilder类,而AbtractStringBuilder又实现了CharSequence接口,两个类都是用来进行字符串操作的。在做字符串拼接修改删除替换时,效率比String更高。</p><p> StringBuffer是线程安全的,StringBuilder是非线程安全的。所以StringBuilder比StringBuffer效率更高,StringBuffer的方法大多都加了synchronized关键字。</p> </div> </details><details class="folding-tag" blue><summary> 42、String str=”aaa”与String str=new String(“aaa”)一样吗? </summary> <div class='content'> <p>不一样,前者会在字符串常量池中创建对象;后者会在堆内存中创建对象。</p> </div> </details><details class="folding-tag" blue><summary> 43、讲下java中的Math类有那些常用方法? </summary> <div class='content'> <p><strong>pow()</strong>:幂运算 </p><p><strong>sqrt()</strong>:平方根 </p><p><strong>round()</strong>:四舍五入 </p><p><strong>abs()</strong>:求绝对值 </p><p><strong>random()</strong>:生成一个0-1的随机数,包括0不包括1</p> </div> </details><details class="folding-tag" red><summary> 44、String类的常用方法有那些? </summary> <div class='content'> <p><strong>charAt()</strong>:返回指定索引处的字符 </p><p><strong>indexOf()</strong>:返回指定字符的索引 </p><p><strong>replace()</strong>:字符串替换 </p><p><strong>trim()</strong>:去除字符串两端空白 </p><p><strong>split()</strong>:分割字符串,返回一个分割后的字符串数组 </p><p><strong>getBytes()</strong>:返回字符串的byte类型数组 </p><p><strong>length()</strong>:返回字符串长度 </p><p><strong>toLowerCase()</strong>:将字符串转成小写字母 </p><p><strong>toUpperCase()</strong>:将字符串转成大写字符 </p><p><strong>substring()</strong>:截取字符串 </p><p><strong>format()</strong>:格式化字符串 </p><p><strong>equals()</strong>:字符串比较</p> </div> </details><details class="folding-tag" blue><summary> 45、Java中的继承是单继承还是多继承 </summary> <div class='content'> <p>Java中既有单继承,又有多继承。对于java类来说只能有一个父类,对于接口来说可以同时继承多个接口</p> </div> </details><details class="folding-tag" blue><summary> 46、super与this表示什么? </summary> <div class='content'> <p>super表示当前类的父类引用 </p><p>this表示当前类的对象</p> </div> </details><details class="folding-tag" blue><summary> 47、普通类与抽象类有什么区别? </summary> <div class='content'> <p>普通类不能包含抽象方法,抽象类可以包含抽象方法 抽象类不能直接实例化,普通类可以直接实例化</p> </div> </details><details class="folding-tag" blue><summary> 48、什么是接口?为什么需要接口? </summary> <div class='content'> <p>接口就是某个事物对外提供的一些功能的声明,是一种特殊的java类,接口弥补了java单继承的缺点</p> </div> </details><details class="folding-tag" blue><summary> 49、接口有什么特点? </summary> <div class='content'> <p>接口中声明全是public static final修饰的常量 接口中所有方法都是抽象方法 接口是没有构造方法的 接口也不能直接实例化 接口可以多继承</p> </div> </details><details class="folding-tag" blue><summary> 50、抽象类和接口的区别?== </summary> <div class='content'> <p>抽象类:</p><p>1.抽象方法,只有行为的概念,没有具体的行为实现。使用abstract关键字修饰,没有方法体。子类必须重写这些抽象方法。</p><p>2.包含抽象方法的类,一定是抽象类。</p><p>3.抽象类只能被继承,一个类只能继承一个抽象类。</p><p>接口:</p><p>1.全部的方法都是抽象方法,属性都是常量</p><p>2.不能实例化,可以定义变量。</p><p>3.接口变量可以引用具体实现类的实例</p><p>4.接口只能被实现,一个具体类实现接口,必须实现全部的抽象方法</p><p>5.接口之间可以多实现</p><p>6.一个具体类可以实现多个接口,实现多继承现象</p><p>7.JDK1.8 后,可以有默认方法和默认方法</p> </div> </details><details class="folding-tag" blue><summary> 51、hashCode的作用 </summary> <div class='content'> <p> java的集合有两类,一类是List,还有一类是Set。前者有序可重复,后者无序不重复。当我们在set中插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样的方法就会比较麻烦。</p><p> 于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域。</p><p> hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。</p> </div> </details><details class="folding-tag" green><summary> 52、Java的四种引用,强弱软虚(了解) </summary> <div class='content'> <p><strong>强引用</strong></p><p>强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">String</span> <span class="variable">str</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">String</span>(<span class="string">"str"</span>);</span><br></pre></td></tr></table></figure><p><strong>软引用</strong></p><p>软引用在程序内存不足时,会被回收,使用方式:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 注意:wrf这个引用也是强引用,它是指向SoftReference这个对象的,这里的软引用指的是指向new String("str")的引用,也就是SoftReference类中T </span></span><br><span class="line">SoftReference<String> wrf = <span class="keyword">new</span> <span class="title class_">SoftReference</span><String>(<span class="keyword">new</span> <span class="title class_">String</span>(<span class="string">"str"</span>));</span><br></pre></td></tr></table></figure><p><strong>可用场景:</strong>创建缓存的时候,创建的对象放进缓存中,当内存不足时,JVM就会回收早先创建的对象。</p><p><strong>弱引用</strong></p><p>弱引用就是只要JVM垃圾回收器发现了它,就会将之回收,使用方式:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">WeakReference<String>wrf = <span class="keyword">new</span> <span class="title class_">WeakReference</span><String>(str);</span><br></pre></td></tr></table></figure><p><strong>可用场景:</strong>Java源码中的java.util.WeakHashMap中的key就是使用弱引用,我的理解就是, 一旦我不需要某个引用,JVM会自动帮我处理它,这样我就不需要做其它操作。</p><p><strong>虚引用</strong></p><p>虚引用的回收机制跟弱引用差不多,但是它被回收之前,会被放入ReferenceQueue中。注意哦,其它引用是被JVM回收后才被传入ReferenceQueue中的。由于这个机制,所以虚引用大多被用于引用销毁前的处理工作。还有就是,虚引用创建的时候,必须带有ReferenceQueue使用。</p><p>例子:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">PhantomReference<String> prf</span><br><span class="line"> =<span class="keyword">new</span> <span class="title class_">PhantomReference</span><String>(<span class="keyword">new</span> <span class="title class_">String</span>(<span class="string">"str"</span>),<span class="keyword">new</span> <span class="title class_">ReferenceQueue</span><>());</span><br></pre></td></tr></table></figure><p><strong>可用场景:</strong> 对象销毁前的一些操作,比如说资源释放等。Object.finalize() 虽然也可以做这类动作, 但是这个方式即不安全又低效</p><p><strong>上诉所说的几类引用,都是指对象本身的引用,而不是指</strong> Reference <strong>的四个子类的引用</strong>( SoftReference 等)。</p> </div> </details><details class="folding-tag" blue><summary> 53、Java创建对象有几种方式? </summary> <div class='content'> <p>java中提供了以下四种创建对象的方式:</p><ol><li><p>new创建新对象 new 类名();</p></li><li><p>通过反射机制 c.newInstance();</p></li><li><p>通过ObjectInputStream反序列化机制,把一个对象以二进制的形式读出。</p></li><li><p>采用clone机制</p></li></ol><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//创建一个User类,用get/set来写name和age,写一个构造函数,写一个返回值,继承Cloneable接口,实现其方法。</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">User</span> <span class="keyword">implements</span> <span class="title class_">Cloneable</span> {</span><br><span class="line"><span class="keyword">public</span> <span class="title function_">User</span><span class="params">()</span> {</span><br><span class="line">System.out.println(<span class="string">"构造函数"</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"><span class="keyword">private</span> <span class="type">int</span> age;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getName</span><span class="params">()</span> {</span><br><span class="line"><span class="keyword">return</span> name;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setName</span><span class="params">(String name)</span> {</span><br><span class="line"><span class="built_in">this</span>.name = name;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getAge</span><span class="params">()</span> {</span><br><span class="line"><span class="keyword">return</span> age;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setAge</span><span class="params">(<span class="type">int</span> age)</span> {</span><br><span class="line"><span class="built_in">this</span>.age = age;</span><br><span class="line">}</span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"><span class="keyword">return</span> <span class="string">"User [name="</span> + name + <span class="string">", age="</span> + age + <span class="string">"]"</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"><span class="keyword">protected</span> User <span class="title function_">clone</span><span class="params">()</span> <span class="keyword">throws</span> CloneNotSupportedException {</span><br><span class="line"><span class="comment">// TODO Auto-generated method stub</span></span><br><span class="line"><span class="type">User</span> <span class="variable">u1</span> <span class="operator">=</span>(User) <span class="built_in">super</span>.clone();</span><br><span class="line"><span class="keyword">return</span> u1;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//写一个Test类来克隆对象</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test2</span> {</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"><span class="type">User</span> <span class="variable">a1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>();</span><br><span class="line">a1.setName(<span class="string">"张三"</span>);</span><br><span class="line">a1.setAge(<span class="number">20</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"><span class="type">User</span> <span class="variable">a2</span> <span class="operator">=</span> a1.clone(); <span class="comment">//克隆是不会执行构造函数的,只能看到一条"构造函数"输出</span></span><br><span class="line">System.out.println(a2==a1); <span class="comment">//false 内存地址不一样</span></span><br><span class="line">System.out.println(a1); <span class="comment">//a1与a2内存地址不一样,但是属性相同</span></span><br><span class="line">System.out.println(a2);</span><br><span class="line">System.out.println(<span class="string">"-----------------------"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//浅度克隆</span></span><br><span class="line">a1.setName(<span class="string">"李四"</span>);</span><br><span class="line">a1.setAge(<span class="number">21</span>);</span><br><span class="line">System.out.println(a1); <span class="comment">//a1发生改变</span></span><br><span class="line">System.out.println(a2); <span class="comment">//a2未发生变化</span></span><br><span class="line">} <span class="keyword">catch</span> (CloneNotSupportedException e) {</span><br><span class="line"><span class="comment">// TODO Auto-generated catch block</span></span><br><span class="line">e.printStackTrace();</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" blue><summary> 54、有没有可能两个不相等的对象有相同的hashcode? </summary> <div class='content'> <p>有可能.在产生hash冲突时,两个不相等的对象就会有相同的 hashcode 值.</p> </div> </details><details class="folding-tag" blue><summary> 55、深拷贝和浅拷贝的区别是什么? </summary> <div class='content'> <p><strong>浅拷贝:</strong></p><p> 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。 换言之,浅拷贝仅仅复制所拷贝的对象,而不复制它所引用的对象. </p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ShallowCopy</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> CloneNotSupportedException {</span><br><span class="line"> <span class="type">Teacher</span> <span class="variable">teacher</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Teacher</span>();</span><br><span class="line"> teacher.setName(<span class="string">"riemann"</span>);</span><br><span class="line"> teacher.setAge(<span class="number">27</span>);</span><br><span class="line"></span><br><span class="line"> <span class="type">Student2</span> <span class="variable">student1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Student2</span>();</span><br><span class="line"> student1.setName(<span class="string">"edgar"</span>);</span><br><span class="line"> student1.setAge(<span class="number">18</span>);</span><br><span class="line"> student1.setTeacher(teacher);</span><br><span class="line"></span><br><span class="line"> <span class="type">Student2</span> <span class="variable">student2</span> <span class="operator">=</span> (Student2) student1.clone();</span><br><span class="line"> System.out.println(<span class="string">"浅拷贝后"</span>);</span><br><span class="line"> System.out.println(student2.getName());</span><br><span class="line"> System.out.println(student2.getAge());</span><br><span class="line"> System.out.println(student2.getTeacher().getName());</span><br><span class="line"> System.out.println(student2.getTeacher().getAge());</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"修改老师的信息后-------------"</span>);</span><br><span class="line"> <span class="comment">// 修改老师的信息</span></span><br><span class="line"> teacher.setName(<span class="string">"Games"</span>);</span><br><span class="line"> System.out.println(student1.getTeacher().getName());</span><br><span class="line"> System.out.println(student2.getTeacher().getName());</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Teacher</span> <span class="keyword">implements</span> <span class="title class_">Cloneable</span> {</span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> age;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getName</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setName</span><span class="params">(String name)</span> {</span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getAge</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> age;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setAge</span><span class="params">(<span class="type">int</span> age)</span> {</span><br><span class="line"> <span class="built_in">this</span>.age = age;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Student2</span> <span class="keyword">implements</span> <span class="title class_">Cloneable</span> {</span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> age;</span><br><span class="line"> <span class="keyword">private</span> Teacher teacher;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getName</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setName</span><span class="params">(String name)</span> {</span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getAge</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> age;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setAge</span><span class="params">(<span class="type">int</span> age)</span> {</span><br><span class="line"> <span class="built_in">this</span>.age = age;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Teacher <span class="title function_">getTeacher</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> teacher;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setTeacher</span><span class="params">(Teacher teacher)</span> {</span><br><span class="line"> <span class="built_in">this</span>.teacher = teacher;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Object <span class="title function_">clone</span><span class="params">()</span> <span class="keyword">throws</span> CloneNotSupportedException {</span><br><span class="line"> <span class="type">Object</span> <span class="variable">object</span> <span class="operator">=</span> <span class="built_in">super</span>.clone();</span><br><span class="line"> <span class="keyword">return</span> object;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//输出结果</span></span><br><span class="line">浅拷贝后</span><br><span class="line">edgar</span><br><span class="line"><span class="number">18</span></span><br><span class="line">riemann</span><br><span class="line"><span class="number">27</span></span><br><span class="line">修改老师的信息后-------------</span><br><span class="line">Games</span><br><span class="line">Games</span><br><span class="line"></span><br><span class="line">结果分析: </span><br><span class="line"> 两个引用student1和student2指向不同的两个对象,但是两个引用student1和student2中的两个teacher引用指向的是同一个对象,所以说明是浅拷贝。</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><img src="img/1.png" alt="img"></p><p><strong>深拷贝:</strong></p><p> 被复制对象的所有变量都含有与原来的对象相同的值。而那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">DeepCopy</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> CloneNotSupportedException {</span><br><span class="line"> <span class="type">Teacher2</span> <span class="variable">teacher</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Teacher2</span>();</span><br><span class="line"> teacher.setName(<span class="string">"riemann"</span>);</span><br><span class="line"> teacher.setAge(<span class="number">27</span>);</span><br><span class="line"></span><br><span class="line"> <span class="type">Student3</span> <span class="variable">student1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Student3</span>();</span><br><span class="line"> student1.setName(<span class="string">"edgar"</span>);</span><br><span class="line"> student1.setAge(<span class="number">18</span>);</span><br><span class="line"> student1.setTeacher(teacher);</span><br><span class="line"></span><br><span class="line"> <span class="type">Student3</span> <span class="variable">student2</span> <span class="operator">=</span> (Student3) student1.clone();</span><br><span class="line"> System.out.println(<span class="string">"深拷贝后"</span>);</span><br><span class="line"> System.out.println(student2.getName());</span><br><span class="line"> System.out.println(student2.getAge());</span><br><span class="line"> System.out.println(student2.getTeacher().getName());</span><br><span class="line"> System.out.println(student2.getTeacher().getAge());</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"修改老师的信息后-------------"</span>);</span><br><span class="line"> <span class="comment">// 修改老师的信息</span></span><br><span class="line"> teacher.setName(<span class="string">"Games"</span>);</span><br><span class="line"> System.out.println(student1.getTeacher().getName());</span><br><span class="line"> System.out.println(student2.getTeacher().getName());</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Teacher2</span> <span class="keyword">implements</span> <span class="title class_">Cloneable</span> {</span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> age;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getName</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setName</span><span class="params">(String name)</span> {</span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getAge</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> age;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setAge</span><span class="params">(<span class="type">int</span> age)</span> {</span><br><span class="line"> <span class="built_in">this</span>.age = age;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Object <span class="title function_">clone</span><span class="params">()</span> <span class="keyword">throws</span> CloneNotSupportedException {</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">super</span>.clone();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Student3</span> <span class="keyword">implements</span> <span class="title class_">Cloneable</span> {</span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> age;</span><br><span class="line"> <span class="keyword">private</span> Teacher2 teacher;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getName</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setName</span><span class="params">(String name)</span> {</span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getAge</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> age;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setAge</span><span class="params">(<span class="type">int</span> age)</span> {</span><br><span class="line"> <span class="built_in">this</span>.age = age;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Teacher2 <span class="title function_">getTeacher</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> teacher;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setTeacher</span><span class="params">(Teacher2 teacher)</span> {</span><br><span class="line"> <span class="built_in">this</span>.teacher = teacher;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Object <span class="title function_">clone</span><span class="params">()</span> <span class="keyword">throws</span> CloneNotSupportedException {</span><br><span class="line"> <span class="comment">// 浅复制时:</span></span><br><span class="line"> <span class="comment">// Object object = super.clone();</span></span><br><span class="line"> <span class="comment">// return object;</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">// 改为深复制:</span></span><br><span class="line"> <span class="type">Student3</span> <span class="variable">student</span> <span class="operator">=</span> (Student3) <span class="built_in">super</span>.clone();</span><br><span class="line"> <span class="comment">// 本来是浅复制,现在将Teacher对象复制一份并重新set进来</span></span><br><span class="line"> student.setTeacher((Teacher2) student.getTeacher().clone());</span><br><span class="line"> <span class="keyword">return</span> student;</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//输出结果:</span></span><br><span class="line">深拷贝后</span><br><span class="line">edgar</span><br><span class="line"><span class="number">18</span></span><br><span class="line">riemann</span><br><span class="line"><span class="number">27</span></span><br><span class="line">修改老师的信息后-------------</span><br><span class="line">Games</span><br><span class="line">riemann</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">结果分析:</span><br><span class="line">两个引用student1和student2指向不同的两个对象,两个引用student1和student2中的两个teacher引用指向的是两个对象,但对teacher对象的修改只能影响student1对象,所以说是深拷贝。</span><br></pre></td></tr></table></figure><p><img src="img/2.png" alt="img"></p><p>总结:B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。深拷贝相比于浅拷贝速度较慢并且花销较大。</p> </div> </details><details class="folding-tag" blue><summary> 56、static都有哪些用法? </summary> <div class='content'> <ol><li><p>静态变量和静态方法,也就是被static所修饰的变量/方法都属于类的静态资源,类实例所共享.</p></li><li><p>除了静态变量和静态方法之外,static也用于静态块,多用于初始化操作:</p></li></ol><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> calss PreCache{</span><br><span class="line"></span><br><span class="line"><span class="keyword">static</span>{</span><br><span class="line"><span class="comment">//执行相关操作</span></span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><ol><li><p>此外static也多用于修饰内部类,此时称之为静态内部类.</p></li><li><p>最后一种用法就是静态导包,即 import static .import static是在JDK 1.5之后引入的新特性,可以用来指定导入某个类中的静态资源,并且不需要使用类名,可以直接使用资源名,比如: </p></li></ol><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> <span class="keyword">static</span> java.lang.Math.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span>{</span><br><span class="line"> System.out.println(Math.sin(<span class="number">20</span>));</span><br><span class="line"> <span class="comment">//传统做法</span></span><br><span class="line"> System.out.println(sin(<span class="number">20</span>));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" blue><summary> 57、a=a+b与a+=b有什么区别吗? </summary> <div class='content'> <p> += 操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型, 而a=a+b则不会自动进行类型转换.</p><p>例1:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">byte</span> <span class="variable">a</span> <span class="operator">=</span> <span class="number">127</span>;</span><br><span class="line"><span class="type">byte</span> <span class="variable">b</span> <span class="operator">=</span> <span class="number">127</span>;</span><br><span class="line"></span><br><span class="line">b = a + b; <span class="comment">// 报编译错误:cannot convert from int to byte </span></span><br><span class="line">b += a;</span><br></pre></td></tr></table></figure><p>例2:以下代码是否有错,有的话怎么改?</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">short</span> s1= <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">s1 = s1 + <span class="number">1</span>;</span><br></pre></td></tr></table></figure><p> 有错误.short类型在进行运算时会自动提升为int类型,也就是说 s1+1 的运算结果是int类型,而s1是short 类型,此时编译器会报错.</p><p>正确写法:+=操作符会对右边的表达式结果强转匹配左边的数据类型,所以没错.</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">short</span> s1= <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">s1 += <span class="number">1</span>;</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" red><summary> 58、final、finalize()、finally </summary> <div class='content'> <p><strong>性质不同</strong>:</p><ol><li><p>final为关键字;</p></li><li><p>finalize()为方法;</p></li><li><p>finally为区块标志,用于try语句中;</p></li></ol><p><strong>作用</strong>:</p><ol><li><p>final为用于标识常量的关键字,final标识的关键字存储在常量池中(在这里final常量的具体用法 将在下面进行介绍);</p></li><li><p>finalize()方法在Object中进行了定义,用于在对象“消失”时,由JVM进行调用用于对对象进行垃圾回收,类似于C++中的析构函数;用户自定义时,用于释放对象占用的资源(比如进行I/0操作);</p></li><li><p>finally{}用于标识代码块,与try{}进行配合,不论try中的代码执行完或没有执行完(这里指有异常),该代码块之中的程序必定会进行;</p></li></ol> </div> </details><details class="folding-tag" blue><summary> 59、&和&&的区别 </summary> <div class='content'> <p>&是位运算符。&&是布尔逻辑运算符,在进行逻辑判断时用&处理的前面为false后面的内容仍需处理, 用&&处理的前面为false不再处理后面的内容。 1>2 && 3<4 第一个表达式为false,则不看第二个表达式</p> </div> </details><details class="folding-tag" blue><summary> 60、静态内部类如何定义 </summary> <div class='content'> <p>定义在类内部的静态类,就是静态内部类。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Out</span> {</span><br><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> <span class="type">int</span> a;</span><br><span class="line"><span class="keyword">private</span> <span class="type">int</span> b;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Inner</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">print</span><span class="params">()</span> {</span><br><span class="line">System.out.println(a);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span>{</span><br><span class="line"> <span class="type">Inner</span> <span class="variable">inner</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Inner</span>();</span><br><span class="line"> inner.print();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>1.静态内部类可以访问外部类所有的静态变量和方法,即使是 private 的也一样。</p><p>2.静态内部类和一般类一致,可以定义静态变量、方法,构造方法等。</p><p>3.其它类使用静态内部类需要使用“外部类.静态内部类”方式。</p><p>4.Java集合类HashMap内部就有一个静态内部类Entry。Entry是HashMap存放元素的抽象,HashMap 内部维护 Entry 数组用了存放元素,但是 Entry 对使用者是透明的。像这种和外部类关系密切的,且不依赖外部类实例的,都可以使用静态内部类。</p> </div> </details><details class="folding-tag" blue><summary> 61、什么是成员内部类 </summary> <div class='content'> <p>定义在类内部的非静态类,就是成员内部类。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Out</span> {</span><br><span class="line"><span class="keyword">private</span> <span class="type">int</span> a;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Inner</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">print</span><span class="params">()</span> {</span><br><span class="line">System.out.println(a);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span>{</span><br><span class="line"> <span class="type">Out</span> <span class="variable">out</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Out</span>();</span><br><span class="line"> <span class="type">Inner</span> <span class="variable">inner</span> <span class="operator">=</span> out.<span class="keyword">new</span> <span class="title class_">Inner</span>();</span><br><span class="line"> inner.print();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" blue><summary> 62、Static Nested Class和Inner Class的不同 </summary> <div class='content'> <p> Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。</p><p>注: 静态内部类(Inner Class)意味着:</p><ol><li><p>创建一个static内部类的对象,不需要一个外部类对象。</p></li><li><p>不能从一个static内部类的对象访问一个外部类对象。</p></li></ol> </div> </details><details class="folding-tag" blue><summary> 63、什么时候用assert </summary> <div class='content'> <p>assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或 退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。</p> </div> </details><details class="folding-tag" blue><summary> 64、Java有没有goto </summary> <div class='content'> <p>java中的保留字,现在没有在java中使用</p> </div> </details><details class="folding-tag" blue><summary> 65、数组有没有length()这个方法? String有没有length()这个方法 </summary> <div class='content'> <p>数组没有length()这个方法,有length的属性。String有length()这个方法。<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 数组长度</span></span><br><span class="line"><span class="type">int</span>[] arr = {<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>};</span><br><span class="line"><span class="type">int</span> <span class="variable">arrayLength</span> <span class="operator">=</span> arr.length; <span class="comment">// 获取数组长度,不需要括号</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 字符串长度</span></span><br><span class="line"><span class="type">String</span> <span class="variable">str</span> <span class="operator">=</span> <span class="string">"Hello, World!"</span>;</span><br><span class="line"><span class="type">int</span> <span class="variable">stringLength</span> <span class="operator">=</span> str.length(); <span class="comment">// 获取字符串长度,需要括号</span></span><br></pre></td></tr></table></figure></p> </div> </details><details class="folding-tag" blue><summary> 66、用最有效率的方法算出2乘以8等于几? </summary> <div class='content'> <p>2 << 3 </p><p>128 64 32 16 8 4 2 1</p><p> 0 0 0 0 0 0 1 0</p><p> 0 0 0 1 0 0 0 0 左移三位的结果:16</p> </div> </details><details class="folding-tag" red><summary> 67、排序都有哪几种方法?请列举 </summary> <div class='content'> <p>排序的方法有:插入排序(直接插入排序、希尔排序),交换排序(冒泡排序、快速排序),选择排序(直接选择排序、堆排序),归并排序,分配排序(箱排序、基数排序)快速排序的伪代码。</p> </div> </details><details class="folding-tag" blue><summary> 68、静态变量和实例变量的区别? </summary> <div class='content'> <p>静态变量 static int i = 10; 使用时:A.i;</p><p>实例变量 int i = 20; 使用时:A a = new A(); a.i;</p> </div> </details><details class="folding-tag" blue><summary> 69、说出一些常用的类,包,接口,请各举5个 </summary> <div class='content'> <p>常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer</p><p>常用的包:java.lang java.awt java.io java.util java.sql</p><p>常用的接口:Collection List Map Set Serializable</p> </div> </details><details class="folding-tag" red><summary> 70、hashCode() 有什么用?与a.equals(b)有什么关系 </summary> <div class='content'> <p> hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用equals() 方法来判断相等的对象,必须具有相同的 hash code。</p> </div> </details><details class="folding-tag" blue><summary> 71、Java中的编译期常量是什么?使用它又什么风险? </summary> <div class='content'> <p> 公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖 JAR 文件时,确保重新编译你的程序。</p> </div> </details><details class="folding-tag" blue><summary> 72、在Java中,如何跳出当前的多重嵌套循环? </summary> <div class='content'> <p> 在最外层循环前加一个标记如 A,然后用 break A;可以跳出多重循环。(Java 中支持带标签的 break 和continue 语句,作用有点类似于 C 和 C++中的 goto 语句,但是就像要避免使用 goto 一样,应该避免使用带标签的 break 和 continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用, 所以这种语法其实不知道更好)</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">A:<span class="keyword">for</span>(){</span><br><span class="line"></span><br><span class="line"> B:<span class="keyword">for</span>(){ </span><br><span class="line"></span><br><span class="line"> <span class="keyword">break</span> A; </span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" blue><summary> 73、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? </summary> <div class='content'> <p> <strong>不对</strong>,如果两个对象 x 和 y 满足 x.equals(y) == true,它们的哈希码(hash code)应当相同。</p><p>Java 对于 eqauls 方法和 hashCode 方法是这样规定的:</p><p>(1)如果两个对象相同(equals 方法返回 true),那么它们的 hashCode 值一定要相同;</p><p>(2)如果两个对象的 hashCode 相同,它们并不一定相同。</p><p>当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在 Set 集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。</p> </div> </details><details class="folding-tag" blue><summary> 74、是否可以继承String类? </summary> <div class='content'> <p> String 类是 final 类,不可以被继承,继承 String 本身就是一个错误的行为,对 String 类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。</p> </div> </details><details class="folding-tag" blue><summary> 74、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? </summary> <div class='content'> <p> 是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。</p> </div> </details><details class="folding-tag" blue><summary> 75、抽象的(abstract)方法是否可同时是静态的(static) </summary> <div class='content'> <p> 都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如 C 码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized 和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。</p> </div> </details><details class="folding-tag" blue><summary> 76、char型变量中能不能存贮一个中文汉字,为什么? </summary> <div class='content'> <p> char 类型可以存储一个中文汉字,因为 Java 中使用的编码是 Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个 char 类型占 2 个字节(16 比特),所以放一个中文是没问题的。</p><p> <strong>补充:</strong>使用 Unicode 意味着字符在 JVM 内部和外部有不同的表现形式,在 JVM内部都是 Unicode,当这个字符被从 JVM 内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以 Java 中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如 InputStreamReader 和OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务。</p> </div> </details><details class="folding-tag" red><summary> 77、Java中会存在内存泄漏吗,请简单描述。 </summary> <div class='content'> <p> 理论 上 Java 因为 有垃 圾回 收机 制( GC)不 会存 在内 存泄 露问 题( 这也 是 Java 被广泛 使用 于服务器 端编 程的 一个 重要 原因 ); 然而 在实 际开 发中 ,可 能会 存在 无用但 可达 的对 象,这些 对象 不能 被 GC 回收 ,因此 也会 导致 内存 泄露 的发 生 。</p><pre><code> 例如Hibernate 的 Session( 一级 缓存 )中的 对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象 中可能存在无用的垃圾对象 ,如果不及时关 闭(close)或清 空( flush)一级缓存就可能导致内存泄露 。下面例子中的代码也会导致内存泄露。</code></pre><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="keyword">import</span> java.util.EmptyStackException; </span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyStack</span><T> {</span><br><span class="line"> <span class="keyword">private</span> T[] elements; </span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> <span class="variable">size</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">int</span> <span class="variable">INIT_CAPACITY</span> <span class="operator">=</span> <span class="number">16</span>; </span><br><span class="line"> </span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">MyStack</span><span class="params">()</span> {</span><br><span class="line">elements = (T[]) <span class="keyword">new</span> <span class="title class_">Object</span>[INIT_CAPACITY];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">push</span><span class="params">(T elem)</span> { </span><br><span class="line"> ensureCapacity(); </span><br><span class="line"> elements[size++] = elem;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> T <span class="title function_">pop</span><span class="params">()</span> { </span><br><span class="line"> <span class="keyword">if</span>(size == <span class="number">0</span>)</span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">EmptyStackException</span>(); </span><br><span class="line"> <span class="keyword">return</span> elements[--size];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">ensureCapacity</span><span class="params">()</span> { </span><br><span class="line"> <span class="keyword">if</span>(elements.length == size) {</span><br><span class="line">elements = Arrays.copyOf(elements, <span class="number">2</span> * size + <span class="number">1</span>);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p> 上面的代码实现了一个栈(先进后出(FILO))结构,乍看之下似乎没有什么明显的问题,它甚至可以 通过你编写的各种单元测试。然而其中的 pop 方法却存在内存泄露的问题,当我们用 pop 方法弹出栈中的对象时,该对象不会被当作垃圾回收,即使使用栈的程序不再引用这些对象,因为栈内部维护着对这些对象的过期引用(obsolete reference)。在支持垃圾回收的语言中,内存泄露是很隐蔽的,这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响,极端情况下会引发 Disk Paging(物理内存与硬盘的虚拟内存交换数据),甚至造成 OutOfMemoryError。</p> </div> </details><details class="folding-tag" red><summary> 78、是否可以从一个静态(static)方法内部发出对非静态(non- static)方法的调用? </summary> <div class='content'> <p> 不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">A</span>{</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//非静态</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">a</span><span class="params">()</span>{</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//静态</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">b</span><span class="params">()</span>{</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//成员方法(非静态方法),允许调用静态成员</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">test1</span><span class="params">()</span>{ <span class="comment">//A a = new A(); a.test1();</span></span><br><span class="line"> a(); <span class="comment">//1</span></span><br><span class="line"> b(); <span class="comment">//2</span></span><br><span class="line"> System.out.println(<span class="built_in">this</span>); <span class="comment">//5</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//静态方法,不允许调用非静态的成员,不允许使用this</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">test2</span><span class="params">()</span>{ <span class="comment">//A.test2();</span></span><br><span class="line"> a(); <span class="comment">//3 错误 对象.a();</span></span><br><span class="line"> b(); <span class="comment">//4</span></span><br><span class="line"> System.out.println(<span class="built_in">this</span>); <span class="comment">//6 出错 this当前操作test2()的对象</span></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" blue><summary> 79、如何实现对象克隆? </summary> <div class='content'> <p>有两种方式: </p><p>1). 实现 Cloneable 接口并重写 Object 类中的 clone()方法; </p><p>2). 实现 Serializable 接口, 通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream; </span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream; </span><br><span class="line"><span class="keyword">import</span> java.io.ObjectInputStream; </span><br><span class="line"><span class="keyword">import</span> java.io.ObjectOutputStream; </span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyUtil</span> { </span><br><span class="line"> <span class="keyword">private</span> <span class="title function_">MyUtil</span><span class="params">()</span> {<span class="number">8</span></span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">AssertionError</span>();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@SuppressWarnings("unchecked")</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <T <span class="keyword">extends</span> <span class="title class_">Serializable</span>> T <span class="title function_">clone</span><span class="params">(T obj)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="type">ByteArrayOutputStream</span> <span class="variable">bout</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>(); </span><br><span class="line"> <span class="type">ObjectOutputStream</span> <span class="variable">oos</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(bout); </span><br><span class="line"> oos.writeObject(obj);</span><br><span class="line"> <span class="type">ByteArrayInputStream</span> <span class="variable">bin</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(bout.toByteArray()); </span><br><span class="line"> <span class="type">ObjectInputStream</span> <span class="variable">ois</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(bin); </span><br><span class="line"> <span class="keyword">return</span> (T) ois.readObject();</span><br><span class="line"> <span class="comment">//说明:调用 ByteArrayInputStream 或 ByteArrayOutputStream对象的 close 方法没有任何意义</span></span><br><span class="line"> <span class="comment">//这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放</span></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>测试代码:</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Person</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> -<span class="number">9102017020286042305L</span>; </span><br><span class="line"> <span class="keyword">private</span> String name; <span class="comment">// 姓名</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> age; <span class="comment">// 年龄</span></span><br><span class="line"> <span class="keyword">private</span> Car car; <span class="comment">// 座驾</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">Person</span><span class="params">(String name, <span class="type">int</span> age, Car car)</span> { </span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> <span class="built_in">this</span>.age = age; </span><br><span class="line"> <span class="built_in">this</span>.car = car;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getName</span><span class="params">()</span> { </span><br><span class="line"> <span class="keyword">return</span> name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setName</span><span class="params">(String name)</span> { </span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getAge</span><span class="params">()</span> { </span><br><span class="line"> <span class="keyword">return</span> age;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setAge</span><span class="params">(<span class="type">int</span> age)</span> { </span><br><span class="line"> <span class="built_in">this</span>.age = age;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Car <span class="title function_">getCar</span><span class="params">()</span> { </span><br><span class="line"> <span class="keyword">return</span> car;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setCar</span><span class="params">(Car car)</span> {</span><br><span class="line"> <span class="built_in">this</span>.car = car;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Person [name="</span> + name + <span class="string">", age="</span> + age + <span class="string">", car="</span> + car + <span class="string">"]"</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Car</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> -<span class="number">5713945027627603702L</span>; </span><br><span class="line"> <span class="keyword">private</span> String brand; <span class="comment">// 品牌</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> maxSpeed; <span class="comment">// 最高时速</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">Car</span><span class="params">(String brand, <span class="type">int</span> maxSpeed)</span> { </span><br><span class="line"> <span class="built_in">this</span>.brand = brand;</span><br><span class="line"> <span class="built_in">this</span>.maxSpeed = maxSpeed;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getBrand</span><span class="params">()</span> { </span><br><span class="line"> <span class="keyword">return</span> brand;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setBrand</span><span class="params">(String brand)</span> { </span><br><span class="line"> <span class="built_in">this</span>.brand = brand;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getMaxSpeed</span><span class="params">()</span> { </span><br><span class="line"> <span class="keyword">return</span> maxSpeed;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setMaxSpeed</span><span class="params">(<span class="type">int</span> maxSpeed)</span> { </span><br><span class="line"> <span class="built_in">this</span>.maxSpeed = maxSpeed;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Car [brand="</span> + brand + <span class="string">", maxSpeed="</span> + maxSpeed + <span class="string">"]"</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">CloneTest</span> {</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> { </span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">Person</span> <span class="variable">p1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Person</span>(<span class="string">"Hao LUO"</span>, <span class="number">33</span>, <span class="keyword">new</span> <span class="title class_">Car</span>(<span class="string">"Benz"</span>, <span class="number">300</span>));</span><br><span class="line"> <span class="type">Person</span> <span class="variable">p2</span> <span class="operator">=</span> MyUtil.clone(p1); <span class="comment">// 深度克隆</span></span><br><span class="line"> p2.getCar().setBrand(<span class="string">"BYD"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 修改克隆的 Person 对象 p2 关联的汽车对象的品牌属性</span></span><br><span class="line"> <span class="comment">// 原来的 Person 对象 p1 关联的汽车不会受到任何影响</span></span><br><span class="line"> <span class="comment">// 因为在克隆 Person 对象时其关联的汽车对象也被克隆了</span></span><br><span class="line"> System.out.println(p1);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) { </span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p> <strong>注意:</strong>基于 序列 化和 反序 列化 实现 的克 隆不 仅仅 是深 度克 隆, 更重 要的 是通 过泛型限 定, 可以 检查 出要 克隆 的对 象是 否支 持序 列化 ,这 项检 查是 编译 器完 成的 ,不是 在运 行时 抛出 异常,这种是方案明显优于使 用Object 类的 clone 方法 克隆 对象。 让问 题在 编译 的时 候暴 露出 来总是好 过把 问题 留到 运行 时。</p> </div> </details><details class="folding-tag" blue><summary> 80、接口是否可继承(extends)接口?抽象类是否可实现implements接口?抽象类是否可继承具体类(concreteclass)? </summary> <div class='content'> <p>接口可以继承接口,而且支持多重继承。抽象类可以实现 (implements)接口,抽象类可继承具体类 也可以继承抽象类 。</p> </div> </details><details class="folding-tag" blue><summary> 81、一个.java源文件中是否可以包含多个类(不是内部类)?有什么限制? </summary> <div class='content'> <p>可以,但一个源文件中最多只能有一个公开类(public class)而且文件名必须和公开类的类名完全保持一致。</p><p> A.java</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">A</span>{ <span class="comment">//一个java文件中允许有多个类</span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">}</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">B</span>{ <span class="comment">//公开的类只能有一个,而且必须与文件名一致</span></span><br><span class="line"> </span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" blue><summary> 82、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口? </summary> <div class='content'> <p>可以继承其他类或实现其他接口,在 Swing 编程和 Android 开发中常用此方式来实现事件监听和回调。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//匿名内部类</span></span><br><span class="line"><span class="keyword">new</span> <span class="title class_">Thread</span>(<span class="keyword">new</span> <span class="title class_">Runnable</span>(){</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">run</span><span class="params">()</span>{</span><br><span class="line"> System.out.println(<span class="string">"执行任务"</span>);</span><br><span class="line"> }</span><br><span class="line">},<span class="string">"线程1"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//Lambda</span></span><br><span class="line"><span class="keyword">new</span> <span class="title class_">Thread</span>(() -> {</span><br><span class="line"> System.out.println(<span class="string">"执行任务"</span>);</span><br><span class="line">},<span class="string">"线程1"</span>);</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" blue><summary> 83、内部类可以引用它的外部类的成员吗?有没有什么限制? </summary> <div class='content'> <p>一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。</p> </div> </details><details class="folding-tag" red><summary> 84、JDBC操作的步骤 </summary> <div class='content'> <p>加载数据库驱动类 </p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Class.forName(<span class="string">"com.mysql.jdbc.Driver"</span>);</span><br></pre></td></tr></table></figure><p>获得数据库连接 </p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">Connection</span> <span class="variable">conn</span> <span class="operator">=</span> DrvierManager.getConnection(<span class="string">"jdbc:mysql://192.168.48.132:3306/database的名称"</span>,user,password);</span><br></pre></td></tr></table></figure><p>执行sql语句 </p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">String</span> <span class="variable">sql</span> <span class="operator">=</span> <span class="string">""</span>;</span><br><span class="line"><span class="type">PreparedStatement</span> <span class="variable">ppst</span> <span class="operator">=</span> conn.prepareStatement(sql);</span><br></pre></td></tr></table></figure><p>给占位符赋值</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ppst.setString(<span class="number">1</span>,<span class="string">""</span>);</span><br><span class="line">ppst.setInt(<span class="number">2</span>,<span class="number">10</span>);</span><br></pre></td></tr></table></figure><p>处理返回结果 </p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> ppst.executeUpdate(); <span class="comment">//执行增删改,返回受影响的行数</span></span><br><span class="line"><span class="type">ResultSet</span> <span class="variable">rs</span> <span class="operator">=</span> ppst.executeQuery(); <span class="comment">//查询,返回结果</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//处理结果集</span></span><br><span class="line"><span class="keyword">while</span>(rs.next()){</span><br><span class="line"> rs.getXxx(<span class="string">"字段名"</span>); rs.getXxx(字段的位置index); </span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>关闭资源</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">rs.close();</span><br><span class="line">ppst.close();</span><br><span class="line">conn.close();</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" blue><summary> 85、在使用jdbc的时候,如何防止出现sql注入的问题。 </summary> <div class='content'> <p>使用PreparedStatement类(给占位符传值),而不是使用Statement类(值的拼接)。</p> </div> </details><details class="folding-tag" blue><summary> 86、怎么在JDBC内调用一个存储过程? </summary> <div class='content'> <p>使用CallableStatement。 call proc();</p> </div> </details><details class="folding-tag" red><summary> 87、是否了解连接池,使用连接池有什么好处? </summary> <div class='content'> <p> 数据库连接是非常消耗资源的,影响到程序的性能指标。连接池是用来分配、管理、释放数据库连接的,可以使应用程序重复使用同一个数据库连接,而不是每次都创建一个新的数据库连接。通过释放空 闲时间较长的数据库连接避免数据库因为创建太多的连接而造成的连接遗漏问题,提高了程序性能。</p><p> 常用数据库连接池:C3P0 、 dbcp 、druid等</p> </div> </details><details class="folding-tag" blue><summary> 88、你所了解的数据源技术有那些?使用数据源有什么好处? </summary> <div class='content'> <p> dbcp,c3p0等,用的最多还是c3p0,因为<strong>c3p0比dbcp更加稳定,安全</strong>;通过配置文件的形式来维护数据库信息,而不是通过硬编码。当连接的数据库信息发生改变时,不需要再更改程序代码就实现了数据库信息的更新。</p> </div> </details><h1 id="Java集合-泛型面试题"><a href="#Java集合-泛型面试题" class="headerlink" title="Java集合-泛型面试题"></a>Java集合-泛型面试题</h1><details class="folding-tag" red><summary> 1、Array(数组)、ArrayList和LinkedList的区别 </summary> <div class='content'> <p> Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有数据,(因为删除数据以后, 需要把后面所有的数据前移)。<strong>缺点:</strong>数组初始化必须指定初始化的长度, 否则报错。</p><p>例如:</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span>[] a = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">4</span>];<span class="comment">//推荐使用int[] 这种方式初始化</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> c[] = {<span class="number">23</span>,<span class="number">43</span>,<span class="number">56</span>,<span class="number">78</span>};<span class="comment">//长度:4,索引范围:[0,3]</span></span><br></pre></td></tr></table></figure><p> List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection。List有两个重要的实现类:ArrayList和LinkedList。</p><p><strong>ArrayList:</strong> </p><p>1).可以看作是能够自动增长容量的数组</p><p>2).ArrayList的toArray方法返回一个数组,Arrays的asList方法返回一个列表</p><p>3).ArrayList底层的实现是Array, 数组扩容实现</p><p><strong>LinkedList:</strong></p><p>1).是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.</p><p>2).在get与set方面弱于ArrayList.</p><p>当然,这些对比都是指数据量很大或者操作很频繁。</p> </div> </details><details class="folding-tag" red><summary> 2、HashMap和HashTable的区别 </summary> <div class='content'> <p>1)、两者父类不同</p><p>HashMap是继承自AbstractMap类,而Hashtable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。</p><p>2)、对外提供的接口不同</p><p>Hashtable比HashMap多提供了elments() 和contains() 两个方法。</p><p>elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的</p><p>value的枚举。</p><p>contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实上,</p><p>contansValue() 就只是调用了一下contains() 方法。</p><p>3)、对null的支持不同</p><p>Hashtable:key和value都不能为null。</p><p>HashMap:key可以为null,但是这样的key只能有一个,因为必须保证key的唯一性;可以有多个key</p><p>值对应的value为null。</p><p>4)、安全性不同</p><p>HashMap是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自己 处理多线程的安全问题。</p><p>Hashtable是线程安全的,它的每个方法上都有synchronized 关键字,因此可直接用于多线程中。</p><p>虽然HashMap是线程不安全的,但是它的效率远远高于Hashtable,这样设计是合理的,因为大部分的 使用场景都是单线程。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。</p><p>ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为</p><p>ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。</p><p>5)、初始容量大小和每次扩充容量大小不同</p><p>6)、计算hash值的方法不同</p> </div> </details><details class="folding-tag" blue><summary> 3、Collection包结构,与Collections的区别 </summary> <div class='content'> <p>Collection是集合类的上级接口,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、Set;</p><p>Collections是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的Collection框 架。</p> </div> </details><details class="folding-tag" blue><summary> 4、泛型常用特点 </summary> <div class='content'> <p> 泛型是Java SE 1.5之后的特性, 《Java 核心技术》中对泛型的定义是:“泛型”意味着编写的代码可以被不同类型的对象所重用。</p><p> “泛型”,顾名思义,“泛指的类型”。我们提供了泛指的概念,但具体执行的时候却可以有具体的规则来 约束,比如我们用的非常多的ArrayList就是个泛型类,ArrayList作为集合可以存放各种元素,如Integer, String,自定义的各种类型等,但在我们使用的时候通过具体的规则来约束,如我们可以约束集合中只存放Integer类型的元素,如</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">List<Integer> iniData = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>()</span><br></pre></td></tr></table></figure><p><strong>使用泛型的好处?</strong></p><p> 以集合来举例,使用泛型的好处是我们不必因为添加元素类型的不同而定义不同类型的集合,如整型集 合类,浮点型集合类,字符串集合类,我们可以定义一个集合来存放整型、浮点型,字符串型数据,而 这并不是最重要的,因为我们只要把底层存储设置了Object即可,添加的数据全部都可向上转型为Object。 更重要的是我们可以通过规则按照自己的想法控制存储的数据类型。</p> </div> </details><details class="folding-tag" blue><summary> 5、说说List、Set、Map三者的区别 </summary> <div class='content'> <p>List: List接口存储元素不唯一(可以有多个元素引用相同的对象),有序的对象。</p><p>Set(注重独一无二的性质):不允许重复的元素,不会有多个元素引用相同的对象。</p><p>Map(用Key来搜索):使用键值对存储。Map会维护与Key有关联的值。两个Key可以引用相同的对象,但Key不能重复,典型的Key是String类型,但也可以是任何对象。</p> </div> </details><details class="folding-tag" blue><summary> 6、Array与ArrayList有什么不一样? </summary> <div class='content'> <p>Array与ArrayList都是用来存储数据的集合。ArrayList底层是使用数组实现的,但是arrayList对数组进 行了封装和功能扩展,拥有许多原生数组没有的一些功能。我们可以理解成ArrayList是Array的一个升级版。</p> </div> </details><details class="folding-tag" blue><summary> 7、Map有什么特点? </summary> <div class='content'> <p>以键值对存储数据 元素存储循序是无序的 不允许出现重复键</p> </div> </details><details class="folding-tag" blue><summary> 8、集合类存放于Java.util包中,主要有几种接口 </summary> <div class='content'> <p>主要包含set(集)、 list(列表包含 Queue)和 map(映射)。</p><p>1).Collection: Collection 是集合 List、 Set、 Queue 的最基本的接口。</p><p>2).Iterator:迭代器,可以通过迭代器遍历集合中的数据</p><p>3).Map:是映射表的基础接口</p><p><img src="img/image-20200610165628096.png" alt="image-20200610165628096"></p> </div> </details><details class="folding-tag" blue><summary> 9、什么是List接口 </summary> <div class='content'> <p>Java 的 List 是非常常用的数据类型。 List 是有序的 Collection。 </p><p>Java的List 一共三个实现类: 分别是ArrayList、 Vector 和 LinkedList 。</p><p>List接口结构图</p><p><img src="img/image-20200611102843130.png" alt="image-20200611102843130"></p> </div> </details><details class="folding-tag" red><summary> 10、说说ArrayList(数组)和Vector( 数组实现、 线程同步) </summary> <div class='content'> <p>ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数 组的缺点是每个元素之间不能有间隔, 当数组大小不满足时需要增加存储能力,就要将已经有数 组的数据复制到新的存储空间中。 当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进 行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。</p><p>Vector 与 ArrayList 一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一 个线程能够写 Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此, 访问它比访问 ArrayList 慢 。</p><p>==<strong>建议使用的线程安全的集合CopyOnWriteArrayList</strong>==</p> </div> </details><details class="folding-tag" blue><summary> 12、说说LinkedList(链表) </summary> <div class='content'> <p>LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较 慢。另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆 栈、队列和双向队列使用</p> </div> </details><details class="folding-tag" blue><summary> 13、什么Set集合 </summary> <div class='content'> <p>Set 注重独一无二的性质,该体系集合用于<strong>存储无序(存入和取出的顺序不一定相同)元素</strong>, <strong>值不能重复</strong>。</p><p>set结构结构图</p><p><img src="img/image-20200611102930214.png" alt="image-20200611102930214"> </p> </div> </details><details class="folding-tag" blue><summary> 14、HashSet(Hash表) </summary> <div class='content'> <p>哈希表边存放的是哈希值。 HashSet 存储元素的顺序并不是按照存入时的顺序(和 List 显然不 同) 而是按照哈希值来存的所以取数据也是按照哈希值取得。元素的哈希值是通过元素的 hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较 equals 方法 如果 equals 结果为 true , HashSet 就视为同一个元素。如果 equals 为 false 就不是 同一个元素。 哈希值相同</p><p>equals 为 false 的元素是怎么存储呢,就是在同样的哈希值下顺延(可以认为哈希值相 同的元素放在一个哈希桶中)。也就是哈希一样的存一列。 </p><p>如图 1 表示 hashCode 值不相同的情 况; 图 2 表示hashCode 值相同,但 equals 不相同的情况。</p><p><img src="img/image-20200611103056460.png" alt="image-20200611103056460"> </p><p>HashSet 通过 hashCode 值来确定元素在内存中的位置。 一个 hashCode 位置上可以存放多个元素。</p> </div> </details><details class="folding-tag" blue><summary> 15、什么是TreeSet(二叉树) </summary> <div class='content'> <p>1.TreeSet()是使用二叉树的原理对新 add()的对象按照指定的顺序排序(升序、降序),每增 加一个对象都会进行排序,将对象插入的二叉树指定的位置。</p><p>2.Integer 和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的, 自己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo()函数,才可以正常使 用。</p><p>3.在覆写 compare()函数时,要返回相应的值才能使 TreeSet 按照一定的规则来排序</p><p>4.比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整 数、零或正整数</p> </div> </details><details class="folding-tag" blue><summary> 16、说说LinkedHashSet (HashSet+LinkedHashMap) </summary> <div class='content'> <p>对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。 LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法 操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并 通过传递一个标识参数, 调用父类的构造器,底层构造一个 LinkedHashMap 来实现,在相关操 作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可。</p> </div> </details><details class="folding-tag" red><summary> 17、HashMap(数组+链表+红黑树) </summary> <div class='content'> <p>HashMap 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快 的访问速度,但遍历顺序却是不确定的。 HashMap 最多只允许一条记录的键为 null,允许多条记 录的值为null。 </p><p>HashMap 非线程安全,即任一时刻可以有多个线程同时写 HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections 的 synchronizedMap 方法使 HashMap 具有线程安全的能力,或者使用 <strong>==ConcurrentHashMap==</strong>。 </p><p>我们用下面这张图来介绍 HashMap 的结构。</p><p><img src="img/image-20200611103325208.png" alt="image-20200611103325208"> </p><p>大方向上, HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。上图中,每个绿色 的实体是嵌套类 Entry 的实例, <strong>Entry 包含四个属性: key, value, hash 值和用于单向链表的 next。</strong></p><blockquote><p>1.capacity:当前数组容量,始终保持 2^n,可以扩容,扩容后数组大小为当前的 2 倍。默认是16。</p><p>2.loadFactor:负载因子,默认为 0.75。</p><p>3.threshold:扩容的阈值,等于 capacity * loadFactor</p></blockquote><p>Java8 对 HashMap 进行了一些修改, 最大的不同就是利用了红黑树,所以其由 <strong>数组+链表+红黑树</strong> 组成。 根据 Java7 HashMap 的介绍,我们知道,查找的时候,根据 hash 值我们能够快速定位到数组的具体下标,但是之后的话, 需要顺着链表一个个比较下去才能找到我们需要的,<strong>时间复杂度取决于链表的长度,为 O(n)</strong>。为了降低这部分的开销,在 Java8 中, 当链表中的元素超过了 8 个以后, 会将链表转换为红黑树,在这些位置进行查找的时候可以<strong>降低时间复杂度为O(logN)</strong>。</p><p><img src="img/image-20200611103402116.png" alt="image-20200611103402116"></p> </div> </details><details class="folding-tag" red><summary> 18、说说ConcurrentHashMap </summary> <div class='content'> <p><strong>Segment段</strong></p><p>ConcurrentHashMap 和 HashMap 思路是差不多的,但是因为它<strong>支持并发操作</strong>,所以要复杂一 些。整个 ConcurrentHashMap 由一个个 Segment 组成, Segment 代表”部分“或”一段“的 意思,所以很多地方都会将其描述为<strong>分段锁</strong>。注意,行文中,我很多地方用了“槽”来代表一个 segment。</p><p><strong>线程安全(Segment继承ReentrantLock加锁)</strong></p><p>简单理解就是, ConcurrentHashMap 是一个 Segment 数组, Segment 通过继承 ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每 个 Segment 是线程安全的,也就实现了全局的线程安全</p><p><img src="img/image-20200611103601412.png" alt="image-20200611103601412"></p><p><strong>并行度(默认16)</strong></p><p>concurrencyLevel:并行级别、并发数、 Segment 数,怎么翻译不重要,理解它。默认是 16, 也就是说 ConcurrentHashMap 有 16 个 Segments,所以理论上, 这个时候,最多可以同时支 持 16 个线程并发写,只要它们的操作分别分布在不同的 Segment 上。这个值可以在初始化的时 候设置为其他值,但是一旦初始化以后,它是不可以扩容的。再具体到每个 Segment 内部,其实 每个 Segment 很像之前介绍的 HashMap,不过它要保证线程安全,所以处理起来要麻烦些。</p><p><strong>Java8实现 (引入了红黑树)</strong></p><p>Java8 对 ConcurrentHashMap 进行了比较大的改动,Java8 也引入了红黑树。</p><p><img src="img/image-20200611103703819.png" alt="image-20200611103703819"></p> </div> </details><details class="folding-tag" blue><summary> 19、HashTable(线程安全)被取代 </summary> <div class='content'> <p>Hashtable 是遗留类,很多映射的常用功能与 HashMap 类似,不同的是它承自 Dictionary 类, 并且是线程安全的,任一时间只有一个线程能写 <strong>Hashtable,并发性不如 ConcurrentHashMap</strong>, 因为ConcurrentHashMap 引入了分段锁。Hashtable 不建议在新代码中使用,不需要线程安全的场合可以用 HashMap 替换,需要线程安全的场合可以用 ConcurrentHashMap 替换</p> </div> </details><details class="folding-tag" blue><summary> 20、TreeMap(可排序) </summary> <div class='content'> <p>TreeMap 实现 SortedMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序, 也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。 如果使用排序的映射, 建议使用 TreeMap。 在使用 TreeMap 时, key 必须实现 Comparable 接口或者在构造 TreeMap 传入自定义的 Comparator,否则会在运行时抛出 java.lang.ClassCastException 类型的异常。 </p><p>参考: <a href="https://www.ibm.com/developerworks/cn/java/j-lo-tree/index.html">https://www.ibm.com/developerworks/cn/java/j-lo-tree/index.html</a></p> </div> </details><details class="folding-tag" red><summary> 21、LinkedHashMap (记录插入顺序) </summary> <div class='content'> <p>LinkedHashMap 是 HashMap 的一个子类,保存了记录的插入顺序,在用 Iterator 遍历</p><p>LinkedHashMap 时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。</p><p> 参考 1: <a href="http://www.importnew.com/28263.html">http://www.importnew.com/28263.html</a> </p><p>参 考 2: <a href="http://www.importnew.com/20386.html#">http://www.importnew.com/20386.html#</a> </p><p>对于 LinkedHashSet 而言,它继承与 HashSet、又基于 LinkedHashMap 来实现的。 LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承与 HashSet,其所有的方法 操作上又与 HashSet 相同,因此 LinkedHashSet 的实现上非常简单,只提供了四个构造方法,并 通过传递一个标识参数, 调用父类的构造器,底层构造一个 LinkedHashMap 来实现,在相关操 作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可。</p> </div> </details><details class="folding-tag" red><summary> 22、泛型类 </summary> <div class='content'> <p>泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分。和泛型方法一样,泛 型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一 个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参 数化的类或参数化的类型。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Box</span><T> { </span><br><span class="line"> <span class="keyword">private</span> T t;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">add</span><span class="params">(T t)</span> { </span><br><span class="line"> <span class="built_in">this</span>.t = t;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">public</span> T <span class="title function_">get</span><span class="params">()</span> { </span><br><span class="line"> <span class="keyword">return</span> t;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure> </div> </details><details class="folding-tag" blue><summary> 23、类型通配符? </summary> <div class='content'> <p>类 型 通 配 符 一 般 是 使 用 ? 代 替 具 体 的 类 型 参 数 。 例 如 List<?> 在 逻 辑 上 是List,List 等所有List<具体类型实参>的父类。 <? extends Number> <? super Number></p> </div> </details><details class="folding-tag" blue><summary> 24、类型擦除 </summary> <div class='content'> <p>Java 中的泛型基本上都是在编译器这个层次来实现的。在生成的 Java 字节代码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会被编译器在编译的时候去掉。这个过程就称为<strong>类型擦除</strong>。</p><p>如在代码中定义的 List和 List等类型,在编译之后都会变成 List。 JVM 看到的只是 List,而由泛型附加的类型信息对 JVM 来说是不可见的。</p><p>类型擦除的基本过程也比较简单,首先是找到用来替换类型参数的具体类。这个具体类一般是 <strong>Object</strong>。如果指定了类型参数的上界的话,则使用这个上界。把代码中的类型参数都替换成具体的类。</p> </div> </details><details class="folding-tag" cyan open><summary> 查看默认打开的折叠框 </summary> <div class='content'> <p>这是一个默认打开的折叠框。</p> </div> </details>]]></content>
<categories>
<category> 面试题 </category>
</categories>
<tags>
<tag> Java </tag>
<tag> 面试题 </tag>
</tags>
</entry>
<entry>
<title>基于Hexo搭建个人博客相关技能分享(持续更新)</title>
<link href="/2023/09/22/hexoBuild06/"/>
<url>/2023/09/22/hexoBuild06/</url>
<content type="html"><![CDATA[<div class="note info no-icon simple"><p>阅读本篇前,请确保已经完成下面两篇文章的步骤:<br><span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild/">基于 Hexo 从零开始搭建个人博客系列文章</a></span>。</p></div><div class="note info no-icon simple"><p>修改站点配置文件_config.yml,路径为【BlogRoot/_config.yml】。</p><p>修改主题配置文件_config.butterfly.yml,路径为【BlogRoot/_config.butterfly.yml】。</p></div><div class="note red icon-padding simple"><i class="note-icon fas fa-fan"></i><p><a href="https://butterfly.js.org/">Butterfly主题官方文档</a>。</p></div><div class="note red icon-padding simple"><i class="note-icon fas fa-fan"></i><p><a href="https://markdown.com.cn/">Markdown 官方教程</a>。</p></div><div class="note red icon-padding simple"><i class="note-icon fas fa-fan"></i><p><a href="https://markdown.com.cn/editor/">Markdown 在线编辑器</a>。</p></div><div class="note red icon-padding simple"><i class="note-icon fas fa-fan"></i><p><a href="https://github.com/jerryc127/hexo-theme-butterfly">hexo-theme-butterfly主题GitHub地址</a>。</p></div><div class="note red icon-padding simple"><i class="note-icon fas fa-fan"></i><p><a href="https://butterfly.js.org/posts/2df239ce/">官方标签外挂(Tag Plugins)文档</a>。</p></div><div class="note red icon-padding simple"><i class="note-icon fas fa-fan"></i><p><a href="https://fontawesome.com/icons">支持的图标库</a>。<br>当然也可以引用别的图标库,如果不想改可以用上面的</p></div><div class="note red icon-padding simple"><i class="note-icon fas fa-fan"></i><p>免费白嫖一年域名,我只了解到两个下面分享<br><a href="https://www.vpsor.cn/product/domain-buy">硅云.top</a>。<br><a href="https://wanwang.aliyun.com/domain/1yuan?spm=5176.8075371.850118.top1yuan.343166d2Qoqlud">阿里万网.xyz</a>。</p></div>]]></content>
<categories>
<category> hexo </category>
</categories>
<tags>
<tag> hexo </tag>
</tags>
</entry>
<entry>
<title>基于 Hexo 从零开始搭建个人博客(五)</title>
<link href="/2023/09/22/hexoBuild05/"/>
<url>/2023/09/22/hexoBuild05/</url>
<content type="html"><![CDATA[<div class="note info no-icon simple"><p>阅读本篇前,请确保已经完成下面两篇文章的步骤:<br><span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild01/">基于 Hexo 从零开始搭建个人博客(一)</a></span>。<br><span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild02/">基于 Hexo 从零开始搭建个人博客(二)</a></span>。<br><span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild03/">基于 Hexo 从零开始搭建个人博客(三)</a></span>。<br><span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild04/">基于 Hexo 从零开始搭建个人博客(四)</a></span>。</p></div><p>更多配置请移步 <a href="https://butterfly.js.org/">官方文档</a>。</p><div class="note info no-icon simple"><p>修改站点配置文件_config.yml,路径为【BlogRoot/_config.yml】。</p><p>修改主题配置文件_config.butterfly.yml,路径为【BlogRoot/_config.butterfly.yml】。</p></div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><div class="note info no-icon simple"><p>本站基于Hexo搭建,用的是 最新的🦋 hexo-theme-butterfly 主题 v4.10.0-b1,如果你是 v4.10.0-b1 之外的版本,可能有些地方会有出入,请留意。</p></div><h2 id="语言"><a href="#语言" class="headerlink" title="语言"></a>语言</h2><p>修改站点配置文件_config.yml,默认语言是 en 。</p><p>主题支持三种语言:</p><ul><li>default(en)</li><li>zh-CN (简体中文)</li><li>zh-TW (繁体中文)</li></ul><h2 id="网站资料"><a href="#网站资料" class="headerlink" title="网站资料"></a>网站资料</h2><p>修改网站各种资料,例如标题、副标题和邮箱等个人资料,请修改站点配置文件_config.yml。</p><h2 id="部分参数如下,详细参数可参考官方的配置描述。"><a href="#部分参数如下,详细参数可参考官方的配置描述。" class="headerlink" title="部分参数如下,详细参数可参考官方的配置描述。"></a>部分参数如下,详细参数可参考官方的配置描述。</h2><div class="table-container"><table><thead><tr><th>参数</th><th>描述</th></tr></thead><tbody><tr><td><strong>title</strong></td><td>网站标题</td></tr><tr><td><strong>subtitle</strong></td><td>描述</td></tr><tr><td><strong>description</strong></td><td>网站描述</td></tr><tr><td><strong>keywords</strong></td><td>网站的关键词。支持多个关键词。</td></tr><tr><td><strong>author</strong></td><td>您的名字</td></tr><tr><td><strong>language</strong></td><td>网站使用的语言。常见的值有 zh-Hans 和 zh-CN。</td></tr><tr><td><strong>timezone</strong></td><td>网站时区。请参考时区列表进行设置,如 America/New_York, Japan, 和 UTC。</td></tr></tbody></table></div><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_027.png"/></div></div><h2 id="导航菜单"><a href="#导航菜单" class="headerlink" title="导航菜单"></a>导航菜单</h2><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">menu:</span></span><br><span class="line"> <span class="attr">Home:</span> <span class="string">/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-home</span></span><br><span class="line"> <span class="attr">Archives:</span> <span class="string">/archives/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-archive</span></span><br><span class="line"> <span class="attr">Tags:</span> <span class="string">/tags/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-tags</span></span><br><span class="line"> <span class="attr">Categories:</span> <span class="string">/categories/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-folder-open</span></span><br><span class="line"> <span class="string">List||fas</span> <span class="string">fa-list||hide:</span></span><br><span class="line"> <span class="attr">Music:</span> <span class="string">/music/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-music</span></span><br><span class="line"> <span class="attr">Movie:</span> <span class="string">/movies/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-video</span></span><br><span class="line"> <span class="attr">Link:</span> <span class="string">/link/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-link</span></span><br><span class="line"> <span class="attr">About:</span> <span class="string">/about/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-heart</span></span><br></pre></td></tr></table></figure><p>必须是 /xxx/,后面||分开,然后写图标名。</p><p>如果不希望显示图标,图标名可不写。</p><p>若主题版本大于 v4.0.0,可以直接在子目录里添加 hide<br><div class="note info no-icon simple"><p>注意: 导航的文字可自行更改</p></div><br>例如:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">menu:</span></span><br><span class="line"> <span class="string">首页:</span> <span class="string">/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-home</span></span><br><span class="line"> <span class="string">时间轴:</span> <span class="string">/archives/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-archive</span></span><br><span class="line"> <span class="string">博文</span> <span class="string">||</span> <span class="attr">fa fa-graduation-cap:</span></span><br><span class="line"> <span class="string">分类:</span> <span class="string">/categories/</span> <span class="string">||</span> <span class="string">fa</span> <span class="string">fa-archive</span></span><br><span class="line"> <span class="string">标签:</span> <span class="string">/tags/</span> <span class="string">||</span> <span class="string">fa</span> <span class="string">fa-tags</span></span><br><span class="line"> <span class="string">归档:</span> <span class="string">/archives/</span> <span class="string">||</span> <span class="string">fa</span> <span class="string">fa-folder-open</span></span><br><span class="line"> <span class="string">爱好</span> <span class="string">||</span> <span class="attr">fa fa-heartbeat:</span></span><br><span class="line"> <span class="string">音乐:</span> <span class="string">/music/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-music</span></span><br><span class="line"> <span class="string">诗歌:</span> <span class="string">/poetry/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-book</span></span><br><span class="line"> <span class="string">番剧:</span> <span class="string">/bangumis</span> <span class="string">||</span> <span class="string">iconfont</span> <span class="string">icon-bilibili-line</span></span><br><span class="line"> <span class="string">照片:</span> <span class="string">/photos/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-images</span></span><br><span class="line"> <span class="string">电影:</span> <span class="string">/movies/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-video</span></span><br><span class="line"> <span class="string">留言板:</span> <span class="string">/guestbook/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-envelope</span> <span class="comment">#留言</span></span><br><span class="line"> <span class="string">友链:</span> <span class="string">/link/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-link</span></span><br><span class="line"> <span class="string">关于:</span> <span class="string">/about/</span> <span class="string">||</span> <span class="string">fas</span> <span class="string">fa-heart</span></span><br></pre></td></tr></table></figure><br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_028.png"/></div></div></p><h2 id="导航栏设置"><a href="#导航栏设置" class="headerlink" title="导航栏设置"></a>导航栏设置</h2><p>修改主题配置文件_config.butterfly.yml。</p><h2 id=""><a href="#" class="headerlink" title=""></a><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">nav:</span></span><br><span class="line"> <span class="attr">logo:</span> <span class="comment">#image</span></span><br><span class="line"> <span class="attr">display_title:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">fixed:</span> <span class="literal">false</span> <span class="comment"># fixed navigation bar</span></span><br></pre></td></tr></table></figure></h2><div class="table-container"><table><thead><tr><th>参数</th><th>解释</th></tr></thead><tbody><tr><td><strong>logo</strong></td><td>网站的 logo,支持图片,直接填入图片链接</td></tr><tr><td><strong>display_title</strong></td><td>是否显示网站标题,填写 true 或者 false</td></tr><tr><td><strong>fixed</strong></td><td>是否固定状态栏,填写 true 或者 false</td></tr></tbody></table></div><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><div class="note info no-icon simple"><p>代码块中的所有功能只适用于 Hexo 自带的代码渲染。<br>如果使用第三方的渲染器,不一定会有效。</p></div><h3 id="代码高亮主题"><a href="#代码高亮主题" class="headerlink" title="代码高亮主题"></a>代码高亮主题</h3><p>Butterfly支持 6 种代码高亮样式:</p><ul><li>darker</li><li>pale night</li><li>light</li><li>ocean</li><li>mac</li><li>mac light<br>修改主题配置文件_config.butterfly.yml。中的highlight_theme属性。</li></ul><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_theme:</span> <span class="string">light</span></span><br></pre></td></tr></table></figure><div class="tabs" id="test01"><ul class="nav-tabs"><button type="button" class="tab active" data-href="test01-1">darker</button><button type="button" class="tab " data-href="test01-2">darker</button><button type="button" class="tab " data-href="test01-3">light</button><button type="button" class="tab " data-href="test01-4">ocean</button><button type="button" class="tab " data-href="test01-5">mac</button><button type="button" class="tab " data-href="test01-6">mac light</button></ul><div class="tab-contents"><div class="tab-item-content active" id="test01-1"><p><img src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_029.png" alt=""></p></div><div class="tab-item-content" id="test01-2"><p><img src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_030.png" alt=""></p></div><div class="tab-item-content" id="test01-3"><p><img src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_031.png" alt=""></p></div><div class="tab-item-content" id="test01-4"><p><img src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_032.png" alt=""></p></div><div class="tab-item-content" id="test01-5"><p><img src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_033.png" alt=""></p></div><div class="tab-item-content" id="test01-6"><p><img src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_034.png" alt=""></p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h3 id="开启代码复制功能"><a href="#开启代码复制功能" class="headerlink" title="开启代码复制功能"></a>开启代码复制功能</h3><p>修改主题配置文件_config.butterfly.yml。中的highlight_copy属性。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">highlight_copy:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="代码换行"><a href="#代码换行" class="headerlink" title="代码换行"></a>代码换行</h3><p>在默认情况下,Hexo 在编译的时候不会实现代码自动换行。如果你不希望在代码块的区域里有横向滚动条的话,那么你可以考虑开启这个功能。</p><p>修改主题配置文件_config.butterfly.yml。中的code_word_wrap属性。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">code_word_wrap:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>Butterfly支持 <a href="https://fontawesome.com/icons?from=io">font-awesome v6 图标</a>。</p><p>书写格式:图标名:url || 描述性文字。<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">social:</span></span><br><span class="line"> <span class="attr">fab fa-github:</span> <span class="string">https://github.com/xxxxx</span> <span class="string">||</span> <span class="string">Github</span></span><br><span class="line"> <span class="attr">fas fa-envelope:</span> <span class="string">mailto:xxxxxx@gmail.com</span> <span class="string">||</span> <span class="string">Email</span></span><br></pre></td></tr></table></figure></p><h2 id="主页文章节选-自动节选和文章页description"><a href="#主页文章节选-自动节选和文章页description" class="headerlink" title="主页文章节选(自动节选和文章页description)"></a>主页文章节选(自动节选和文章页description)</h2><p>因为主题UI的关係,主页文章节选只支持自动节选和文章页description。</p><p>在butterfly里,有四种可供选择</p><p>description: 只显示description<br>both: 优先选择description,如果没有配置description,则显示自动节选的内容<br>auto_excerpt:只显示自动节选<br>false: 不显示文章内容<br>修改主题配置文件_config.butterfly.yml。中的index_post_content属性。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">index_post_content:</span></span><br><span class="line"> <span class="attr">method:</span> <span class="number">3</span></span><br><span class="line"> <span class="attr">length:</span> <span class="number">500</span> <span class="comment"># if you set method to 2 or 3, the length need to config</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>description在front-matter里添加。</p><h2 id="顶部图"><a href="#顶部图" class="headerlink" title="顶部图"></a>顶部图</h2><div class="note info no-icon simple"><p>如果不要显示顶部图,可直接配置 disable_top_img: true。</p></div><p>顶部图的获取顺序,如果都没有配置,则不显示顶部图。</p><p>页面顶部图的获取顺序:<br>各自配置的 top_img > 配置文件的 default_top_img</p><p>文章页顶部图的获取顺序:<br>各自配置的 top_img > cover > 配置文件的 default_top_img</p><div class="table-container"><table><thead><tr><th>配置项</th><th>解释</th></tr></thead><tbody><tr><td>index_img</td><td>主页的 top_img</td></tr><tr><td>default_top_img</td><td>默认的 top_img,当页面的 top_img 没有配置时,会显示 default_top_img</td></tr><tr><td>archive_img</td><td>归档页面的 top_img</td></tr><tr><td>tag_img</td><td>tag 子页面的默认 top_img</td></tr><tr><td>tag_per_img</td><td>tag 子页面的 top_img,可配置每个 tag 的 top_img</td></tr><tr><td>category_img</td><td>category 子页面的默认 top_img</td></tr><tr><td>category_per_img</td><td>category 子页面的 top_img,可配置每个 category 的 top_img</td></tr></tbody></table></div><p>修改主题配置文件_config.butterfly.yml。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">index_img:</span> <span class="string">xxx.png</span></span><br></pre></td></tr></table></figure><p>其它页面 (tags/categories/自建页面)和文章页的top_img,请到对应的 md 页面设置front-matter中的top_img。</p><h2 id="文章置顶"><a href="#文章置顶" class="headerlink" title="文章置顶"></a>文章置顶</h2><p>【推荐】hexo-generator-index从 v2.0.0 开始,已经支持文章置顶功能。你可以直接在文章的front-matter区域里添加sticky: 1属性来把这篇文章置顶。数值越大,置顶的优先级越大。</p><h2 id="文章封面"><a href="#文章封面" class="headerlink" title="文章封面"></a>文章封面</h2><p>文章的markdown文档上,在Front-matter添加cover,并填上要显示的图片地址。如果不配置cover,可以设置显示默认的cover。</p><p>如果不想在首页显示cover,可以设置为false。</p><p>修改主题配置文件_config.butterfly.yml。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">cover:</span></span><br><span class="line"> <span class="comment"># 是否显示文章封面</span></span><br><span class="line"> <span class="attr">index_enable:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">aside_enable:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">archives_enable:</span> <span class="literal">true</span></span><br><span class="line"> <span class="comment"># 封面显示的位置</span></span><br><span class="line"> <span class="comment"># 三个值可配置 left , right , both</span></span><br><span class="line"> <span class="attr">position:</span> <span class="string">both</span></span><br><span class="line"> <span class="comment"># 当没有设置cover时,默认的封面显示</span></span><br><span class="line"> <span class="attr">default_cover:</span> </span><br></pre></td></tr></table></figure><div class="table-container"><table><thead><tr><th>参数</th><th>解释</th></tr></thead><tbody><tr><td>index_enable</td><td>主页是否显示文章封面图</td></tr><tr><td>aside_enable</td><td>侧栏是否显示文章封面图</td></tr><tr><td>archives_enable</td><td>归档页面是否显示文章封面图</td></tr><tr><td>position</td><td>主页卡片文章封面的显示位置</td></tr><tr><td></td><td>- left:全部显示在左边</td></tr><tr><td></td><td>- right:全部显示在右边</td></tr><tr><td></td><td>- both:封面位置以左右左右轮流显示</td></tr><tr><td>default_cover</td><td>默认的 cover,可配置图片链接/颜色/渐变色等</td></tr></tbody></table></div><p>当配置多张图片时,会随机选择一张作为cover,此时写法应为:<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">default_cover:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/img/hexobuild_bg01.jpg</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/img/poetry_bg01.png</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_035.png"/></div></div></p>]]></content>
<categories>
<category> hexo </category>
</categories>
<tags>
<tag> hexo </tag>
</tags>
</entry>
<entry>
<title>基于 Hexo 从零开始搭建个人博客(四)</title>
<link href="/2023/09/22/hexoBuild04/"/>
<url>/2023/09/22/hexoBuild04/</url>
<content type="html"><![CDATA[<div class="note info no-icon simple"><p>阅读本篇前,请确保已经完成下面两篇文章的步骤:<br><span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild01/">基于 Hexo 从零开始搭建个人博客(一)</a></span>。<br><span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild02/">基于 Hexo 从零开始搭建个人博客(二)</a></span>。<br><span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild03/">基于 Hexo 从零开始搭建个人博客(三)</a></span>。</p></div><div class="note info no-icon simple"><p>修改站点配置文件_config.yml,路径为【BlogRoot/_config.yml】。</p><p>修改主题配置文件_config.butterfly.yml,路径为【BlogRoot/_config.butterfly.yml】。</p></div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><div class="note info no-icon simple"><p>本站基于Hexo搭建,用的是 最新的🦋 hexo-theme-butterfly 主题 v4.10.0-b1,如果你是 v4.10.0-b1 之外的版本,可能有些地方会有出入,请留意。</p></div><h2 id="Front-matter"><a href="#Front-matter" class="headerlink" title="Front-matter"></a>Front-matter</h2><p>Front-matter 是 markdown 文件最上方以—-分隔的区域,用于指定个别档案的变数。</p><ul><li>Page Front-matter 用于页面配置</li><li>Post Front-matter 用于文章页配置<div class="note info no-icon simple"><p>如果标注可选的参数,可根据自己需要添加,不用全部都写在markdown里</p></div><h3 id="Page-Front-matter"><a href="#Page-Front-matter" class="headerlink" title="Page Front-matter"></a>Page Front-matter</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title:</span><br><span class="line">date:</span><br><span class="line">updated:</span><br><span class="line">type:</span><br><span class="line">comments:</span><br><span class="line">description:</span><br><span class="line">keywords:</span><br><span class="line">top<span class="emphasis">_img:</span></span><br><span class="line"><span class="emphasis">mathjax:</span></span><br><span class="line"><span class="emphasis">katex:</span></span><br><span class="line"><span class="emphasis">aside:</span></span><br><span class="line"><span class="emphasis">aplayer:</span></span><br><span class="line"><span class="emphasis">highlight_</span>shrink:</span><br><span class="line">---</span><br></pre></td></tr></table></figure></li></ul><h4 id=""><a href="#" class="headerlink" title=""></a><span class='p red'>必需配置项</span></h4><div class="table-container"><table><thead><tr><th>配置项</th><th>解释</th></tr></thead><tbody><tr><td><strong>title</strong> (必需)</td><td>文章标题</td></tr><tr><td><strong>date</strong> (必需)</td><td>文章创建日期</td></tr></tbody></table></div><h4 id="-1"><a href="#-1" class="headerlink" title=""></a><span class='p blue'>可选配置项</span></h4><div class="table-container"><table><thead><tr><th>配置项</th><th>解释</th></tr></thead><tbody><tr><td><strong>updated</strong> (可选)</td><td>文章更新日期</td></tr><tr><td><strong>tags</strong> (可选)</td><td>文章标签</td></tr><tr><td><strong>categories</strong> (可选)</td><td>文章分类</td></tr><tr><td><strong>keywords</strong> (可选)</td><td>文章关键字</td></tr><tr><td><strong>description</strong> (可选)</td><td>文章描述</td></tr><tr><td><strong>top_img</strong> (可选)</td><td>文章顶部图片</td></tr><tr><td><strong>cover</strong> (可选)</td><td>文章缩略图(如果没有设置top_img,文章页顶部将显示缩略图,可设为false/图片地址/留空)</td></tr><tr><td><strong>comments</strong> (可选)</td><td>显示文章评论模块(默认为true)</td></tr><tr><td><strong>toc</strong> (可选)</td><td>显示文章TOC(默认为设置中toc的enable配置)</td></tr><tr><td><strong>toc_number</strong> (可选)</td><td>显示toc_number(默认为设置中toc的number配置)</td></tr><tr><td><strong>toc_style_simple</strong> (可选)</td><td>显示 toc 简洁模式</td></tr><tr><td><strong>copyright</strong> (可选)</td><td>显示文章版权模块(默认为设置中post_copyright的enable配置)</td></tr><tr><td><strong>copyright_author</strong> (可选)</td><td>文章版权模块的文章作者</td></tr><tr><td><strong>copyright_author_href</strong> (可选)</td><td>文章版权模块的文章作者链接</td></tr><tr><td><strong>copyright_url</strong> (可选)</td><td>文章版权模块的文章连结链接</td></tr><tr><td><strong>copyright_info</strong> (可选)</td><td>文章版权模块的版权声明文字</td></tr><tr><td><strong>mathjax</strong> (可选)</td><td>显示MathJax(当设置mathjax的per_page: false时,才需要配置,默认为false)</td></tr><tr><td><strong>katex</strong> (可选)</td><td>显示KaTeX(当设置katex的per_page: false时,才需要配置,默认为false)</td></tr><tr><td><strong>aplayer</strong> (可选)</td><td>在需要的页面加载APlayer的js和css,请参考文章下面的音乐配置</td></tr><tr><td><strong>highlight_shrink</strong> (可选)</td><td>配置代码框是否展开(true/false)(默认为设置中highlight_shrink的配置)</td></tr><tr><td><strong>aside</strong> (可选)</td><td>显示侧边栏(默认为true)</td></tr></tbody></table></div><h3 id="Page-Front-matter-1"><a href="#Page-Front-matter-1" class="headerlink" title="Page Front-matter"></a>Page Front-matter</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title:</span><br><span class="line">date:</span><br><span class="line">updated:</span><br><span class="line">tags:</span><br><span class="line">categories:</span><br><span class="line">keywords:</span><br><span class="line">description:</span><br><span class="line">top<span class="emphasis">_img:</span></span><br><span class="line"><span class="emphasis">comments:</span></span><br><span class="line"><span class="emphasis">cover:</span></span><br><span class="line"><span class="emphasis">toc:</span></span><br><span class="line"><span class="emphasis">toc_</span>number:</span><br><span class="line">toc<span class="emphasis">_style_</span>simple:</span><br><span class="line">copyright:</span><br><span class="line">copyright<span class="emphasis">_author:</span></span><br><span class="line"><span class="emphasis">copyright_</span>author<span class="emphasis">_href:</span></span><br><span class="line"><span class="emphasis">copyright_</span>url:</span><br><span class="line">copyright<span class="emphasis">_info:</span></span><br><span class="line"><span class="emphasis">mathjax:</span></span><br><span class="line"><span class="emphasis">katex:</span></span><br><span class="line"><span class="emphasis">aplayer:</span></span><br><span class="line"><span class="emphasis">highlight_</span>shrink:</span><br><span class="line"><span class="section">aside:</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure><h4 id="-2"><a href="#-2" class="headerlink" title=""></a><span class='p blue'>写法说明</span></h4><div class="table-container"><table><thead><tr><th>配置项</th><th>解释</th></tr></thead><tbody><tr><td><strong>title</strong></td><td>(必需) 文章标题</td></tr><tr><td><strong>date</strong></td><td>(必需) 文章创建日期</td></tr><tr><td><strong>updated</strong></td><td>(可选) 文章更新日期</td></tr><tr><td><strong>tags</strong></td><td>(可选) 文章标签</td></tr><tr><td><strong>categories</strong></td><td>(可选) 文章分类</td></tr><tr><td><strong>keywords</strong></td><td>(可选) 文章关键字</td></tr><tr><td><strong>description</strong></td><td>(可选) 文章描述</td></tr><tr><td><strong>top_img</strong></td><td>(可选) 文章顶部图片</td></tr><tr><td><strong>cover</strong></td><td>(可选) 文章缩略图(如果没有设置top_img,文章页顶部将显示缩略图,可设为false/图片地址/留空)</td></tr><tr><td><strong>comments</strong></td><td>(可选) 显示文章评论模块(默认为true)</td></tr><tr><td><strong>toc</strong></td><td>(可选) 显示文章TOC(默认为设置中toc的enable配置)</td></tr><tr><td><strong>toc_number</strong></td><td>(可选) 显示toc_number(默认为设置中toc的number配置)</td></tr><tr><td><strong>toc_style_simple</strong></td><td>(可选) 显示 toc 简洁模式</td></tr><tr><td><strong>copyright</strong></td><td>(可选) 显示文章版权模块(默认为设置中post_copyright的enable配置)</td></tr><tr><td><strong>copyright_author</strong></td><td>(可选) 文章版权模块的文章作者</td></tr><tr><td><strong>copyright_author_href</strong></td><td>(可选) 文章版权模块的文章作者链接</td></tr><tr><td><strong>copyright_url</strong></td><td>(可选) 文章版权模块的文章链接链接</td></tr><tr><td><strong>copyright_info</strong></td><td>(可选) 文章版权模块的版权声明文字</td></tr><tr><td><strong>mathjax</strong></td><td>(可选) 显示MathJax(当设置mathjax的per_page: false时,才需要配置,默认为false)</td></tr><tr><td><strong>katex</strong></td><td>(可选) 显示KaTeX(当设置katex的per_page: false时,才需要配置,默认为false)</td></tr><tr><td><strong>aplayer</strong></td><td>(可选) 在需要的页面加载APlayer的js和css,请参考文章下面的音乐配置</td></tr><tr><td><strong>highlight_shrink</strong></td><td>(可选) 配置代码框是否展开(true/false)(默认为设置中highlight_shrink的配置)</td></tr><tr><td><strong>aside</strong></td><td>(可选) 显示侧边栏(默认为true)</td></tr></tbody></table></div><h2 id="标签页"><a href="#标签页" class="headerlink" title="标签页"></a>标签页</h2><ol><li>前往你的Hexo博客根目录,打开cmd命令窗口执行hexo new page tags。</li><li>在【BlogRoot/source/】会生成一个含有index.md文件的tags文件夹。</li><li>修改【BlogRoot/source/tags/index.md】,添加type: “tags”。<figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: tags</span><br><span class="line">date: 2023-9-22 15:28:40</span><br><span class="line">type: "tags"</span><br><span class="line">orderby: random</span><br><span class="line"><span class="section">order: 1</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure></li></ol><h4 id="-3"><a href="#-3" class="headerlink" title=""></a><span class='p blue'>写法说明</span></h4><div class="table-container"><table><thead><tr><th>配置项</th><th>解释</th></tr></thead><tbody><tr><td><strong>type</strong></td><td>(必须) 页面类型,必须为 tags</td></tr><tr><td><strong>orderby</strong></td><td>(可选) 排序方式:random/name/length</td></tr><tr><td><strong>order</strong></td><td>(可选) 排序次序:1, asc for ascending; -1, desc for descending</td></tr></tbody></table></div><h2 id="分类页"><a href="#分类页" class="headerlink" title="分类页"></a>分类页</h2><ol><li>前往你的Hexo博客根目录,打开cmd命令窗口执行hexo new page categories。</li><li><p>在【BlogRoot/source/】会生成一个含有index.md文件的categories文件夹。</p></li><li><p>修改【BlogRoot/source/categories/index.md】,添加type: “categories”。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: categories</span><br><span class="line">date: 2023-9-22 15:28:40</span><br><span class="line"><span class="section">type: "categories"</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure></li></ol><h2 id="友情链接"><a href="#友情链接" class="headerlink" title="友情链接"></a>友情链接</h2><h3 id="创建友情链接页面"><a href="#创建友情链接页面" class="headerlink" title="创建友情链接页面"></a>创建友情链接页面</h3><ol><li>前往你的Hexo博客根目录,打开cmd命令窗口执行hexo new page link。</li><li><p>在【BlogRoot/source/】会生成一个含有index.md文件的link文件夹。</p></li><li><p>修改【BlogRoot/source/link/index.md】,添加type: “link”。</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: link</span><br><span class="line">date: 2022-05-29 22:03:35</span><br><span class="line"><span class="section">type: "link"</span></span><br><span class="line"><span class="section">---</span></span><br></pre></td></tr></table></figure><h4 id="友情链接页面添加友链信息"><a href="#友情链接页面添加友链信息" class="headerlink" title="友情链接页面添加友链信息"></a>友情链接页面添加友链信息</h4><p>前往Hexo博客目录(【BlogRoot/source/_data】)创建一个文件link.yml(如果沒有 _data 文件夹,请自行创建)。</p><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_026.png"/></div></div><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">class_name:</span> <span class="string">友情链接</span></span><br><span class="line"> <span class="attr">class_desc:</span> <span class="string">那些人,那些事</span></span><br><span class="line"> <span class="attr">link_list:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">wenkj</span></span><br><span class="line"> <span class="attr">link:</span> <span class="string">https://wenkj.xyz/</span></span><br><span class="line"> <span class="attr">avatar:</span> <span class="string">https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/img/1.png</span></span><br><span class="line"> <span class="attr">descr:</span> <span class="string">不积跬步,无以至千里;不积小流,无以成江海。</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">class_name:</span> <span class="string">网站</span></span><br><span class="line"> <span class="attr">class_desc:</span> <span class="string">值得推荐的网站</span></span><br><span class="line"> <span class="attr">link_list:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Youtube</span></span><br><span class="line"> <span class="attr">link:</span> <span class="string">https://www.youtube.com/</span></span><br><span class="line"> <span class="attr">avatar:</span> <span class="string">https://i.loli.net/2020/05/14/9ZkGg8v3azHJfM1.png</span></span><br><span class="line"> <span class="attr">descr:</span> <span class="string">视频网站</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Weibo</span></span><br><span class="line"> <span class="attr">link:</span> <span class="string">https://www.weibo.com/</span></span><br><span class="line"> <span class="attr">avatar:</span> <span class="string">https://i.loli.net/2020/05/14/TLJBum386vcnI1P.png</span></span><br><span class="line"> <span class="attr">descr:</span> <span class="string">中国最大社交分享平台</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Twitter</span></span><br><span class="line"> <span class="attr">link:</span> <span class="string">https://twitter.com/</span></span><br><span class="line"> <span class="attr">avatar:</span> <span class="string">https://i.loli.net/2020/05/14/5VyHPQqR6LWF39a.png</span></span><br><span class="line"> <span class="attr">descr:</span> <span class="string">社交分享平台</span></span><br></pre></td></tr></table></figure><p>class_name和class_desc支持 html 格式,如不需要,也可以留空。(注意缩进单位)</p></li></ol><h2 id="图库"><a href="#图库" class="headerlink" title="图库"></a>图库</h2><p>图库页面只是普通的页面,你只需要hexo new page xxxxx创建你的页面就行。</p><p>然后使用标签外挂 galleryGroup,具体用法请查看对应的内容。<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="string"><div</span> <span class="string">class="gallery-group-main"></span></span><br><span class="line">{<span class="string">%</span> <span class="string">galleryGroup</span> <span class="string">'壁纸'</span> <span class="string">'收藏的一些壁纸'</span> <span class="string">'/Gallery/wallpaper'</span> <span class="string">https://i.loli.net/2019/11/10/T7Mu8Aod3egmC4Q.png</span> <span class="string">%</span>}</span><br><span class="line">{<span class="string">%</span> <span class="string">galleryGroup</span> <span class="string">'漫威'</span> <span class="string">'关于漫威的图片'</span> <span class="string">'/Gallery/marvel'</span> <span class="string">https://i.loli.net/2019/12/25/8t97aVlp4hgyBGu.jpg</span> <span class="string">%</span>}</span><br><span class="line">{<span class="string">%</span> <span class="string">galleryGroup</span> <span class="string">'OH MY GIRL'</span> <span class="string">'关于OH MY GIRL的图片'</span> <span class="string">'/Gallery/ohmygirl'</span> <span class="string">https://i.loli.net/2019/12/25/hOqbQ3BIwa6KWpo.jpg</span> <span class="string">%</span>}</span><br><span class="line"><span class="string"></div></span></span><br></pre></td></tr></table></figure></p><div class="gallery-group-main"><figure class="gallery-group"> <img class="gallery-group-img no-lightbox" src='https://i.loli.net/2019/11/10/T7Mu8Aod3egmC4Q.png' alt="Group Image Gallery"> <figcaption> <div class="gallery-group-name">壁纸</div> <p>收藏的一些壁纸</p> <a href='/Gallery/wallpaper'></a> </figcaption> </figure> <figure class="gallery-group"> <img class="gallery-group-img no-lightbox" src='https://i.loli.net/2019/12/25/8t97aVlp4hgyBGu.jpg' alt="Group Image Gallery"> <figcaption> <div class="gallery-group-name">漫威</div> <p>关于漫威的图片</p> <a href='/Gallery/marvel'></a> </figcaption> </figure> <figure class="gallery-group"> <img class="gallery-group-img no-lightbox" src='https://i.loli.net/2019/12/25/hOqbQ3BIwa6KWpo.jpg' alt="Group Image Gallery"> <figcaption> <div class="gallery-group-name">OH MY GIRL</div> <p>关于OH MY GIRL的图片</p> <a href='/Gallery/ohmygirl'></a> </figcaption> </figure> </div><h3 id="子页面"><a href="#子页面" class="headerlink" title="子页面"></a>子页面</h3><p>子页面也是普通的页面,你只需要hexo new page xxxxx创建你的页面就行。</p><p>然后使用标签外挂 gallery,具体用法请查看对应的内容。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">{<span class="string">%</span> <span class="string">gallery</span> <span class="string">%</span>}</span><br><span class="line"> <span class="type">![](https://i.loli.net/2019/12/25/Fze9jchtnyJXMHN.jpg)</span></span><br><span class="line"> <span class="type">![](https://i.loli.net/2019/12/25/ryLVePaqkYm4TEK.jpg)</span></span><br><span class="line"> <span class="type">![](https://i.loli.net/2019/12/25/gEy5Zc1Ai6VuO4N.jpg)</span></span><br><span class="line"> <span class="type">![](https://i.loli.net/2019/12/25/d6QHbytlSYO4FBG.jpg)</span></span><br><span class="line"> <span class="type">![](https://i.loli.net/2019/12/25/6nepIJ1xTgufatZ.jpg)</span></span><br><span class="line"> <span class="type">![](https://i.loli.net/2019/12/25/E7Jvr4eIPwUNmzq.jpg)</span></span><br><span class="line"> <span class="type">![](https://i.loli.net/2019/12/25/mh19anwBSWIkGlH.jpg)</span></span><br><span class="line"> <span class="type">![](https://i.loli.net/2019/12/25/2tu9JC8ewpBFagv.jpg)</span></span><br><span class="line"> {<span class="string">%</span> <span class="string">endgallery</span> <span class="string">%</span>}</span><br></pre></td></tr></table></figure><div class="gallery-container" data-type="data" data-button=""> <div class="gallery-data">[{"url":"https://i.loli.net/2019/12/25/Fze9jchtnyJXMHN.jpg","alt":""},{"url":"https://i.loli.net/2019/12/25/ryLVePaqkYm4TEK.jpg","alt":""},{"url":"https://i.loli.net/2019/12/25/gEy5Zc1Ai6VuO4N.jpg","alt":""},{"url":"https://i.loli.net/2019/12/25/d6QHbytlSYO4FBG.jpg","alt":""},{"url":"https://i.loli.net/2019/12/25/6nepIJ1xTgufatZ.jpg","alt":""},{"url":"https://i.loli.net/2019/12/25/E7Jvr4eIPwUNmzq.jpg","alt":""},{"url":"https://i.loli.net/2019/12/25/mh19anwBSWIkGlH.jpg","alt":""},{"url":"https://i.loli.net/2019/12/25/2tu9JC8ewpBFagv.jpg","alt":""}]</div> <div class="gallery-items"> </div> </div><h2 id="404页面"><a href="#404页面" class="headerlink" title="404页面"></a>404页面</h2><p>主題內置了一个简单的404页面,可在设置中开放。</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># A simple 404 page</span></span><br><span class="line"><span class="attr">error_404:</span></span><br><span class="line"> <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">subtitle:</span> <span class="string">"页面沒有找到"</span></span><br><span class="line"> <span class="attr">background:</span> </span><br></pre></td></tr></table></figure><div class="note info no-icon simple"><p>如需本地预览,请启动项目并访问 <a href="http://localhost:4000/404.html">http://localhost:4000/404.html</a> </p></div>]]></content>
<categories>
<category> hexo </category>
</categories>
<tags>
<tag> hexo </tag>
</tags>
</entry>
<entry>
<title>基于 Hexo 从零开始搭建个人博客(三)</title>
<link href="/2023/09/21/hexoBuild03/"/>
<url>/2023/09/21/hexoBuild03/</url>
<content type="html"><![CDATA[<div class="note info no-icon simple"><p>阅读本篇前,请确保已经完成下面两篇文章的步骤:<br><span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild01/">基于 Hexo 从零开始搭建个人博客(一)</a></span>。<br><span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild02/">基于 Hexo 从零开始搭建个人博客(二)</a></span>。</p></div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><div class="note info no-icon simple"><p>本站基于Hexo搭建,用的是 最新的🦋 hexo-theme-butterfly 主题 v4.10.0-b1,如果你是 v4.10.0-b1 之外的版本,可能有些地方会有出入,请留意。</p></div><h2 id="安装主题"><a href="#安装主题" class="headerlink" title="安装主题"></a>安装主题</h2><p>本人用的是git clone方式安装的 hexo-theme-butterfly,后续魔改时更改的文件都是【E:wkj/demo/blog-demo/themes/butterfly】文件夹中的文件。如果你是npm方式安装的主题,请在【E:wkj/demo/blog-demo/node_modules/hexo-theme-butterfly】文件夹下修改对应的文件。<br>Git安装(推荐Github)<br>在你的博客根目录里(我这里路径为【E:wkj/demo/blog-demo/】),在空白处右键打开Git BUSH,执行命令即可。<br>主题地址:<a href="https://github.com/jerryc127/hexo-theme-butterfly">https://github.com/jerryc127/hexo-theme-butterfly</a></p><ul><li>安装最新主题版本<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly</span><br></pre></td></tr></table></figure></li><li>安装指定主题版本<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> -b 3.7.1 https://github.com/jerryc127/hexo-theme-butterfly.git themes/butterfly</span><br></pre></td></tr></table></figure><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_023.png"/></div></div><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_024.png"/></div></div>如果git失败的话可以把去上面地址直接下载下来解压到这个文件夹下面既可<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_025.png"/></div></div><div class="note info no-icon simple"><p>升级方法:在主题目录下,运行git pull</p></div></li></ul><h2 id="应用主题"><a href="#应用主题" class="headerlink" title="应用主题"></a>应用主题</h2><p>修改站点配置文件_config.yml,把主题改为butterfly<br><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">theme:</span> <span class="string">butterfly</span></span><br></pre></td></tr></table></figure></p><h2 id="安装插件"><a href="#安装插件" class="headerlink" title="安装插件"></a>安装插件</h2><p>安装插件<br>如果你没有pug以及stylus的渲染器,请下载安装:<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-renderer-pug hexo-renderer-stylus --save</span><br></pre></td></tr></table></figure></p>]]></content>
<categories>
<category> hexo </category>
</categories>
<tags>
<tag> hexo </tag>
</tags>
</entry>
<entry>
<title>基于 Hexo 从零开始搭建个人博客(二)</title>
<link href="/2023/09/21/hexoBuild02/"/>
<url>/2023/09/21/hexoBuild02/</url>
<content type="html"><![CDATA[<div class="note info no-icon simple"><p>阅读本篇前,请先配置好相应的环境,请仔细阅读教程 <span class='p blue'><a href="https://wenkj.xyz/2023/09/20/hexoBuild01/">基于 Hexo 从零开始搭建个人博客(一)</a></span>。</p></div><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><div class="note info no-icon simple"><p>本站基于Hexo搭建,用的是 最新的🦋 hexo-theme-butterfly 主题 v4.10.0-b1,如果你是 v4.10.0-b1 之外的版本,可能有些地方会有出入,请留意。</p></div><h2 id="初始化-Hexo-项目"><a href="#初始化-Hexo-项目" class="headerlink" title="初始化 Hexo 项目"></a>初始化 Hexo 项目</h2><ol><li>在目标路径(我这里选的路径为【E:\wkj\demo】)打开cmd命令窗口<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_015.png"/></div></div></li><li><p>执行hexo init初始化项目(warning不用担心)。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo init blog-demo(你的项目名)</span><br></pre></td></tr></table></figure><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_016.png"/></div></div></li><li><p>进入blog-demo ,输入npm i安装相关依赖</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> blog-demo //进入blog-demo文件夹</span><br><span class="line">npm i</span><br></pre></td></tr></table></figure><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_017.png"/></div></div></li><li>初始化项目后,blog-demo有如下结构:<br>【node_modules】:依赖包<br>【scaffolds】:生成文章的一些模板<br>【source】:用来存放你的文章<br>【themes】:主题<br>【.npmignore】:发布时忽略的文件(可忽略)<br>【_config.landscape.yml】:主题的配置文件<br>【_config.yml】:博客的配置文件<br>【package.json】:项目名称、描述、版本、运行和开发等信息<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_018.png"/></div></div></li><li>输入hexo server或者hexo s。<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_019.png"/></div></div></li><li>打开浏览器,输入地址:<a href="http://localhost:4000/">http://localhost:4000/</a> ,看到下面的效果,说明你的博客已经构建成功了。(ctrl+c结束运行)<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_020.png"/></div></div></li></ol><h2 id="将静态博客挂载到-GitHub-Pages"><a href="#将静态博客挂载到-GitHub-Pages" class="headerlink" title="将静态博客挂载到 GitHub Pages"></a>将静态博客挂载到 GitHub Pages</h2><p>上一篇文章中,我们已经完成了对 GitHub 账户的注册以及 Github Pages 的创建,并且为 GitHub 配置了 SSH key, 我们将博客部署到 GitHub Pages 上即可。<br>安装 hexo-deployer-git<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure><br>修改 _config.yml 文件<br>在blog-demo目录下的_config.yml,就是整个Hexo框架的配置文件了。可以在里面修改大部分的配置。详细可参考官方的配置描述。</p><p>修改最后一行的配置,将repository修改为你自己的github项目地址即可。</p><div class="note info no-icon simple"><p>请检查自己的默认分支是不是master。(我用的就是master)</p></div><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line"> <span class="attr">repository:</span> <span class="string">git@github.com:uEatpeach/uEatpeach.github.io.git</span></span><br><span class="line"> <span class="attr">branch:</span> <span class="string">master</span></span><br></pre></td></tr></table></figure><p>部署项目到 GitHub<br>修改好配置后,运行如下命令,将代码部署到 GitHub。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hexo clean</span><br><span class="line">hexo generate</span><br><span class="line">hexo deploy</span><br></pre></td></tr></table></figure><ul><li>hexo clean:删除之前生成的文件,若未生成过静态文件,可忽略此命令。</li><li>hexo generate:生成静态文章,可以用hexo g缩写</li><li>hexo deploy:部署文章,可以用hexo d缩写</li></ul><div class="note info no-icon simple"><p>注意:deploy时可能要你输入 username 和 password。</p></div><p>如果出现Deploy done,则说明部署成功了。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_022.png"/></div></div></p><p>打开浏览器访问:<a href="https://ueatpeach.github.io/">https://ueatpeach.github.io/</a> ,这时候我们就可以看到博客内容了。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_020.png"/></div></div></p><h2 id="设置个人域名"><a href="#设置个人域名" class="headerlink" title="设置个人域名"></a>设置个人域名</h2><p>现在你的个人网站的地址是 yourname.github.io。如果觉得不够定制化,可以购买一个专属域名。</p><div class="note info no-icon simple"><p>这一步不是必要的,如果目前还不想买域名可以先跳过。</p></div>]]></content>
<categories>
<category> hexo </category>
</categories>
<tags>
<tag> hexo </tag>
</tags>
</entry>
<entry>
<title>基于 Hexo 从零开始搭建个人博客(一)</title>
<link href="/2023/09/20/hexoBuild01/"/>
<url>/2023/09/20/hexoBuild01/</url>
<content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><div class="note info no-icon simple"><p>本站基于Hexo搭建,用的是 最新的🦋 hexo-theme-butterfly 主题 v4.10.0-b1,如果你是 v4.10.0-b1 之外的版本,可能有些地方会有出入,请留意。</p></div><h2 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h2><div class="note info no-icon simple"><p>本教程主要面向 Windows 用户 </p></div><ul><li>操作系统:Windows10 || Windows11 </li><li>Node</li><li>Git</li><li>Hexo</li><li>idea(推荐使用 Visual Studio Code)</li><li>一个 GitHub 帐号</li><li>一个云服务器(可选)</li><li>一个域名(可选)</li></ul><h2 id="安装-Node"><a href="#安装-Node" class="headerlink" title="安装 Node"></a>安装 Node</h2><div class="tabs" id="nodebuild"><ul class="nav-tabs"><button type="button" class="tab active" data-href="nodebuild-1">方法一</button><button type="button" class="tab " data-href="nodebuild-2">方法二</button><button type="button" class="tab " data-href="nodebuild-3">方法三</button></ul><div class="tab-contents"><div class="tab-item-content active" id="nodebuild-1"><p><strong>对于前端工程师,或正打算学习前端相关知识,建议用<span class='p blue'>nvm</span>来管理<span class='p blue'>Node</span>版本</strong></p></div><div class="tab-item-content" id="nodebuild-2"><p><strong>暂时没写,网上教程较多,建议您百度一下</strong></p></div><div class="tab-item-content" id="nodebuild-3"><p><strong>暂时没写,网上教程较多,建议您百度一下</strong></p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><h2 id="安装-Hexo"><a href="#安装-Hexo" class="headerlink" title="安装 Hexo"></a>安装 Hexo</h2><p>在目标路径打开CMD窗口,输入<span class='p blue'>npm install -g hexo-cli</span>安装<span class='p blue'>Hexo</span>环境。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g hexo-cli</span><br></pre></td></tr></table></figure><br>安装完后输入<span class='p blue'>hexo -v</span>验证是否安装成功。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_001.png"/></div></div></p><h2 id="注册-GitHub-帐号"><a href="#注册-GitHub-帐号" class="headerlink" title="注册 GitHub 帐号"></a>注册 GitHub 帐号</h2><ol><li>进入官网 <span class='p blue'>https://github.com/</span></li><li>点击右上角的 Sign up(注册),不是Sign in(登录)。<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_002.png"/></div></div></li><li>填写自己的邮箱、密码、用户名等信息,然后用邮箱验证即可完成。<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_003.png"/></div></div><h2 id="创建-GitHub-仓库"><a href="#创建-GitHub-仓库" class="headerlink" title="创建 GitHub 仓库"></a>创建 GitHub 仓库</h2>点击右上角的<span class='p blue'>+</span>按钮,选择<span class='p blue'>New repository</span>,创建一个<span class='p blue'><用户名>.github.io</span>的仓库。(请一定用自己的用户名)<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_004.png"/></div></div>找不到创建入口的,访问:<a href="https://github.com/new">https://github.com/new</a><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_005.png"/></div></div></li></ol><ul><li>仓库的格式必须为:<用户名>.github.io</li><li>Description:为描述仓库(选填)</li><li>勾选 Initialize this repository with a README 初始化一个 README.md 文件</li><li>点击 Creat repository 进行创建</li></ul><h2 id="Git安装-amp-amp-连接Github"><a href="#Git安装-amp-amp-连接Github" class="headerlink" title="Git安装 && 连接Github"></a>Git安装 && 连接Github</h2><h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><ol><li>进入官网:<a href="https://git-scm.com/downloads">https://git-scm.com/downloads</a> ,由于官网下载太慢可以通过淘宝的开源镜像下载 网址:<a href="https://registry.npmmirror.com/binary.html?path=git-for-windows/v2.36.1.windows.1/">https://registry.npmmirror.com/binary.html?path=git-for-windows/v2.36.1.windows.1/</a> ,下载版本更具自己的需求选择即可。</li></ol><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_006.png"/></div></div><ol><li>下载后傻瓜式安装Git即可,安装的目录可以使用默认目录【C:/Program Files/Git】,也可以自定义路径。</li><li>点击电脑左下角开始即可看见Git Bash。<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_007.png"/></div></div></li></ol><ul><li>Git CMD 是windows 命令行的指令风格</li><li>Git Bash 是linux系统的指令风格(建议使用)</li><li>Git GUI是图形化界面(新手学习不建议使用</li></ul><ol><li>打开Git Bash后如下图所示即代表安装完成。<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_008.png"/></div></div></li></ol><h3 id="环境配置"><a href="#环境配置" class="headerlink" title="环境配置"></a>环境配置</h3><ol><li>常用命令<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git config -l //查看所有配置</span><br><span class="line"></span><br><span class="line">git config --system --list //查看系统配置</span><br><span class="line"></span><br><span class="line">git config --global --list //查看用户(全局)配置</span><br></pre></td></tr></table></figure></li><li>配置用户名和邮箱<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git config --global user.name <span class="string">"你的用户名"</span></span><br><span class="line"></span><br><span class="line">git config --global user.email <span class="string">"你的邮箱"</span></span><br></pre></td></tr></table></figure>输入后没有报错即代表设置成功。</li></ol><p>通过git config -l 检查是否配置成功,至此git安装及配置全部完成。<br><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_009.png"/></div></div></p><h3 id="连接Github"><a href="#连接Github" class="headerlink" title="连接Github"></a>连接Github</h3><ol><li>生成ssh公钥,执行以下命令<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa -C <span class="string">"你的邮箱"</span></span><br></pre></td></tr></table></figure>之后打开C盘下用户文件夹下的<span class='p blue'>.ssh</span> 的文件夹,会看到 id_rsa.pub<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_010.png"/></div></div></li></ol><p>用记事本打开上述图片中的公钥(id_rsa.pub),复制里面的内容,然后开始在github中配置ssh密钥。</p><ol><li>将 SSH KEY 配置到 GitHub<br>进入github,点击右上角头像 选择<span class='p blue'>settings</span><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_011.png"/></div></div>进入设置页后选择<span class='p blue'>SSH and GPG keys</span> <div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_012.png"/></div></div><div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_013.png"/></div></div></li></ol><div class="note info no-icon simple"><p>注意: 要是有【Key type】的选择项 ,选择默认<span class='p blue'>Authentication Key</span> 即可。</p></div><ol><li>测试连接,输入以下命令<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh -T git@github.com</span><br></pre></td></tr></table></figure>出现如下信息,说明已经大功告成!<div class="img-wrap"><div class="img-bg"><img class="img" src="https://cdn.jsdelivr.net/gh/uEatpeach/Bolg-img/hexoBuild/img/hexoBuild_014.png"/></div></div>以上就是所有步骤,恭喜你已经完成了环境准备工作~</li></ol>]]></content>
<categories>
<category> hexo </category>
</categories>
<tags>
<tag> hexo </tag>
</tags>
</entry>
<entry>
<title>基于 Hexo 从零开始搭建个人博客系列</title>
<link href="/2023/09/20/hexoBuild/"/>
<url>/2023/09/20/hexoBuild/</url>
<content type="html"><![CDATA[<div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>基于 Hexo 从零开始搭建个人博客系列文章:</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2023-09-20 <a href="https://wenkj.xyz/2023/09/20/hexoBuild01/">基于 Hexo 从零开始搭建个人博客(一): 环境准备</a></p></div></div><div class='timeline-item-content'></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2023-09-20 <a href="https://wenkj.xyz/2023/09/21/hexoBuild02/">基于 Hexo 从零开始搭建个人博客(二): 项目初识</a></p></div></div><div class='timeline-item-content'></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2023-09-20 <a href="https://wenkj.xyz/2023/09/21/hexoBuild03/">基于 Hexo 从零开始搭建个人博客(三): 主题安装</a></p></div></div><div class='timeline-item-content'></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2023-09-20 <a href="https://wenkj.xyz/2023/09/22/hexoBuild04/">基于 Hexo 从零开始搭建个人博客(四): 基础配置</a></p></div></div><div class='timeline-item-content'></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2023-09-20 <a href="https://wenkj.xyz/2023/09/22/hexoBuild05/">基于 Hexo 从零开始搭建个人博客(五): 详细配置</a></p></div></div><div class='timeline-item-content'></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2023-09-20 <a href="https://wenkj.xyz/2023/09/22/hexoBuild06/">基于Hexo搭建个人博客相关技能分享</a></p></div></div><div class='timeline-item-content'></div></div></div>]]></content>
<categories>
<category> hexo </category>
</categories>
<tags>
<tag> hexo </tag>
</tags>
</entry>
<entry>
<title>Windows "Win+R"命令行运行常用命令</title>
<link href="/2023/09/07/Win-RCommandLineRunningCommonCommands/"/>
<url>/2023/09/07/Win-RCommandLineRunningCommonCommands/</url>
<content type="html"><![CDATA[<h1 id="Windows-“Win-R”命令行运行常用命令"><a href="#Windows-“Win-R”命令行运行常用命令" class="headerlink" title="Windows “Win+R”命令行运行常用命令"></a>Windows “Win+R”命令行运行常用命令</h1><p>Windows操作系统提供了许多方便的方式来执行各种任务,其中之一是使用”Win+R”运行命令行。这个快捷键组合可以让您迅速启动各种应用程序、工具和系统实用程序,而无需通过开始菜单或桌面快捷方式查找它们。在本文中,我们将介绍一些常用的”Win+R”运行命令,以提高您的Windows使用效率。<br><span id="more"></span></p><h2 id="1-打开应用程序"><a href="#1-打开应用程序" class="headerlink" title="1. 打开应用程序"></a>1. 打开应用程序</h2><ul><li><strong>mspaint</strong>: 打开微软绘图。</li><li><strong>calc</strong>: 打开计算器。</li><li><strong>notepad</strong>: 启动记事本。</li><li><strong>wordpad</strong>: 打开WordPad。</li><li><strong>msconfig</strong>: 打开系统配置实用程序,用于管理启动项和服务。</li></ul><h2 id="2-文件和文件夹操作"><a href="#2-文件和文件夹操作" class="headerlink" title="2. 文件和文件夹操作"></a>2. 文件和文件夹操作</h2><ul><li><strong>explorer</strong>: 打开文件资源管理器,浏览您的计算机文件和文件夹。</li><li><strong>cmd</strong> 或 <strong>powershell</strong>: 启动命令提示符或PowerShell窗口。</li><li><strong>control folders</strong>: 打开文件夹选项,允许您自定义文件夹的外观和行为。</li><li><strong>control printers</strong>: 打开打印机和扫描仪设置。</li></ul><h2 id="3-系统工具"><a href="#3-系统工具" class="headerlink" title="3. 系统工具"></a>3. 系统工具</h2><ul><li><strong>devmgmt.msc</strong>: 打开设备管理器,用于管理计算机的硬件设备。</li><li><strong>diskmgmt.msc</strong>: 打开磁盘管理,允许您管理硬盘分区和驱动器。</li><li><strong>services.msc</strong>: 打开服务管理器,用于管理Windows服务。</li><li><strong>taskmgr</strong>: 打开任务管理器,查看和管理运行中的进程和性能。</li></ul><h2 id="4-网络和互联网"><a href="#4-网络和互联网" class="headerlink" title="4. 网络和互联网"></a>4. 网络和互联网</h2><ul><li><strong>ncpa.cpl</strong>: 打开网络连接,管理网络适配器和连接。</li><li><strong>inetcpl.cpl</strong>: 打开Internet属性,允许您自定义Internet Explorer和Internet选项设置。</li><li><strong>ping [网址或IP地址]</strong>: 使用Ping命令测试与特定网站或IP地址的连接。</li></ul><h2 id="5-快速访问"><a href="#5-快速访问" class="headerlink" title="5. 快速访问"></a>5. 快速访问</h2><ul><li><strong>lusrmgr.msc</strong>: 打开本机用户和组管理。</li><li><strong>oobe/msoobe /a</strong>: 检查XP是否激活。</li><li><strong>cleanmgr</strong>: 垃圾整理。</li><li><strong>net start messenger</strong>: 开始信使服务。</li><li><strong>compmgmt.msc</strong>: 打开计算机管理。</li></ul><h2 id="6-系统维护"><a href="#6-系统维护" class="headerlink" title="6. 系统维护"></a>6. 系统维护</h2><ul><li><strong>rononce -p</strong>: 15秒关机。</li><li><strong>dxdiag</strong>: 检查DirectX信息。</li><li><strong>Msconfig.exe</strong>: 系统配置实用程序。</li><li><strong>mem.exe</strong>: 显示内存使用情况。</li><li><strong>regedit.exe</strong>: 注册表编辑器。</li><li><strong>winchat</strong>: XP自带局域网聊天。</li><li><strong>progman</strong>: 程序管理器。</li><li><strong>winmsd</strong>: 系统信息。</li><li><strong>perfmon.msc</strong>: 计算机性能监测程序。</li><li><strong>winver</strong>: 检查Windows版本。</li><li><strong>sfc /scannow</strong>: 扫描错误并复原。</li></ul><h2 id="7-其他实用程序"><a href="#7-其他实用程序" class="headerlink" title="7. 其他实用程序"></a>7. 其他实用程序</h2><ul><li><strong>wmimgmt.msc</strong>: 打开Windows管理体系结构(WMI)。</li><li><strong>wupdmgr</strong>: Windows更新程序。</li><li><strong>wscript</strong>: Windows脚本宿主设置。</li><li><strong>write</strong>: 写字板。</li><li><strong>wiaacmgr</strong>: 扫描仪和照相机向导。</li></ul><p>这些是一些常见的”Win+R”运行命令,可以帮助您更快捷地访问Windows的各种功能和工具,提高了工作效率和操作便捷性。</p><p>请注意,使用这些命令时要小心,确保您知道它们的用途,以免不小心做出可能导致系统问题的更改。</p><p>希望这篇文章能够帮助您更好地利用Windows操作系统。</p><p>如果您有其他常用的”Win+R”命令或想要了解更多相关信息,请在评论中分享您的想法!</p>]]></content>
<categories>
<category> 随笔 </category>
</categories>
<tags>
<tag> Windows </tag>
</tags>
</entry>
<entry>
<title>MyBatis Mapper XML中比较操作符转义问题</title>
<link href="/2023/08/08/mybatis-xml-escape/"/>
<url>/2023/08/08/mybatis-xml-escape/</url>
<content type="html"><![CDATA[<p></p><h1 id="解决MyBatis-Mapper-XML中比较操作符转义问题-在使用MyBatis编写Mapper-XML时,有时会遇到比较操作符需要进行转义的情况。本文将介绍如何解决比较操作符转义问题。"><a href="#解决MyBatis-Mapper-XML中比较操作符转义问题-在使用MyBatis编写Mapper-XML时,有时会遇到比较操作符需要进行转义的情况。本文将介绍如何解决比较操作符转义问题。" class="headerlink" title="解决MyBatis Mapper XML中比较操作符转义问题 在使用MyBatis编写Mapper XML时,有时会遇到比较操作符需要进行转义的情况。本文将介绍如何解决比较操作符转义问题。"></a>解决MyBatis Mapper XML中比较操作符转义问题 在使用MyBatis编写Mapper XML时,有时会遇到比较操作符需要进行转义的情况。本文将介绍如何解决比较操作符转义问题。</h1><span id="more"></span><h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>假设我们在Mapper XML中需要编写一个查询语句,其中包含了一个比较操作符。<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"getBaseResultMapVo"</span> <span class="attr">parameterType</span>=<span class="string">"java.util.HashMap"</span> <span class="attr">resultType</span>=<span class="string">"BaseResultMapVo"</span>></span></span><br><span class="line"> SELECT pci.id,</span><br><span class="line"> pci.pid,</span><br><span class="line"> pci.case_number,</span><br><span class="line"> pci.rescue_longitude,</span><br><span class="line"> pci.rescue_latitude</span><br><span class="line"> FROM plat_case_info pci</span><br><span class="line"> WHERE pci.pid = #{pId}</span><br><span class="line"> AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <span class="symbol">&lt;</span>= DATE(pci.entry_time)</span><br><span class="line"><span class="tag"></<span class="name">select</span>></span></span><br></pre></td></tr></table></figure></p><p>解决方案<br>有两种常见的解决方案来解决这个问题。</p><p>方法一:转义比较操作符<br>一种解决方案是对比较操作符进行XML转义,将>=替换为>=。修改后的查询语句如下:<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"getBaseResultMapVo"</span> <span class="attr">parameterType</span>=<span class="string">"java.util.HashMap"</span> <span class="attr">resultType</span>=<span class="string">"BaseResultMapVo"</span>></span></span><br><span class="line"> SELECT pci.id,</span><br><span class="line"> pci.pid,</span><br><span class="line"> pci.case_number,</span><br><span class="line"> pci.rescue_longitude,</span><br><span class="line"> pci.rescue_latitude</span><br><span class="line"> FROM plat_case_info pci</span><br><span class="line"> WHERE pci.pid = #{pId}</span><br><span class="line"> AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <span class="symbol">&lt;</span>= DATE(pci.entry_time)</span><br><span class="line"><span class="tag"></<span class="name">select</span>></span></span><br></pre></td></tr></table></figure><br>注意,这里将>=转义为>=。这样做可以防止比较操作符被解析为XML标签。</p><p>当在XML文档中使用特殊字符时,需要进行转义处理,以避免引起语法错误。下面是常见的XML转义字符:<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">>:转义为<span class="symbol">&gt;</span></span><br><span class="line"><:转义为<span class="symbol">&lt;</span></span><br><span class="line">&:转义为<span class="symbol">&amp;</span></span><br><span class="line">":转义为<span class="symbol">&quot;</span></span><br><span class="line">':转义为<span class="symbol">&apos;</span></span><br></pre></td></tr></table></figure><br>方法二:使用CDATA块<br>另一种解决方案是将比较操作符放在CDATA块中。CDATA块会将其中的内容视为纯文本,不会进行任何转义。修改后的查询语句如下:<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"getBaseResultMapVo"</span> <span class="attr">parameterType</span>=<span class="string">"java.util.HashMap"</span> <span class="attr">resultType</span>=<span class="string">"BaseResultMapVo"</span>></span></span><br><span class="line"> <![CDATA[</span><br><span class="line"> SELECT pci.id,</span><br><span class="line"> pci.pid,</span><br><span class="line"> pci.case_number,</span><br><span class="line"> pci.rescue_longitude,</span><br><span class="line"> pci.rescue_latitude</span><br><span class="line"> FROM plat_case_info pci</span><br><span class="line"> WHERE pci.pid = #{pId}</span><br><span class="line"> AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= DATE(pci.entry_time)</span><br><span class="line"> ]]></span><br><span class="line"><span class="tag"></<span class="name">select</span>></span></span><br></pre></td></tr></table></figure><br>通过使用CDATA块,我们可以避免对比较操作符进行转义操作。</p><p>当然你也可以精确到比较操作符上,如:<br><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"getBaseResultMapVo"</span> <span class="attr">parameterType</span>=<span class="string">"java.util.HashMap"</span> <span class="attr">resultType</span>=<span class="string">"BaseResultMapVo"</span>></span></span><br><span class="line"> SELECT pci.id,</span><br><span class="line"> pci.pid,</span><br><span class="line"> pci.case_number,</span><br><span class="line"> pci.rescue_longitude,</span><br><span class="line"> pci.rescue_latitude</span><br><span class="line"> FROM plat_case_info pci</span><br><span class="line"> WHERE pci.pid = #{pId}</span><br><span class="line"> AND DATE_SUB(CURDATE(), INTERVAL 30 DAY) <![CDATA[ <= ]]> DATE(pci.entry_time)</span><br><span class="line"><span class="tag"></<span class="name">select</span>></span></span><br></pre></td></tr></table></figure><br>CDATA块内包含需要转义的特殊字符即可。</p><p>结论<br>当在MyBatis Mapper XML中遇到比较操作符需要进行转义的情况时,可以通过转义操作符或使用CDATA块来解决这个问题。选择其中一种方法即可解决语法错误。</p><p>希望本文对您在解决MyBatis Mapper XML中比较操作符转义问题方面有所帮助。</p><p></p>]]></content>
<categories>
<category> 后端杂谈 </category>
</categories>
<tags>
<tag> MyBatis </tag>
<tag> XML </tag>
</tags>
</entry>
<entry>
<title>在使用 MyBatis Plus 进行开发时,由于自动生成的 ID 过长,重新设置数据库自增长ID的起始值</title>
<link href="/2023/08/04/MyBatis-Plus-bug-first/"/>
<url>/2023/08/04/MyBatis-Plus-bug-first/</url>
<content type="html"><![CDATA[<!-- # description: '在使用 MyBatis Plus 进行开发时,由于自动生成的 ID 过长,重新设置数据库自增长ID的起始值' --><!-- # 解决 MyBatis Plus 自动生成的过长 ID 问题并重新设置数据库自增长ID的起始值 --><h1 id="解决-MyBatis-Plus-自动生成的过长-ID-问题并重新设置数据库自增长ID的起始值"><a href="#解决-MyBatis-Plus-自动生成的过长-ID-问题并重新设置数据库自增长ID的起始值" class="headerlink" title="解决 MyBatis Plus 自动生成的过长 ID 问题并重新设置数据库自增长ID的起始值"></a>解决 MyBatis Plus 自动生成的过长 ID 问题并重新设置数据库自增长ID的起始值</h1><h2 id="问题描述"><a href="#问题描述" class="headerlink" title="问题描述"></a>问题描述</h2><p>在使用 MyBatis Plus 进行开发时,自动生成的 ID 过长可能导致数据库性能下降、索引冗长等问题。因此,需要解决这个问题。</p><span id="more"></span><p>在某种情况下,当使用 MyBatis Plus 自动生成的 ID 过长时,可能导致其他接口无法按照 int 类型查询数据,因为数据库中设计为 bigint 类型,纯了 19 位数字。为解决这个问题,一种简单的方法是使用数据库的自增长主键来替代 MyBatis Plus 自动生成的 ID,避免生成过长的 ID。</p><p>另外,当在 MySQL 数据库中使用了自增长类型的 ID,并删除了部分数据后,可能需要重新设置自增长 ID 的起始值。以下是两种重置自增长 ID 的方法的详细步骤。</p><h2 id="方法1:使用-ALTER-TABLE-命令"><a href="#方法1:使用-ALTER-TABLE-命令" class="headerlink" title="方法1:使用 ALTER TABLE 命令"></a>方法1:使用 ALTER TABLE 命令</h2><p>首先确认要重置自增长 ID 的表名,例如表名为 <code>base_user</code>。</p><p>执行以下 SQL 语句获取表中的最大 ID 值:<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="built_in">MAX</span>(id) <span class="keyword">FROM</span> base_user;</span><br><span class="line">将最大 ID 值加<span class="number">1</span>,并执行以下 <span class="keyword">SQL</span> 语句重置自增长 ID,假设最大 ID 值为 <span class="number">2000</span>:</span><br><span class="line"><span class="keyword">ALTER</span> <span class="keyword">TABLE</span> base_user AUTO_INCREMENT <span class="operator">=</span> <span class="number">2001</span>;</span><br><span class="line">这样,以后插入数据时,自增长 ID 将从 <span class="number">2001</span> 开始递增。</span><br></pre></td></tr></table></figure></p><p>方法2:使用 TRUNCATE TABLE 命令<br>首先确认要重置自增长 ID 的表名,例如表名为 base_user。<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">执行以下 <span class="keyword">SQL</span> 语句来清空表并重置自增长 ID(注意:该命令会删除表中的所有数据,请确保已备份重要数据):</span><br><span class="line"><span class="keyword">TRUNCATE</span> <span class="keyword">TABLE</span> base_user;</span><br><span class="line"><span class="keyword">TRUNCATE</span> <span class="keyword">TABLE</span> 命令将删除表中的所有数据,并重新创建表,自动将自增长 ID 重置为 <span class="number">1</span> 开始。</span><br></pre></td></tr></table></figure><br>注意:在生产环境中,请谨慎使用重置自增长 ID 的方法,以确保数据的完整性和一致性。</p><p>使用数据库自增长主键的解决方案<br>为了解决 MyBatis Plus 自动生成的过长 ID 问题,可以使用数据库的自增长主键来替代 MyBatis Plus 自动生成的 ID,从而生成相对较短的 ID。</p><p>解决方案步骤<br>在实体类的 ID 字段上添加 @TableId(type = IdType.AUTO) 注解,指定使用数据库的自增长主键。示例代码如下:<br><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.IdType;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">YourEntity</span> {</span><br><span class="line"> <span class="meta">@TableId(type = IdType.AUTO)</span></span><br><span class="line"> <span class="keyword">private</span> Long id;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 其他字段</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure><br>在数据库中创建相应的表,并将 ID 字段设置为自增长(一般使用 AUTO_INCREMENT 或类似方法实现)。示例 SQL 代码如下:<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">TABLE</span> your_table (</span><br><span class="line"> id <span class="type">bigint</span> AUTO_INCREMENT <span class="keyword">PRIMARY</span> KEY,</span><br><span class="line"> <span class="comment">-- 其他字段</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure><br>这样,MyBatis Plus 将使用数据库自增长主键来生成 ID,避免了生成过长的 ID。</p><p>请注意,这种简化的解决方案依赖于数据库的自增长主键功能,所以请确保数据库表的设置是支持自增长主键的。</p><p>总结<br>通过使用数据库的自增长主键来替代 MyBatis Plus 自动生成的过长 ID,可以提高数据库性能和索引效率。这是一个简单而有效的解决方案。</p><p>希望这个文档对你有帮助!</p>]]></content>
<categories>
<category> 后端杂谈 </category>
</categories>
<tags>
<tag> MyBatis-Plus </tag>
<tag> MySql </tag>
</tags>
</entry>
<entry>
<title>如何学习Java</title>
<link href="/2023/07/17/my-first-blog/"/>
<url>/2023/07/17/my-first-blog/</url>
<content type="html"><![CDATA[<!-- # 如何学习 Java --><!-- # description: '本文将为您提供一个步骤性的指南,以帮助您开始学习 Java 编程。' --><h2 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h2><p>Java 是一种广泛应用于开发各种类型应用程序的编程语言。它的可移植性、面向对象的特性以及强大的生态系统使其成为许多开发者选择的首选语言。本文将为您提供一个步骤性的指南,以帮助您开始学习 Java 编程。</p><span id="more"></span><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>在开始学习 Java 之前,您需要进行一些准备工作:</p><ul><li>安装 Java 开发工具包(JDK)并进行配置。</li><li>在您的计算机上选择并设置 Java 集成开发环境(IDE)。</li></ul><h2 id="基础知识"><a href="#基础知识" class="headerlink" title="基础知识"></a>基础知识</h2><p>在学习任何编程语言之前,了解其基础知识是至关重要的。以下是您需要掌握的一些 Java 基础知识:</p><ul><li>Java 语言的发展历史和用途。</li><li>Java 的基本语法和命名规范。</li><li>如何编写和运行一个简单的 Java 程序。</li></ul><h2 id="数据类型与变量"><a href="#数据类型与变量" class="headerlink" title="数据类型与变量"></a>数据类型与变量</h2><p>Java 提供了多种数据类型,用于存储不同类型的值。了解这些数据类型并熟练使用变量是编程的基础:</p><ul><li>Java 的基本数据类型,如整数、浮点数、字符和布尔值。</li><li>如何声明和初始化变量,以及变量的作用域。</li></ul><h2 id="运算符与表达式"><a href="#运算符与表达式" class="headerlink" title="运算符与表达式"></a>运算符与表达式</h2><p>了解 Java 运算符和表达式的使用可以进行各种数学和逻辑操作。以下是一些关键点:</p><ul><li>常用的算术、赋值、比较和逻辑运算符的用法。</li><li>如何使用括号来改变运算顺序。</li><li>字符串的连接和比较。</li></ul><h2 id="控制流"><a href="#控制流" class="headerlink" title="控制流"></a>控制流</h2><p>控制流语句允许您根据条件执行不同的代码块,或者多次执行相同的代码。以下是常用的控制流语句:</p><ul><li>条件语句(<code>if-else</code> 和 <code>switch</code>)的使用。</li><li>循环语句(<code>for</code>、<code>while</code> 和 <code>do-while</code>)的使用。</li></ul><h2 id="对象与类"><a href="#对象与类" class="headerlink" title="对象与类"></a>对象与类</h2><p>Java 是一种面向对象的编程语言,它提供了创建和使用对象的机制。以下是与对象和类相关的重要概念:</p><ul><li>什么是类和对象,以及如何定义它们。</li><li>如何使用类的属性和方法。</li><li>如何实例化对象并访问其属性和方法。</li></ul><h2 id="面向对象编程"><a href="#面向对象编程" class="headerlink" title="面向对象编程"></a>面向对象编程</h2><p>面向对象编程(OOP)是 Java 的核心概念之一。了解面向对象编程的原则和实践对于开发复杂的应用程序至关重要:</p><ul><li>封装、继承和多态的概念与用法。</li><li>如何设计良好的类和对象之间的关系。</li></ul><h2 id="异常处理"><a href="#异常处理" class="headerlink" title="异常处理"></a>异常处理</h2><p>在编程过程中,错误和异常是不可避免的。Java 提供了异常处理机制,以帮助您捕获和处理这些异常:</p><ul><li>异常的分类,包括检查型异常和非检查型异常。</li><li>如何使用 <code>try-catch</code> 块来处理异常。</li><li>如何抛出自定义异常。</li></ul><h2 id="核心-API"><a href="#核心-API" class="headerlink" title="核心 API"></a>核心 API</h2><p>Java 提供了丰富的核心类库,其中包括许多常用的类和方法。以下是一些重要的核心 API:</p><ul><li>字符串操作和正则表达式的使用。</li><li>数字和日期操作。</li><li>文件读写和处理。</li></ul><h2 id="进阶学习资源"><a href="#进阶学习资源" class="headerlink" title="进阶学习资源"></a>进阶学习资源</h2><p>学习 Java 是一个持续的过程,以下是一些优秀的学习资源,可以帮助您深入学习 Java 编程:</p><ul><li>书籍推荐:列出一些著名的 Java 编程书籍。</li><li>在线课程:提供一些免费或付费的在线 Java 编程课程。</li><li>社区和开发者论坛:推荐一些活跃的 Java 开发者社区,其中可以获得解答和交流。</li></ul><h2 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h2><p>本文回顾了从学习 Java 的准备工作到掌握核心概念的过程。强调持续实践和深入学习的重要性,鼓励读者在编程旅程中不断探索和创新。</p><p>希望这篇文章能为您提供一个良好的起点,让您能够更具信心地学习和应用 Java 编程技能。</p>]]></content>
<categories>
<category> 语言 </category>
</categories>
<tags>
<tag> Java学习 </tag>
</tags>
</entry>
<entry>
<title>Hello World</title>
<link href="/2019/02/14/hello-world/"/>
<url>/2019/02/14/hello-world/</url>
<content type="html"><![CDATA[<h2 id="Hello-World"><a href="#Hello-World" class="headerlink" title="Hello World"></a>Hello World</h2><span id="more"></span><p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="lt-—"><a href="#lt-—" class="headerlink" title="<!— "></a><!— </h2><p>title:<br>date:<br>updated:<br>type:<br>comments:<br>description:<br>keywords:<br>top_img:<br>mathjax:<br>katex:<br>aside:<br>aplayer:<br>highlight_shrink:<br>random:<br>—- —><br><!-- 写法 解释title 【必需】页面标题date 【必需】页面创建日期type 【必需】标签、分类和友情链接三个页面需要配置updated 【可选】页面更新日期description 【可选】页面描述keywords 【可选】页面关键字comments 【可选】显示页面评论模块 (默认 true)top_img 【可选】页面顶部图片mathjax 【可选】显示mathjax (当设置mathjax的per_page: false时,才需要配置,默认 false)katex 【可选】显示katex (当设置katex的per_page: false时,才需要配置,默认 false)aside 【可选】显示侧边栏 (默认 true)aplayer 【可选】在需要的页面加载aplayer的js和css,请参考文章下面的音乐 配置highlight_shrink 【可选】配置代码框是否展开 (true/false) (默认为设置中highlight_shrink的配置)random 【可选】配置友情链接是否随机排序(默认为 false) --></p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><!--more--><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p><!-- <link rel="stylesheet" href="https://cdn1.tianli0.top/gh/zhheo/Post-Abstract-AI@0.11/tianli_gpt.css"><script>let tianliGPT_postSelector = '#post #article-container';let tianliGPT_key = '5Q5mpqRK5DkwT1X9Gi5e';</script><script src="https://cdn1.tianli0.top/gh/zhheo/Post-Abstract-AI@0.11/tianli_gpt.js"></script> -->]]></content>
<categories>
<category> 语言 </category>
</categories>
<tags>
<tag> MyBatis-Plus </tag>
<tag> MySql </tag>
<tag> Windows </tag>
<tag> Java学习 </tag>
<tag> MyBatis </tag>
<tag> XML </tag>
</tags>
</entry>
</search>