-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
2154 lines (1970 loc) · 480 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
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>计算机网络-HTTP的几种请求</title>
<url>/2022/03/17/HTTP/</url>
<content><![CDATA[<h1 id="HTTP"><a href="#HTTP" class="headerlink" title="HTTP"></a>HTTP</h1><h1 id="HTTP请求方法"><a href="#HTTP请求方法" class="headerlink" title="HTTP请求方法"></a>HTTP请求方法</h1><blockquote>
<p>HTTP请求方法表明了要对给定资源执行的操作,每一个请求方法都实现了不同的语义,包括:GET,HEAD.POST,PUT,PATCH,DELECT,OPTIONS,以及不常用的CONNECT,TRACE.</p>
</blockquote>
<h3 id="GET"><a href="#GET" class="headerlink" title="GET"></a>GET</h3><p>获取服务器的指定资源。</p>
<h3 id="HEAD"><a href="#HEAD" class="headerlink" title="HEAD"></a>HEAD</h3><p>与 GET 方法一样,都是发出一个获取服务器指定资源的请求,但服务器只会返回 Header 而不会返回 Body。用于确认 URI 的有效性及资源更新的日期时间等。一个典型应用是下载文件时,先通过 HEAD 方法获取 Header,从中读取文件大小 <code>Content-Length</code>;然后再配合 <code>Range</code> 字段,分片下载服务器资源</p>
<span id="more"></span>
<h3 id="POST"><a href="#POST" class="headerlink" title="POST"></a>POST</h3><p>提交资源到服务器或者在服务器上新建资源</p>
<h3 id="PUT"><a href="#PUT" class="headerlink" title="PUT"></a>PUT</h3><p>:替换整个目标资源</p>
<h3 id="PATCH"><a href="#PATCH" class="headerlink" title="PATCH"></a>PATCH</h3><p>:替换目标资源的部分内容</p>
<h3 id="DELETE"><a href="#DELETE" class="headerlink" title="DELETE"></a>DELETE</h3><p>:指定的资源。</p>
<h3 id="OPTIONS"><a href="#OPTIONS" class="headerlink" title="OPTIONS"></a>OPTIONS</h3><p>:用于描述目标资源的通信选项。可以用于检测服务器支持哪些 HTTP 方法,或者在 CORS 中发起一个预检请求,以检测实际请求是否可以被服务器所接受</p>
<h3 id="CONNECT"><a href="#CONNECT" class="headerlink" title="CONNECT"></a>CONNECT</h3><p>:建立一个到由目标资源标识的服务器的隧道</p>
<h3 id="TRACE"><a href="#TRACE" class="headerlink" title="TRACE"></a>TRACE</h3><p>:执行一个消息环回测试,返回到服务端的路径。客户端请求连接到目标服务器时可能会通过代理中转,通过 TRACE 方法可以查询发送出去的请求的一系列操作(<a href="https://imageslr.com/media/15993132198241.jpg">图示</a>)</p>
<h3 id="幂等的"><a href="#幂等的" class="headerlink" title="幂等的"></a><strong>幂等的</strong></h3><p> 一个HTTP方法是幂等的,指的是同样的请求执行一次与执行多次的效果是一样的 ,幂等方法不应该具有副作用。</p>
<ul>
<li>常见的幂等方法: GET HEAD PUT DELETE OPTIONS</li>
<li>常见的非幂等方法:POST</li>
</ul>
<h3 id="安全的"><a href="#安全的" class="headerlink" title="安全的"></a><strong>安全的</strong></h3><p> 一个HTTP方法是幂等的,说明此方法只对服务器进行只读的方法,不会修改服务器数据。</p>
<ul>
<li>常见的安全方法:GET,HEAD,OPTIONS</li>
<li>常见的不安全方法:PUT,DELETE,POST</li>
<li>所有安全的方法都是幂等的;有些不安全的方法如 DELETE 是幂等的,有些不安全的方法如 PUT 和 DELETE 则不是</li>
</ul>
<p><strong>可缓存的</strong>:GET、HEAD。</p>
<h3 id="GET与POST的区别"><a href="#GET与POST的区别" class="headerlink" title="GET与POST的区别"></a>GET与POST的区别</h3><table>
<thead>
<tr>
<th align="left"></th>
<th align="left">GET</th>
<th>POST</th>
</tr>
</thead>
<tbody><tr>
<td align="left">应用</td>
<td align="left">获取浏览器的数据</td>
<td>添加/修改浏览器的数据</td>
</tr>
<tr>
<td align="left">历史记录 / 书签</td>
<td align="left">可保留在浏览器历史记录中,或者收藏为书签</td>
<td>不可以</td>
</tr>
<tr>
<td align="left">Cacheable</td>
<td align="left">会被浏览器缓存</td>
<td>不会缓存</td>
</tr>
<tr>
<td align="left">幂等</td>
<td align="left">幂等,不会改变浏览器上的资源。</td>
<td>非幂等</td>
</tr>
<tr>
<td align="left">后退/刷新</td>
<td align="left">GET是无害的</td>
<td>重复提交POST表单</td>
</tr>
<tr>
<td align="left">参数位置</td>
<td align="left">query 中(直接明文暴露在链接中)</td>
<td>query 或 body 中</td>
</tr>
<tr>
<td align="left">参数长度</td>
<td align="left">2KB(2048个字符)</td>
<td>无限制</td>
</tr>
</tbody></table>
<h2 id="HTTP状态码"><a href="#HTTP状态码" class="headerlink" title="HTTP状态码"></a>HTTP状态码</h2><h3 id="信息响应(100–199)"><a href="#信息响应(100–199)" class="headerlink" title="信息响应(100–199)"></a>信息响应(100–199)</h3><ul>
<li>100 Continue:表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应</li>
</ul>
<h3 id="成功响应-200-299"><a href="#成功响应-200-299" class="headerlink" title="成功响应(200-299)"></a>成功响应(200-299)</h3><ul>
<li>200 OK</li>
<li>201 Created 该请求已成功,并因此创建了一个新的资源,这通常是在POST请求之后后悔的响应</li>
<li>204 No Content:该请求已成功处理,但是返回的响应报文不包含实体的主体部分。通常用于只需要从客户端往服务器发送信息,而不需要返回数据时</li>
<li>206 Partial Content:服务器已经成功处理了部分 GET 请求,该请求必须包含 <code>Range</code> 头信息来指示客户端希望得到的内容范围。通常使用此类响应来实现断点续传,或者将一个大文档分为多个片段然后并行下载</li>
</ul>
<p>重定向(300-399)</p>
<ul>
<li><p>301 Moved Permanently:永久性重定向</p>
</li>
<li><p>302 临时性重定向,常见应用场景是是通过 302 跳转将所有的 HTTP 流量重定向到 HTTPS</p>
</li>
<li><p>303 See Other :和302有着相同的功能,但303明确要求客户端应该采用GET方法获取资源</p>
</li>
<li><p><strong>304 Not Modified</strong>:如果客户端发送了一个带条件的 GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个状态码。304 响应不包含消息体</p>
</li>
<li><p><strong>307 Temporary Redirect</strong>:临时重定向。307 与 302 之间的唯一区别在于,当发送重定向请求的时候,307 状态码可以确保<strong>请求方法</strong>和消息主体不会发生变化;而如果使用 302 响应状态码,一些旧客户端会错误地将请求方法转换为 GET</p>
</li>
</ul>
<h3 id="客户端错误-400-499"><a href="#客户端错误-400-499" class="headerlink" title="客户端错误(400- 499)"></a>客户端错误(400- 499)</h3><ul>
<li>400 Bad Request :请求报文中存在语法问题,或者参数有误。</li>
<li>401 Unauthorized:未认证(没有登录)</li>
<li>403 Forbidden :没有权限(登陆了但没有权限)</li>
<li>404 Not Found :找不到资源</li>
<li>405 Method Not Allowed</li>
</ul>
<h3 id="服务器错误-500-599"><a href="#服务器错误-500-599" class="headerlink" title="服务器错误(500-599)"></a>服务器错误(500-599)</h3><ul>
<li><p>500 Internet Server error :服务器遇见了不知道如何处理的情况</p>
</li>
<li><p>502 Bad Gateway:网关错误,作为网关或代理角色的服务器,从上游服务器(如tomcat、php-fpm)中接收到的响应是无效的</p>
</li>
<li><p>Service Unavailable:服务器无法处理请求,常见原因是服务器因维护或重载而停机</p>
</li>
</ul>
]]></content>
<tags>
<tag>计算机网络</tag>
</tags>
</entry>
<entry>
<title>JAVA基础复习</title>
<url>/2022/06/29/Java%E5%9F%BA%E7%A1%80%E5%A4%8D%E4%B9%A0/</url>
<content><![CDATA[<h1 id="Java基础复习"><a href="#Java基础复习" class="headerlink" title="Java基础复习"></a>Java基础复习</h1><h2 id=""><a href="#" class="headerlink" title=""></a><span id="more"></span></h2><h2 id="1、-与equals方法"><a href="#1、-与equals方法" class="headerlink" title="1、== 与equals方法"></a>1、== 与equals方法</h2><p>对于八种基本数据类型来说(byte short int long float double boolean char) == 是比较的值 而八种基本数据类型 是没有equals方法的</p>
<p>对于引用数据类型来说 == 比较的是对象的内存地址 而equals比较的字面值(例:String类型)</p>
<h2 id="2、Synchronized关键字"><a href="#2、Synchronized关键字" class="headerlink" title="2、Synchronized关键字"></a>2、Synchronized关键字</h2><h3 id="作用"><a href="#作用" class="headerlink" title="作用"></a>作用</h3><ul>
<li><strong>原子性</strong>:<strong>所谓原子性就是指一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。</strong>被<code>synchronized</code>修饰的类或对象的所有操作都是原子的,因为在执行操作之前必须先获得类或对象的锁,直到执行完才能释放。</li>
<li><strong>可见性</strong>:**可见性是指多个线程访问一个资源时,该资源的状态、值信息等对于其他线程都是可见的。 **synchronized和volatile都具有可见性,其中synchronized对一个类或对象加锁时,一个线程如果要访问该类或对象必须先获得它的锁,而这个锁的状态对于其他任何线程都是可见的,并且在释放锁之前会将对变量的修改刷新到共享内存当中,保证资源变量的可见性。</li>
<li><strong>有序性</strong>:<strong>有序性值程序执行的顺序按照代码先后执行。</strong> synchronized和volatile都具有有序性,Java允许编译器和处理器对指令进行重排,但是指令重排并不会影响单线程的顺序,它影响的是多线程并发执行的顺序性。synchronized保证了每个时刻都只有一个线程访问同步代码块,也就确定了线程执行同步代码块是分先后顺序的,保证了有序性。</li>
</ul>
<p><strong>Synchronized主要有三种用法</strong>:</p>
<ul>
<li>修饰实例方法: 作用于当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁</li>
</ul>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">synchronized</span> <span class="keyword">void</span> <span class="title">method</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="comment">//业务代码</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li><strong>修饰静态方法:</strong> 也就是给当前类加锁,会作用于类的所有对象实例 ,进入同步代码前要获得 <strong>当前 class 的锁</strong>。因为静态成员不属于任何一个实例对象,是类成员( <em>static 表明这是该类的一个静态资源,不管 new 了多少个对象,只有一份</em>)。所以,如果一个线程 A 调用一个实例对象的非静态 <code>synchronized</code> 方法,而线程 B 需要调用这个实例对象所属类的静态 <code>synchronized</code> 方法,是允许的,不会发生互斥现象,<strong>因为访问静态 <code>synchronized</code> 方法占用的锁是当前类的锁,而访问非静态 <code>synchronized</code> 方法占用的锁是当前实例对象锁</strong>。</li>
</ul>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">synchronized</span> <span class="keyword">void</span> staic <span class="title">method</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="comment">//业务代码</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<ul>
<li><strong>修饰代码块</strong> :指定加锁对象,对给定对象/类加锁。<code>synchronized(this|object)</code> 表示进入同步代码库前要获得<strong>给定对象的锁</strong>。<code>synchronized(类.class)</code> 表示进入同步代码前要获得 <strong>当前 class 的锁</strong></li>
</ul>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">synchronized</span>(<span class="keyword">this</span>) {</span><br><span class="line"> <span class="comment">//业务代码</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="3-Java容器"><a href="#3-Java容器" class="headerlink" title="3.Java容器"></a>3.Java容器</h2><h3 id="一、Collection"><a href="#一、Collection" class="headerlink" title="一、Collection"></a>一、Collection</h3><p>简单来说就是单个集合的元素</p>
<p>分为List、Set、Queue三大类</p>
<p>List有ArrayList(底层由数组组成 查找快 支持随机访问) LinkedList(底层由双向链表组成 修改快 还可以做栈 队列 以及双向队列) 以及Vector(线程安全 但是效率低 很少用)</p>
<h4 id="List"><a href="#List" class="headerlink" title="List"></a>List</h4><h5 id="ArrayList"><a href="#ArrayList" class="headerlink" title="ArrayList"></a>ArrayList</h5><p>JDK 7 以无参数构造方法创建 ArrayList 时,直接创建了长度是10的Object[]数组elementData 。</p>
<p>JDK 8 以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。</p>
<p>底层为一个Object类型的数组 初始长度为0;若采用了泛型 ArrayList<String> list = new ArrayList<>();</p>
<p>则生成的是String[]类型的数组 初始长度为0</p>
<h6 id="扩容"><a href="#扩容" class="headerlink" title="扩容"></a>扩容</h6><p>当初始长度为10已经加入了十个元素之后,我们需要再加一个元素的时候,我们就需要扩容</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220629135732.png"></p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(E e, Object[] elementData, <span class="keyword">int</span> s)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (s == elementData.length)</span><br><span class="line"> elementData = grow();</span><br><span class="line"> elementData[s] = e;</span><br><span class="line"> size = s + <span class="number">1</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>这段源代码就是ArrayList的add()方法 如果添加的元素已经满了 则调用grow()函数 很明显 这是一个扩容函数</p>
<p>grow函数有两个 一个有参函数 一个无参函数</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220629141034.png"></p>
<p>无参参数会调用有参参数 进行1.5倍的扩容</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">ArrayList list1 = <span class="keyword">new</span> ArrayList(<span class="number">23</span>);</span><br></pre></td></tr></table></figure>
<p>这表示着生成了一个初始长度为23的ArrayList数组</p>
<h5 id="Vector"><a href="#Vector" class="headerlink" title="Vector"></a>Vector</h5><p>和ArrayList数组类似 线程安全 效率低 用的很少 </p>
<p>但是我们用的Stack(栈)则是基于Vector设计的</p>
<p>实现栈</p>
<p>Stack继承Vector 是Vector的子类</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220629142617.png"></p>
<h5 id="LinkedList"><a href="#LinkedList" class="headerlink" title="LinkedList"></a>LinkedList</h5><p>基于双向链表实现 增删元素效率高 查询效率低</p>
<p>LinkedList可以用作栈 队列 以及双向队列</p>
<h4 id="Set"><a href="#Set" class="headerlink" title="Set"></a>Set</h4><p>集合 无序可去重的集合</p>
<h5 id="TreeSet"><a href="#TreeSet" class="headerlink" title="TreeSet"></a>TreeSet</h5><p> 无序 不可重复 自动排序 相当于存放在TreeMap的Key部分</p>
<h5 id="HashSet"><a href="#HashSet" class="headerlink" title="HashSet"></a>HashSet</h5><p> 无序 不可重复 支持快速查找 存放在HashMap中相当于key部分</p>
<h5 id="LinkedHashSet"><a href="#LinkedHashSet" class="headerlink" title="LinkedHashSet"></a>LinkedHashSet</h5><p> 基于双向链表实现,具有HashSet的查找效率</p>
<h4 id="Queue"><a href="#Queue" class="headerlink" title="Queue"></a>Queue</h4><h5 id="LinkedList-1"><a href="#LinkedList-1" class="headerlink" title="LinkedList"></a>LinkedList</h5><p>可以用他来实现双向队列</p>
<h5 id="PriorityQueue"><a href="#PriorityQueue" class="headerlink" title="PriorityQueue"></a>PriorityQueue</h5><p>用于堆实现 可以用它实现优先队列</p>
<h3 id="二、Map"><a href="#二、Map" class="headerlink" title="二、Map"></a>二、Map</h3><p>映射类型 Key - Value类型结构、</p>
<h4 id="HashMap"><a href="#HashMap" class="headerlink" title="HashMap"></a>HashMap</h4><p>比如最为常见的HashMap</p>
<p>JDK 1.7 底层是数组+链表</p>
<p>JDK 1.8 底层是数组+链表+红黑树 加入红黑树的目的是增加HashMap的插入和查询速率</p>
<p>HaashMap通过key进行hashcode与 与运算 得到下标。</p>
<p>HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。</p>
<p>HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。</p>
<p>HashMap 是无序的,即不会记录插入的顺序。</p>
<p>HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220629151158.png"></p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException, Exception </span>{</span><br><span class="line"> HashMap<String,String> map = <span class="keyword">new</span> HashMap<>();</span><br><span class="line"> map.put(<span class="string">"1"</span>,<span class="string">"one"</span>);</span><br><span class="line"> map.put(<span class="string">"2"</span>,<span class="string">"two"</span>);</span><br><span class="line"> map.put(<span class="string">"3"</span>,<span class="string">"three"</span>);</span><br><span class="line"> map.put(<span class="string">"4"</span>,<span class="string">"four"</span>);</span><br><span class="line"> System.out.println(map);</span><br><span class="line"></span><br><span class="line"> HashMap<String, String> Sites = <span class="keyword">new</span> HashMap<String, String>();</span><br><span class="line"> <span class="comment">// 添加键值对</span></span><br><span class="line"> Sites.put(<span class="string">"one"</span>, <span class="string">"Google"</span>);</span><br><span class="line"> Sites.put(<span class="string">"two"</span>, <span class="string">"Runoob"</span>);</span><br><span class="line"> Sites.put(<span class="string">"three"</span>, <span class="string">"Taobao"</span>);</span><br><span class="line"> Sites.put(<span class="string">"four"</span>, <span class="string">"Zhihu"</span>);</span><br><span class="line"> Sites.put(<span class="string">"apple"</span>,<span class="string">"lll"</span>);</span><br><span class="line"> System.out.println(Sites);</span><br><span class="line"> <span class="comment">// key=商品名称,value=价格,这里以这个例子实现按名称排序和按价格排序.</span></span><br><span class="line"> Map store = <span class="keyword">new</span> HashMap();</span><br><span class="line"></span><br><span class="line"> store.put(<span class="string">"iphone12"</span>, <span class="number">6799</span>);</span><br><span class="line"> store.put(<span class="string">"iphone12pro"</span>, <span class="number">8499</span>);</span><br><span class="line"> store.put(<span class="string">"macbookPro"</span>, <span class="number">19499</span>);</span><br><span class="line"> store.put(<span class="string">"ipadAir"</span>, <span class="number">6999</span>);</span><br><span class="line"> store.put(<span class="string">"watch6"</span>, <span class="number">3199</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 直接输出HashMap得到的是一个无序Map(不是Arraylist那种顺序型储存)</span></span><br><span class="line"> System.out.println(store);</span><br><span class="line"></span><br><span class="line"><span class="comment">// {ipadAir=6999, iphone12pro=8499, macbookPro=19499, watch6=3199, iphone12=6799}</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>
<p>起初我验证Map的无序的时候 输出的总是有序的 增加了样本之后才变得无序</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220629152545.png"></p>
<p>但是输入 它内部就有机构形成 无论你是输出十遍还是一百遍 他都是输出一样的顺序 </p>
<p>这就是HashMap的无序性和有序性</p>
<p>采用拉链法解决哈希冲突</p>
<p>JDK1.7采用头插法,有可能形成回路 </p>
<p>JDK1.8以后采用尾插法</p>
<p>HashMap的默认初始容量为16</p>
<ul>
<li><p>必须是 2 的次幂,这也是 jdk 官⽅推荐的 </p>
</li>
<li><p>这是因为达到散列均匀,为了提⾼ HashMap 集合的存取效率,所必须的 </p>
</li>
</ul>
<p> HashMap 默认加载因⼦:0.75 </p>
<p>数组容器达到 3/4 时,开始扩容 </p>
<p> JDK 8 之后,对 HashMap 底层数据结构(单链表)进⾏了改进 </p>
<ul>
<li><p>如果单链表元素超过8个,则将单链表转变为红⿊树; </p>
</li>
<li><p>如果红⿊树节点数量⼩于6时,会将红⿊树重新变为单链表。</p>
</li>
</ul>
<p>hashcode() :通过调用Hashcode()方法得到key的哈希值</p>
<p>通过哈希函数/哈希算法 转换成数组的下表</p>
<p>重写Hashcode()和equals()的原因是</p>
<p>需要达到散列分布均匀</p>
<h2 id="4-JVM-JRE-JDK的区别"><a href="#4-JVM-JRE-JDK的区别" class="headerlink" title="4.JVM,JRE,JDK的区别"></a>4.JVM,JRE,JDK的区别</h2><p>总的来说 JVM包括JRE JRE包括JVM</p>
<p>Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。</p>
]]></content>
<tags>
<tag>JAVA</tag>
</tags>
</entry>
<entry>
<title>Redis-Redis学习</title>
<url>/2022/04/13/Redis/</url>
<content><![CDATA[<h1 id="Redis"><a href="#Redis" class="headerlink" title="Redis"></a>Redis</h1><h2 id="1-NoSQL数据库-Not-Only-SQL"><a href="#1-NoSQL数据库-Not-Only-SQL" class="headerlink" title="1.NoSQL数据库(Not Only SQL)"></a>1.NoSQL数据库(Not Only SQL)</h2><h3 id="概述:"><a href="#概述:" class="headerlink" title="概述:"></a>概述:</h3><p>是一种非关系型数据库 </p>
<p>我们以前学的Mysql Oracle都属于关系式数据库</p>
<span id="more"></span>
<h2 id="特点:"><a href="#特点:" class="headerlink" title="特点:"></a>特点:</h2><ul>
<li>Redis不支持ACID</li>
<li>不遵循SQL标准</li>
<li>远超于SQL的性能</li>
</ul>
<h2 id="适用场景"><a href="#适用场景" class="headerlink" title="适用场景"></a>适用场景</h2><p>对数据高并发的读写</p>
<p>海量数据的读写</p>
<p>对数据高可扩展醒的</p>
<h2 id="不适用场景"><a href="#不适用场景" class="headerlink" title="不适用场景"></a>不适用场景</h2><ul>
<li>需要事物支持</li>
<li>基于sql的结构化查询存储,处理复杂的关系。</li>
</ul>
<p>扩展: MongoDB 文档型数据库</p>
<p> Memcached 是以前的NoSQL数据库</p>
<h2 id="Redis安装"><a href="#Redis安装" class="headerlink" title="Redis安装"></a>Redis安装</h2><p>官网下载地址 <a href="https://redis.io/download/">https://redis.io/download/</a></p>
<p>推荐使用工具Xshell + XFTP 在Linux服务器上启动</p>
<p>后台启动命令</p>
<p>redis-cli</p>
<p>Redis是一个开源的key-value存储系统</p>
<p>和Memcached类似,它支持存储value的类型相对更多,包括String(字符串)、list(链表)、set(集合)、zset(sorted set–有序集合)和hash(哈希类型)。</p>
<p>这些数据类型都支持push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。</p>
<p>在此基础上,Redis支持各种不同方式的排序。</p>
<p>与memcached一样,为了保证效率,数据都是缓存在内存中。</p>
<p>常用五大数据类型</p>
<ul>
<li>String </li>
<li>List</li>
<li>Set</li>
<li>Hash</li>
<li>sorted set</li>
</ul>
<h2 id="Redis键-Key"><a href="#Redis键-Key" class="headerlink" title="Redis键(Key)"></a>Redis键(Key)</h2><p>key *查看当前库所有key</p>
<p>exist key 判断某个key是否存在</p>
<p>type key查看你的key是什么类型</p>
<p>del key删除指定的key数据</p>
<p>unlink key 根据value选择非阻塞删除</p>
<p>expire key 10 10秒钟:为给定的Key设置过期时间</p>
<p>tll key查看还有多少秒过期 -1白送永不过期 -2表示已经过期。</p>
<p>select命令切换数据库</p>
<p>dbsize 查看当前数据库的key的数量</p>
<p>flushdb 清空当前库</p>
<p>flushall 通杀全部库</p>
<p>String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M</p>
<h2 id="常用命令"><a href="#常用命令" class="headerlink" title="常用命令"></a>常用命令</h2><p>set <key> <value></p>
<p>添加键值对</p>
<p>例子</p>
<p><code>set 1 2</code></p>
<p><code> get 1</code> 结果为2</p>
<p><code>set 1 3</code> 当key相同时,后面的value会覆盖前面的</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220414135627.png"></p>
<p>append 类似于StringBuilder的append()方法</p>
<p><code>append 1 100</code> 3+100 ->3100 返回的是字符串添加后的长度</p>
<p>strlen 类似于length()方法</p>
<p><code>strlen 1 </code> 求key为1的字符串长度</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220414135935.png"></p>
<p>setnx <key><value>只有在 key 不存在时 设置 key 的值</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220414140042.png"></p>
<p><code>incr</code> 将key储存的value加1 只能对数字类型进行操作 如果为空,新增值为1</p>
<p><code>decr</code> 将key储存的value-1 只能对数字值操作,如果为空,新增值为-1</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220414140622.png"></p>
<p>incrby / decrby <key><步长>将 key 中储存的数字值增减。自定义步长。</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220414140706.png"></p>
<p>mset<key1><value><key2><value2>…</p>
<p>同时设置一个或多个key-value对</p>
<p>mget<key1><key2>…</p>
<p>同时获取一个或者多个value</p>
<p>msetnx<key1><value><key2><vallue2>…</p>
<p>同时设置一个或者多个key-value对,当且仅当所有给定key都不存在。</p>
<p><strong>原子性 有一个失败则都失败。</strong></p>
<h2 id="数据结构"><a href="#数据结构" class="headerlink" title="数据结构"></a>数据结构</h2><p>String的数据结构为简单动态字符串。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余的方式来减少内存的频繁分配</p>
<h1 id="Redis-三-列表-List"><a href="#Redis-三-列表-List" class="headerlink" title="Redis(三) 列表(List)"></a>Redis(三) 列表(List)</h1><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>单键多值</p>
<p>Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。</p>
<p>它的底层实际是个<strong>双向链表</strong> 对两端的操作性能都很高,通过索引下标的操作中间的节点性能会较差。</p>
<h2 id="常用命令-1"><a href="#常用命令-1" class="headerlink" title="常用命令"></a>常用命令</h2><p><code>Ipush/rpush</code><key><value1><value2><values2><value></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419143554.png"></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419144025.png"></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419144044.png"></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419195322.png"></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419195407.png"></p>
<p>lpop把最左边吞出 rpop把最右边吞出 </p>
<p>不出意外我们k1列表里应该是 V2 V1 V2 V3 V4 V5的顺序</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419195545.png"></p>
<p><code>lrange k1 0 -1</code> lrange 表示从左边开始的范围 0表示左边第一个 -1表示右边第一个</p>
<p>以此类推 1表示左边第二个,-2表示右边第二个</p>
<p><code>lindex k1 3</code>表示从左边输出k1中序列为3的value值 (下标为0开始 所以这个是左边第四个)</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419195739.png"></p>
<p>获取k1的长度 <code>llen k1</code></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419195857.png"></p>
<p><code>linsert k1 before v1 v7</code>表示在v1之前插入v7</p>
<p>v1不能有重复 否则会返回-1</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419200100.png"></p>
<p><code>lrem key n value</code>删除左边前n个的value元素</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419200244.png"></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419200432.png"></p>
<p><code>lrem k1 2 v2 </code> </p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419200532.png"></p>
<h2 id="数据结构-1"><a href="#数据结构-1" class="headerlink" title="数据结构"></a>数据结构</h2><p>QuickList</p>
<p>在列数元素较少的情况下 会使用一块连续内存</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419200713.png"></p>
<h1 id="Redis-四-Set"><a href="#Redis-四-Set" class="headerlink" title="Redis(四) Set"></a>Redis(四) Set</h1><h2 id="简介-1"><a href="#简介-1" class="headerlink" title="简介"></a>简介</h2><p>Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以****自动排重****的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。</p>
<p>Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的****复杂度都是O(1)****。</p>
<p>一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变</p>
<p>set类似于HashSet 是无序去重的</p>
<h2 id="常用命令-2"><a href="#常用命令-2" class="headerlink" title="常用命令"></a>常用命令</h2><p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419201507.png"></p>
<p>刚开始报错是 已经存在一个key了 就是我直接用的list的k1还存在 无法存入k1为key的set集合</p>
<p><code>sadd k8 v1 v1 v2</code></p>
<p>使用<code>smembers k8</code>展示 发现两个v1只存在于一个 证明Set的去重</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419201805.png"></p>
<p><code>sismember k8 v1</code>判断k8中是否含有v1这样的值</p>
<p>如果有返回1 没有返回0</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419201915.png"></p>
<p> <code>scard k8</code>k8的元素个数</p>
<p><code>sream k8 v1 v2</code> 删除k8里面的v1与v2元素</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419202124.png"></p>
<p><code>spop k8</code> 表示随机吐出k8的value并删除</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419202227.png"></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419202332.png"></p>
<p>srandmember <key><n>随机从该集合中取出n个值。不会从集合中删除 。</p>
<p><code>srandmember k10 5</code>随机从k10里面吐出5个元素并且不会删除</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419202439.png"></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419202538.png"></p>
<p>smove <source><destination>value把集合中一个值从一个集合移动到另一个集合</p>
<p><code>smove k10 k11 v2</code> 把k10里面的v2移入到k11里面去</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419202811.png"></p>
<p>sinter <key1><key2>返回两个集合的交集元素。</p>
<p>sunion <key1><key2>返回两个集合的并集元素。</p>
<p>sdiff <key1><key2>返回两个集合的****差集****元素(key1中的,不包含key2中的)</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419202942.png"></p>
<h2 id="数据结构-2"><a href="#数据结构-2" class="headerlink" title="数据结构"></a>数据结构</h2><p>Set数据结构是dict字典,字典是用哈希表实现的。</p>
<p>Java中HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。</p>
<h1 id="Redis-五-Hash"><a href="#Redis-五-Hash" class="headerlink" title="Redis(五) Hash"></a>Redis(五) Hash</h1><h2 id="简介-2"><a href="#简介-2" class="headerlink" title="简介"></a>简介</h2><p>Redis hash 是一个键值对集合</p>
<p>Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。</p>
<p>类似Java里面的Map<String,Object></p>
<h2 id="常用命令-3"><a href="#常用命令-3" class="headerlink" title="常用命令"></a>常用命令</h2><p>hset <key><field><value>给<key>集合中的 <field>键赋值<value></p>
<p>hget <key1><field>从<key1>集合<field>取出 value </p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419203151.png"></p>
<p><code>hmset <key1><field1><value1><field2><value2>... 批量设置hash的值</code></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419203325.png"></p>
<p><code>hexists<key1><field>查看哈希表 key 中,给定域 field 是否存在。</code></p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419203443.png"></p>
<p>如果存在返回1 不存在返回0</p>
<p>hkeys <key>列出该hash集合的所有field</p>
<p>hvals <key>列出该hash集合的所有value</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419203542.png"></p>
<p>hincrby <key><field><increment>为哈希表 key 中的域 field 的值加上增量 1 -1</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419203717.png"></p>
<p>id增长为2了</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419203800.png"></p>
<p>hsetnx <key><field><value>将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 .</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419203852.png"></p>
<p>设置失败 因为field id存在</p>
<h2 id="数据结构-3"><a href="#数据结构-3" class="headerlink" title="数据结构"></a>数据结构</h2><p>Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable。</p>
<h1 id="Redis-六-Zest-sorted-set"><a href="#Redis-六-Zest-sorted-set" class="headerlink" title="Redis(六) Zest(sorted set)"></a>Redis(六) Zest(sorted set)</h1><h2 id="简介-3"><a href="#简介-3" class="headerlink" title="简介"></a>简介</h2><p>Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。</p>
<p>不同之处是有序集合的每个成员都关联了一个<em><strong>*评分(score)*</strong></em>,这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以 是重复了 。</p>
<p>因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。</p>
<p>访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。</p>
<h2 id="常用命令-4"><a href="#常用命令-4" class="headerlink" title="常用命令"></a>常用命令</h2><p>zadd <key><score1><value1><score2><value2>…</p>
<p>将一个或多个 member 元素及其 score 值加入到有序集 key 当中。</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419204852.png"></p>
<p><em><strong>*zrange <key><start><stop> [WITHSCORES]*</strong></em> </p>
<p>返回有序集 key 中,下标在<start><stop>之间的元素</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419204936.png"></p>
<p>会按照分数顺序返回</p>
<p>带WITHSCORES,可以让分数一起和值返回到结果集。</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419205032.png"></p>
<p>zrangebyscore key minmax [withscores] [limit offset count]</p>
<p>返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 </p>
<p>zrevrangebyscore key maxmin [withscores] [limit offset count] </p>
<p>同上,改为从大到小排列。 </p>
<p>zincrby <key><increment><value> 为元素的score加上增量</p>
<p>zrem <key><value>删除该集合下,指定值的元素 </p>
<p>zcount <key><min><max>统计该集合,分数区间内的元素个数 </p>
<p>zrank <key><value>返回该值在集合中的排名,从0开始。</p>
<p>案例:如何利用zset实现一个文章访问量的排行榜?</p>
<p><img src="C:\Users\peng\AppData\Local\Temp\ksohtml\wpsD021.tmp.png" alt="img"></p>
<h2 id="数据结构-4"><a href="#数据结构-4" class="headerlink" title="数据结构"></a>数据结构</h2><p>SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String, Double>,可以给每一个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。</p>
<p>zset底层使用了两个数据结构</p>
<p>(1)hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。</p>
<p>(2)跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。</p>
<p><em><strong>*跳跃表(跳表)*</strong></em></p>
<p>1、简介</p>
<p> 有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。</p>
<p>2、实例</p>
<p> 对比有序链表和跳跃表,从链表中查询出51</p>
<p>(1) 有序链表</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419205322.png"> </p>
<p>要查找值为51的元素,需要从第一个元素开始依次查找、比较才能找到。共需要6次比较。</p>
<p>(2) 跳跃表</p>
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220419205344.png"> </p>
<p>从第2层开始,1节点比51节点小,向后比较。</p>
<p>21节点比51节点小,继续向后比较,后面就是NULL了,所以从21节点向下到第1层</p>
<p>在第1层,41节点比51节点小,继续向后,61节点比51节点大,所以从41向下</p>
<p>在第0层,51节点为要查找的节点,节点被找到,共查找4次。</p>
<p>从此可以看出跳跃表比有序链表效率要高</p>
]]></content>
<tags>
<tag>Redis</tag>
</tags>
</entry>
<entry>
<title>Git-Git命令</title>
<url>/2022/03/26/git/</url>
<content><![CDATA[<h1 id="Git-RESTful-API-命令行"><a href="#Git-RESTful-API-命令行" class="headerlink" title="Git/RESTful API/命令行"></a>Git/RESTful API/命令行</h1><ul>
<li><a href="#git">Git</a><ul>
<li><a href="#git-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4">Git 常用命令</a></li>
<li><a href="#git-%E6%A0%87%E7%AD%BE%E7%AE%A1%E7%90%86">Git 标签管理</a></li>
<li><a href="#git-%E6%92%A4%E9%94%80%E4%B8%8E%E5%9B%9E%E6%BB%9A">Git 撤销与回滚</a></li>
<li><a href="#git-%E5%88%86%E6%94%AF%E7%AE%A1%E7%90%86">Git 分支管理</a></li>
</ul>
</li>
<li><a href="#restful-api">RESTful API</a></li>
<li><a href="#linux-%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4">Linux 常用命令</a></li>
<li><a href="#%E5%8F%82%E8%80%83">参考</a></li>
</ul>
<hr>
<h2 id="Git"><a href="#Git" class="headerlink" title="Git"></a>Git</h2><h4 id="Git-常用命令"><a href="#Git-常用命令" class="headerlink" title="Git 常用命令"></a>Git 常用命令</h4><ul>
<li><code>git init</code></li>
<li><code>git clone</code></li>
<li><code>git remote add origin ***.git</code>、</li>
</ul>
<span id="more"></span>
<ul>
<li><code>git push -u origin master</code></li>
<li>推送到远程仓库的dev分支:<code>git push origin dev</code></li>
<li><code>git log</code></li>
<li><code>git log --graph --pretty=oneline --abbrev-commit</code></li>
<li><code>git status</code></li>
<li><code>git diff</code></li>
<li><code>git add *</code></li>
<li><code>git commit -m "message"</code></li>
<li>commit之后又改了一个小bug,但是又不想增加一个commit,可以用:<code>git commit --amend --no-edit</code>,直接将改动添加到上一次的commit中</li>
<li><code>git push</code></li>
<li><code>git pull</code></li>
<li><code>touch .gitignore</code></li>
</ul>
<h4 id="Git-标签管理"><a href="#Git-标签管理" class="headerlink" title="Git 标签管理"></a>Git 标签管理</h4><ul>
<li>首先切换到需要打标签的分支上,然后使用<code>git tag v1.0</code>就可以在当前commit打上v1.0的标签</li>
<li><code>git tag v1.0 commitID</code> 对特定commit打标签</li>
<li>打标签时加上message:<code>git tag -a <tagname> -m "message"</code></li>
<li><code>git tag</code> 查看所有标签</li>
<li><code>git show [tagname]</code> 查看标签详细信息</li>
<li><code>git push origin <tagname></code>可以推送一个本地标签到远程仓库</li>
<li><code>git push origin --tags</code>可以推送全部未推送过的本地标签</li>
<li><code>git tag -d <tagname></code>可以删除一个本地标签</li>
<li><code>git push origin :refs/tags/<tagname></code>可以删除一个远程标签(先从本地删除)</li>
</ul>
<h4 id="Git-撤销与回滚"><a href="#Git-撤销与回滚" class="headerlink" title="Git 撤销与回滚"></a>Git 撤销与回滚</h4><ul>
<li><strong>暂存区</strong>:<code>git add</code>之后commit之前存在的区域;<strong>工作区</strong>:<code>git commit</code>之后存在的区域;<strong>远程仓库</strong>:<code>git push</code>之后;</li>
<li>作了修改,但还没<code>git add</code>,撤销到上一次提交:<code>git checkout -f -- filename</code>;<code>git checkout -f -- .</code></li>
<li>作了修改,并且已经<code>git add</code>,但还没<code>git commit</code>:<ul>
<li>先将暂存区的修改撤销:<code>git reset HEAD filename</code>/<code>git reset HEAD</code>;此时修改只存在于工作区,变为了 “unstaged changes”;</li>
<li>再利用上面的checkout命令从工作区撤销修改</li>
</ul>
</li>
<li><code>git add</code>之后,作了修改,想丢弃这次修改:<code>git checkout -f --filename</code>会回到最近一次<code>git add</code></li>
<li>作了修改,并且已经<code>git commit</code>了,想撤销这次的修改:<ul>
<li><code>git revert commitID</code>. 其实,<code>git revert</code>可以用来撤销任意一次的修改,不一定要是最近一次</li>
<li><code>git reset --hard commitID</code>/<code>git reset --hard HEAD^</code>(HEAD表示当前版本,几个^表示倒数第几个版本,倒数第100个版本可以用HEAD~100);参数<code>--hard</code>:强制将暂存区和工作区都同步到指定的版本</li>
<li><code>git reset</code>和<code>git revert</code>的区别是:reset是用来回滚的,将HEAD的指针指向了想要回滚的版本,作为最新的版本,而后面的版本也都没有了;而revert只是用来撤销某一次更改,对之后的更改并没有影响</li>
<li>然后再用<code>git push -f</code>提交到远程仓库</li>
</ul>
</li>
</ul>
<h4 id="Git-分支管理"><a href="#Git-分支管理" class="headerlink" title="Git 分支管理"></a>Git 分支管理</h4><ul>
<li>创建分支: <code>git branch test</code></li>
<li>切换分支: <code>git checkout test</code></li>
<li>创建并切换分支:<code>git checkout -b test</code></li>
<li>将test分支的更改合并到master分支:先在test分支上commit、push,再:<code>git checkout master</code>; <code>git merge test</code></li>
<li>如果合并时产生冲突:先手动解决冲突,再合并</li>
<li>删除分支:<code>git branch -d test</code></li>
<li><code>git stash</code><ul>
<li>如果当前分支还有任务没有做完,也不想提交,但此时需要切换或者创建其它分支,就可以使用stash将当前分支的所有修改(包括暂存区)先储藏起来;然后就可以切换到其它分支</li>
<li>在其它分支工作完成之后,首先切换回原来的分支,然后使用<code>git stash list</code>命令查看</li>
<li>可以使用<code>git stash apply <stash number></code>恢复之前储藏的工作现场,再使用<code>git stash drop <stash number></code>删除掉储藏的内容</li>
<li>也可以直接用<code>git stash pop</code>恢复并删除内容</li>
</ul>
</li>
<li>如果在其它分支上做了一个修改(比如修复了一个bug,这次修改有一个commitID),想要将这次修改应用到当前分支上,可以使用:<code>git cherry-pick commitID</code>,可以复制一个特定的提交到当前分支</li>
</ul>
<h2 id="RESTful-API"><a href="#RESTful-API" class="headerlink" title="RESTful API"></a>RESTful API</h2><p>REST指Representational State Transfer,可以翻译为“表现层状态转化”</p>
<h4 id="主要思想"><a href="#主要思想" class="headerlink" title="主要思想"></a>主要思想</h4><ul>
<li>对网络上的所有资源,都有一个<strong>统一资源标识符</strong> URI(Uniform Resource Identifier);</li>
<li>这些资源可以有多种表现形式,即REST中的“表现层”Representation,比如,文本可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现。URI只代表资源的实体,不代表它的形式;</li>
<li>“无状态(Stateless)”思想:服务端不应该保存客户端状态,只需要处理当前的请求,不需了解请求的历史,客户端每一次请求中包含处理该请求所需的一切信息;</li>
<li>客户端使用HTTP协议中的 GET/POST/PUT/DELETE 方法对服务器的资源进行操作,即REST中的”状态转化“</li>
</ul>
<h4 id="设计原则"><a href="#设计原则" class="headerlink" title="设计原则"></a>设计原则</h4><ul>
<li>URL设计<ul>
<li>最好只使用名词,而使用 GET/POST/PUT/DELETE 方法的不同表示不同的操作;比如使用<code>POST /user</code>代替<code>/user/create</code></li>
<li>GET:获取资源;POST:新建/更新资源;PUT:更新资源;DELETE:删除资源;</li>
<li>对于只支持GET/POST的客户端,使用<code>X-HTTP-Method-Override</code>属性,覆盖POST方法;</li>
<li>避免多级URL,比如使用<code>GET /authors/12?categories=2</code>代替<code>GET /authors/12/categories/2</code>;</li>
<li>避免在URI中带上版本号。不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI,版本号可以在HTTP请求头信息的Accept字段中进行区分</li>
</ul>
</li>
<li>状态码:服务器应该返回尽可能精确的状态码,客户端只需查看状态码,就可以判断出发生了什么情况。见计算机网络部分 – <a href="Computer%20Network.md#HTTP%E8%AF%B7%E6%B1%82%E6%9C%89%E5%93%AA%E4%BA%9B%E5%B8%B8%E8%A7%81%E7%8A%B6%E6%80%81%E7%A0%81">HTTP请求有哪些常见状态码?</a></li>
<li>服务器回应:在响应中放上其它API的链接,方便用户寻找</li>
</ul>
<h2 id="Linux-常用命令"><a href="#Linux-常用命令" class="headerlink" title="Linux 常用命令"></a>Linux 常用命令</h2><h3 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h3><ul>
<li><a href="https://learngitbranching.js.org/?demo=&locale=zh_CN">Learn Git Branching - 可视化的学习 Git 操作</a></li>
<li><a href="https://www.liaoxuefeng.com/wiki/896043488029600">Git教程 - 廖雪峰的官方网站</a></li>
<li><a href="http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html">RESTful API 最佳实践 - 阮一峰的网络日志</a></li>
<li><a href="https://github.com/jlevy/the-art-of-command-line/blob/master/README-zh.md">GitHub - jlevy/the-art-of-command-line: Master the command line, in one page</a></li>
</ul>
]]></content>
</entry>
<entry>
<title>java刷题模版</title>
<url>/2021/11/22/java%E5%88%B7%E9%A2%98%E6%A8%A1%E7%89%88/</url>
<content><![CDATA[<p>数据输入<br>一般我常用的数据输入方法有两种,Scanner和BufferedReader。BufferedReader可以读一行,速度比Scanner快,所以数据较多的时候使用。注意BufferedReader用完记得关。</p>
<p>Scanner</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span></span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> Scanner scan = <span class="keyword">new</span> Scanner(System.in);</span><br><span class="line"> <span class="keyword">int</span> n = scan.nextInt(); <span class="comment">// String: next(), double: nextDouble()</span></span><br><span class="line"> <span class="keyword">int</span>[] nums = <span class="keyword">new</span> <span class="keyword">int</span>[n];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < n; i++)</span><br><span class="line"> nums[i] = scan.nextInt();</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>
<p>BufferedReader</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span></span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException </span>{</span><br><span class="line"> BufferedReader reader = <span class="keyword">new</span> BufferedReader(<span class="keyword">new</span> InputStreamReader(System.in));</span><br><span class="line"> <span class="keyword">int</span> n = Integer.parseInt(reader.readLine());</span><br><span class="line"> <span class="keyword">int</span>[] nums = <span class="keyword">new</span> <span class="keyword">int</span>[n];</span><br><span class="line"> String[] strs = reader.readLine().split(<span class="string">" "</span>);</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < n; i++)</span><br><span class="line"> nums[i] = Integer.parseInt(strs[i]);</span><br><span class="line"> <span class="comment">// ...</span></span><br><span class="line"> reader.close(); <span class="comment">// 记得关闭</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>快速排序quickSort<br>快速排序要注意x取值的边界情况。取x = nums[left], nums分为[left, j]和[j + 1, right],或x = nums[right], nums分为[left, i - 1]和[i, right],否则会StackOverflow。</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">quickSort</span><span class="params">(<span class="keyword">int</span>[] nums, <span class="keyword">int</span> left, <span class="keyword">int</span> right)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (left >= right)</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> <span class="keyword">int</span> i = left - <span class="number">1</span>, j = right + <span class="number">1</span>, x = nums[left];</span><br><span class="line"> <span class="keyword">while</span> (i < j) {</span><br><span class="line"> <span class="keyword">do</span> i++; <span class="keyword">while</span> (nums[i] < x);</span><br><span class="line"> <span class="keyword">do</span> j--; <span class="keyword">while</span> (nums[j] > x);</span><br><span class="line"> <span class="keyword">if</span> (i < j) {</span><br><span class="line"> <span class="keyword">int</span> temp = nums[i];</span><br><span class="line"> nums[i] = nums[j];</span><br><span class="line"> nums[j] = temp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> quickSort(nums, left, j);</span><br><span class="line"> quickSort(nums, j + <span class="number">1</span>, right);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>例题:AcWing 785, LeetCode 912</p>
<p>归并排序mergeSort<br>mergeSort时间复杂度是稳定O(nlogn),空间复杂度O(n),稳定的。quickSort时间复杂度平均O(nlogn),最坏O(n^2),最好O(nlogn),空间复杂度O(nlogn),不稳定的。</p>
<p>public void mergeSort(int[] nums, int left, int right) {<br> if (left >= right)<br> return;</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">int</span> mid = left + (right - left) / <span class="number">2</span>;</span><br><span class="line">mergeSort(nums, left, mid);</span><br><span class="line">mergeSort(nums, mid + <span class="number">1</span>, right);</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> k = <span class="number">0</span>, i = left, j = mid + <span class="number">1</span>;</span><br><span class="line"><span class="keyword">int</span>[] temp = <span class="keyword">new</span> <span class="keyword">int</span>[right - left + <span class="number">1</span>];</span><br><span class="line"><span class="keyword">while</span> (i <= mid && j <= right)</span><br><span class="line"> <span class="keyword">if</span> (nums[i] < nums[j])</span><br><span class="line"> temp[k++] = nums[i++];</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> temp[k++] = nums[j++];</span><br><span class="line"><span class="keyword">while</span> (i <= mid)</span><br><span class="line"> temp[k++] = nums[i++];</span><br><span class="line"><span class="keyword">while</span> (j <= right)</span><br><span class="line"> temp[k++] = nums[j++];</span><br><span class="line"><span class="keyword">for</span> (i = left, j = <span class="number">0</span>; i <= right; i++, j++)</span><br><span class="line"> nums[i] = temp[j];</span><br></pre></td></tr></table></figure>
<p>}<br>例题:AcWing 787, LeetCode 912</p>
<p>二分搜索binarySearch<br>二分搜索逼近左边界,区间[left, right]被分为左区间[left, mid]和右区间[mid + 1, right]。</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">binarySearchLeft</span><span class="params">(<span class="keyword">int</span>[] nums, <span class="keyword">int</span> target)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> left = <span class="number">0</span>, right = nums.length - <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span> (left < right) {</span><br><span class="line"> <span class="keyword">int</span> mid = left + (right - left) / <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">if</span> (check(mid))</span><br><span class="line"> right = mid;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> left = mid + <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> nums[left];</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>二分搜索逼近右边界,区间[left, right]被分为左区间[left, mid - 1]和右区间[mid, right]。</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">binarySearchRight</span><span class="params">(<span class="keyword">int</span>[] nums, <span class="keyword">int</span> target)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> left = <span class="number">0</span>, right = nums.length - <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span> (left < right) {</span><br><span class="line"> <span class="keyword">int</span> mid = left + (right - left) / <span class="number">2</span> + <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">if</span> (check(mid))</span><br><span class="line"> left = mid;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> right = mid - <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> nums[left];</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>暑假在LeetCode打卡的时候发现还有第三种模板,nums[mid] == target 直接return,区间[left, right]被分为[left, mid - 1]和[mid + 1, right]。</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">searchInsert</span><span class="params">(<span class="keyword">int</span>[] nums, <span class="keyword">int</span> target)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> left = <span class="number">0</span>, right = nums.length - <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span> (left <= right) {</span><br><span class="line"> <span class="keyword">int</span> mid = left + (right - left) / <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">if</span> (nums[mid] == target)</span><br><span class="line"> <span class="keyword">return</span> mid;</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (check(mid))</span><br><span class="line"> right = mid - <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> left = mid + <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> left;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<p>例题:AcWing 789, LeetCode 34, LeetCode 35</p>
<p>KMP</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">kmp</span><span class="params">(String text, String pattern)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> m = pattern.length();</span><br><span class="line"> <span class="keyword">if</span> (m == <span class="number">0</span>)</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">int</span> n = text.length();</span><br><span class="line"> <span class="keyword">int</span>[] next = <span class="keyword">new</span> <span class="keyword">int</span>[m + <span class="number">1</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>, j = <span class="number">0</span>; i <= m; i++) {</span><br><span class="line"> <span class="keyword">while</span> (j > <span class="number">0</span> && pattern.charAt(i - <span class="number">1</span>) != pattern.charAt(j))</span><br><span class="line"> j = next[j];</span><br><span class="line"> <span class="keyword">if</span> (pattern.charAt(i - <span class="number">1</span>) == pattern.charAt(j))</span><br><span class="line"> j++;</span><br><span class="line"> next[i] = j;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>, j = <span class="number">0</span>; i <= n; i++) {</span><br><span class="line"> <span class="keyword">while</span> (j > <span class="number">0</span> && text.charAt(i - <span class="number">1</span>) != pattern.charAt(j))</span><br><span class="line"> j = next[j];</span><br><span class="line"> <span class="keyword">if</span> (text.charAt(i - <span class="number">1</span>) == pattern.charAt(j))</span><br><span class="line"> j++;</span><br><span class="line"> <span class="keyword">if</span> (j == m)</span><br><span class="line"> <span class="keyword">return</span> i - m;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>例题:AcWing 831, LeetCode 28</p>
<p>Trie</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> SIZE = <span class="number">26</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">TrieNode</span> </span>{</span><br><span class="line"> TrieNode[] children = <span class="keyword">new</span> TrieNode[SIZE];</span><br><span class="line"> <span class="keyword">int</span> times;</span><br><span class="line"></span><br><span class="line"> TrieNode() {</span><br><span class="line"> times = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < SIZE; i++)</span><br><span class="line"> children[i] = <span class="keyword">null</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">public</span> <span class="keyword">static</span> TrieNode root = <span class="keyword">new</span> TrieNode();</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">insert</span><span class="params">(String word)</span> </span>{</span><br><span class="line"> TrieNode node = root;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < word.length(); i++) {</span><br><span class="line"> <span class="keyword">int</span> index = word.charAt(i) - <span class="string">'a'</span>;</span><br><span class="line"> <span class="keyword">if</span> (node.children[index] == <span class="keyword">null</span>)</span><br><span class="line"> node.children[index] = <span class="keyword">new</span> TrieNode();</span><br><span class="line"> node = node.children[index];</span><br><span class="line"> }</span><br><span class="line"> node.times++;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">query</span><span class="params">(String word)</span> </span>{</span><br><span class="line"> TrieNode node = root;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < word.length(); i++) {</span><br><span class="line"> <span class="keyword">int</span> index = word.charAt(i) - <span class="string">'a'</span>;</span><br><span class="line"> <span class="keyword">if</span> (node.children[index] == <span class="keyword">null</span>)</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> node = node.children[index];</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> node.times;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>例题:AcWing 835</p>
<p>并查集<br>朴素并查集</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span>[] p;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">find</span><span class="params">(<span class="keyword">int</span> x)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (p[x] != x)</span><br><span class="line"> p[x] = find(p[x]);</span><br><span class="line"> <span class="keyword">return</span> p[x];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">p[find(a)] = find(b);</span><br></pre></td></tr></table></figure>
<p>例题:AcWing 836</p>
<p>图的存储<br>n个点,m条边,m约等于n2n2叫做稠密图,用邻接矩阵存储;n个点,m条边,m远小于n2n2叫做稀疏图,用邻接表存储。</p>
<p>邻接矩阵</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span></span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> INF = <span class="number">0x3f3f3f3f</span>;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> n;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span>[][] g;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span>[] dist;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">boolean</span>[] visit;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> Scanner scan = <span class="keyword">new</span> Scanner(System.in);</span><br><span class="line"> n = scan.nextInt();</span><br><span class="line"> <span class="keyword">int</span> m = scan.nextInt();</span><br><span class="line"> g = <span class="keyword">new</span> <span class="keyword">int</span>[n + <span class="number">1</span>][n + <span class="number">1</span>];</span><br><span class="line"> dist = <span class="keyword">new</span> <span class="keyword">int</span>[n + <span class="number">1</span>];</span><br><span class="line"> visit = <span class="keyword">new</span> <span class="keyword">boolean</span>[n + <span class="number">1</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"> <span class="keyword">if</span> (i == j)</span><br><span class="line"> g[i][j] = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> g[i][j] = INF;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < m; i++) {</span><br><span class="line"> <span class="keyword">int</span> x = scan.nextInt(), y = scan.nextInt(), z = scan.nextInt();</span><br><span class="line"> g[a][b] = Math.min(g[a][b], c);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> res = dijkstra();</span><br><span class="line"> System.out.println(res);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>邻接表</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Main</span></span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> INF = <span class="number">0x3f3f3f3f</span>;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> n;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Map<Integer, List<Node>> map = <span class="keyword">new</span> HashMap<>();</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span>[] dist;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">boolean</span>[] visit;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">Node</span> </span>{</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">int</span> node;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">int</span> length;</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">Node</span><span class="params">(<span class="keyword">int</span> node, <span class="keyword">int</span> length)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.node = node;</span><br><span class="line"> <span class="keyword">this</span>.length = length;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> Scanner scan = <span class="keyword">new</span> Scanner(System.in);</span><br><span class="line"> n = scan.nextInt();</span><br><span class="line"> dist = <span class="keyword">new</span> <span class="keyword">int</span>[n + <span class="number">1</span>];</span><br><span class="line"> visit = <span class="keyword">new</span> <span class="keyword">boolean</span>[n + <span class="number">1</span>];</span><br><span class="line"> <span class="keyword">int</span> m = scan.nextInt();</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> map.put(i, <span class="keyword">new</span> ArrayList<>());</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < m; i++) {</span><br><span class="line"> <span class="keyword">int</span> x = scan.nextInt(), y = scan.nextInt(), z = scan.nextInt();</span><br><span class="line"> map.get(x).add(<span class="keyword">new</span> Node(y, z));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">int</span> res = dijkstra();</span><br><span class="line"> System.out.println(res);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>Dijkstra<br>边权不能是负数!<br>1.dist[1] = 0, dist[i] = +∞<br>2.for i 1 ~ n<br>t <- 不在s中的,距离最近的点 – n2n2 / n<br>s <- t – n<br>用t更新其他点的距离 – m / mlogn</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">dijkstra</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> dist[i] = INF;</span><br><span class="line"> dist[<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < n - <span class="number">1</span>; i++) {</span><br><span class="line"> <span class="keyword">int</span> t = -<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"> <span class="keyword">if</span> (!visit[j] && (t == -<span class="number">1</span> || dist[t] > dist[j]))</span><br><span class="line"> t = j;</span><br><span class="line"> <span class="keyword">if</span> (t == n)</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"> dist[j] = Math.min(dist[j], dist[t] + g[t][j]);</span><br><span class="line"> visit[t] = <span class="keyword">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (dist[n] == INF)</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">return</span> dist[n];</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>例题:AcWing 849</p>
<p>优化Dijkstra</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">dijkstra</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> dist[i] = INF;</span><br><span class="line"> dist[<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line"> PriorityQueue<Node> heap = <span class="keyword">new</span> PriorityQueue<>((node1, node2) -> node1.length - node2.length);</span><br><span class="line"> heap.add(<span class="keyword">new</span> Node(<span class="number">1</span>, <span class="number">0</span>));</span><br><span class="line"> <span class="keyword">while</span> (!heap.isEmpty()) {</span><br><span class="line"> Node top = heap.poll();</span><br><span class="line"> <span class="keyword">int</span> length = top.length, cur = top.node;</span><br><span class="line"> <span class="keyword">if</span> (visit[cur])</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> visit[cur] = <span class="keyword">true</span>;</span><br><span class="line"> <span class="keyword">for</span> (Node next: map.get(cur)) {</span><br><span class="line"> <span class="keyword">int</span> node = next.node, cost = next.length;</span><br><span class="line"> <span class="keyword">if</span> (dist[node] > length + cost) {</span><br><span class="line"> dist[node] = length + cost;</span><br><span class="line"> heap.add(<span class="keyword">new</span> Node(node, dist[node]));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (dist[n] == INF)</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">return</span> dist[n];</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<p>例题:AcWing 850</p>
<p>Bellman-ford<br>O(nm)</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">bellman_ford</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> dist[i] = INF;</span><br><span class="line"> dist[<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < k; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"> backup[j] = dist[j]; <span class="comment">// deep copy</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">0</span>; k < m; k++) {</span><br><span class="line"> <span class="keyword">int</span> x = edges[k].x;</span><br><span class="line"> <span class="keyword">int</span> y = edges[k].y;</span><br><span class="line"> <span class="keyword">int</span> z = edges[k].z;</span><br><span class="line"> dist[y] = Math.min(dist[y], backup[x] + z);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (dist[n] > INF / <span class="number">2</span>)</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="keyword">return</span> dist[n];</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>例题:AcWing 853</p>
<p>SPFA (队列优化的Bellman-ford算法)<br>一般O(m),最坏O(nm)。n表示点数,m表示边数。</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">spfa</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> dist[i] = INF;</span><br><span class="line"> dist[<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line"> Queue<Integer> queue = <span class="keyword">new</span> LinkedList<>();</span><br><span class="line"> queue.add(<span class="number">1</span>);</span><br><span class="line"> visit[<span class="number">1</span>] = <span class="keyword">true</span>;</span><br><span class="line"> <span class="keyword">while</span> (!queue.isEmpty()) {</span><br><span class="line"> <span class="keyword">int</span> t = queue.poll();</span><br><span class="line"> visit[t] = <span class="keyword">false</span>;</span><br><span class="line"> <span class="keyword">for</span> (Node cur: map.get(t)) {</span><br><span class="line"> <span class="keyword">int</span> node = cur.node, length = cur.length;</span><br><span class="line"> <span class="keyword">if</span> (dist[node] > dist[t] + length) {</span><br><span class="line"> dist[node] = dist[t] + length;</span><br><span class="line"> <span class="keyword">if</span> (!visit[node]) {</span><br><span class="line"> queue.add(node);</span><br><span class="line"> visit[node] = <span class="keyword">true</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">return</span> dist[n];</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>例题:AcWing 851</p>
<p>SPFA 判断图中是否存在负环<br>O(nm),n表示点数,m表示边数。</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">boolean</span> <span class="title">spfa</span><span class="params">()</span> </span>{</span><br><span class="line"> Queue<Integer> queue = <span class="keyword">new</span> LinkedList<>();</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++) {</span><br><span class="line"> queue.add(i);</span><br><span class="line"> visit[i] = <span class="keyword">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">while</span> (!queue.isEmpty()) {</span><br><span class="line"> <span class="keyword">int</span> t = queue.poll();</span><br><span class="line"> visit[t] = <span class="keyword">false</span>;</span><br><span class="line"> <span class="keyword">for</span> (Node cur: map.get(t)) {</span><br><span class="line"> <span class="keyword">int</span> node = cur.node, length = cur.length;</span><br><span class="line"> <span class="keyword">if</span> (dist[node] > dist[t] + length) {</span><br><span class="line"> dist[node] = dist[t] + length;</span><br><span class="line"> count[node] = count[t] + <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">if</span> (count[node] >= n)</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</span><br><span class="line"> <span class="keyword">if</span> (!visit[node]) {</span><br><span class="line"> queue.add(node);</span><br><span class="line"> visit[node] = <span class="keyword">true</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">return</span> <span class="keyword">false</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>例题:AcWing 852</p>
<p>Floyd<br>O(n3)O(n3)</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">floyd</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">1</span>; k <= n; k++)</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++)</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j <= n; j++)</span><br><span class="line"> d[i][j] = Math.min(d[i][j], d[i][k] + d[k][j]);</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<p>例题:AcWing 854</p>
<p>作者:Lic<br>链接:<a href="https://www.acwing.com/file_system/file/content/whole/index/content/5873/">https://www.acwing.com/file_system/file/content/whole/index/content/5873/</a><br>来源:AcWing<br>著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</p>
]]></content>
<tags>
<tag>java</tag>
</tags>
</entry>
<entry>
<title>java实现pdf转为图片</title>
<url>/2021/11/02/java%E5%AE%9E%E7%8E%B0pdf%E8%BD%AC%E4%B8%BA%E5%9B%BE%E7%89%87/</url>
<content><![CDATA[<p> [toc]Java实现pdf转为图片</p>
<p>首先创建一个maven工程 在pom.xml文件导入包的依赖</p>
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.apache.pdfbox<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>fontbox<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.0.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.apache.pdfbox<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>pdfbox<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.0.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="comment"><!-- https://mvnrepository.com/artifact/com.develouz.view/pdfreader --></span></span><br><span class="line"> <span class="comment"><!-- pdf水印 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.lowagie<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>itext<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.1.7<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependencies</span>></span>></span><br></pre></td></tr></table></figure>
<p>第二步 在Java路径下创建一个子类PDF2IMAGE</p>
<p>然后导入包</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.pdfbox.pdmodel.PDDocument;</span><br><span class="line"><span class="keyword">import</span> org.apache.pdfbox.rendering.PDFRenderer;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.lowagie.text.pdf.PdfReader;</span><br></pre></td></tr></table></figure>
<p>主体结构</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">PDF2IMAGE</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> pdf2Image(<span class="string">"C:/Users/peng/Downloads/1.pdf"</span>, <span class="string">"D:/pdf2"</span>, <span class="number">300</span>);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<p>主要利用pdf2Image方法</p>
<p>代码见下</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">pdf2Image</span><span class="params">(String PdfFilePath, String dstImgFolder, <span class="keyword">int</span> dpi)</span> </span>{</span><br><span class="line"> File file = <span class="keyword">new</span> File(PdfFilePath);</span><br><span class="line"> PDDocument pdDocument;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> String imgPDFPath = file.getParent();</span><br><span class="line"> <span class="keyword">int</span> dot = file.getName().lastIndexOf(<span class="string">'.'</span>);</span><br><span class="line"> String imagePDFName = file.getName().substring(<span class="number">0</span>, dot); <span class="comment">// 获取图片文件名</span></span><br><span class="line"> String imgFolderPath = <span class="keyword">null</span>;</span><br><span class="line"> <span class="keyword">if</span> (dstImgFolder.equals(<span class="string">""</span>)) {</span><br><span class="line"> imgFolderPath = imgPDFPath + File.separator + imagePDFName;<span class="comment">// 获取图片存放的文件夹路径</span></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> imgFolderPath = dstImgFolder + File.separator + imagePDFName;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (createDirectory(imgFolderPath)) {</span><br><span class="line"></span><br><span class="line"> pdDocument = PDDocument.load(file);</span><br><span class="line"> PDFRenderer renderer = <span class="keyword">new</span> PDFRenderer(pdDocument);</span><br><span class="line"> <span class="comment">/* dpi越大转换后越清晰,相对转换速度越慢 */</span></span><br><span class="line"> PdfReader reader = <span class="keyword">new</span> PdfReader(PdfFilePath);</span><br><span class="line"> <span class="keyword">int</span> pages = reader.getNumberOfPages();</span><br><span class="line"> StringBuffer imgFilePath = <span class="keyword">null</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < pages; i++) {</span><br><span class="line"> String imgFilePathPrefix = imgFolderPath + File.separator + imagePDFName;</span><br><span class="line"> imgFilePath = <span class="keyword">new</span> StringBuffer();</span><br><span class="line"> imgFilePath.append(imgFilePathPrefix);</span><br><span class="line"> imgFilePath.append(<span class="string">"_"</span>);</span><br><span class="line"> imgFilePath.append(String.valueOf(i + <span class="number">1</span>));</span><br><span class="line"> imgFilePath.append(<span class="string">".png"</span>);</span><br><span class="line"> File dstFile = <span class="keyword">new</span> File(imgFilePath.toString());</span><br><span class="line"> BufferedImage image = renderer.renderImageWithDPI(i, dpi);</span><br><span class="line"> ImageIO.write(image, <span class="string">"png"</span>, dstFile);</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"PDF文档转PNG图片成功!"</span>);</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> System.out.println(<span class="string">"PDF文档转PNG图片失败:"</span> + <span class="string">"创建"</span> + imgFolderPath + <span class="string">"失败"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>三个参数 </p>
<p>PdfFilePath:pdf文件所在的位置 例如 C:/Users/peng/Downloads/1.pdf (这里注意 如果文件名是中文不行的话就换成数字)</p>
<p>dstImgFolder:pdf文件转换成图片所在的位置 例如 D:/pdf2</p>
<p>dpi :清晰度 越高图片越清晰! 但是也转的最慢</p>
<p> <code>File file = new File(PdfFilePath);</code></p>
<p>这是创建了一个文件在pdfFilePath的对象 </p>
<p>String imgPDFPath = file.getParent();</p>
<p>返回文件的路径</p>
<p>imgPDFPath为文件路径</p>
<p><strong>java.io.File.getName()</strong> 方法返回的路径名的名称序列的最后一个名字,这意味着表示此抽象路径名的文件或目录的名称被返回</p>
<p>file.getName()即1.pdf </p>
<p> int dot = file.getName().lastIndexOf(‘.’)</p>
<p>lastIndexOf代表返回1.pdf .所在的位置 即第一位 </p>
<p>dot是点所在的位置 即1.pdf里面</p>
<p>file.getName().substring(0, dot) 获取文件名 得到文件名 1.pdf得到1</p>
<p>其实 File.separator 的作用相当于 ‘ \ ‘(在windows下) linux下相当于 /</p>
<p>即图片存储位置为 D:\pdf2\1</p>
]]></content>
<tags>
<tag>java</tag>
</tags>
</entry>
<entry>
<title>leetcode五百题以及实习接近了尾声</title>
<url>/2022/08/10/leetcode%E4%BA%94%E7%99%BE%E9%A2%98%E4%BB%A5%E5%8F%8A%E5%AE%9E%E4%B9%A0%E6%8E%A5%E8%BF%91%E4%BA%86%E5%B0%BE%E5%A3%B0/</url>
<content><![CDATA[<h1 id="leetcode五百题以及实习接近了尾声"><a href="#leetcode五百题以及实习接近了尾声" class="headerlink" title="leetcode五百题以及实习接近了尾声"></a>leetcode五百题以及实习接近了尾声</h1><span id="more"></span>
<p>六月中旬 自己坐高铁独自北上,人生中第一次离开了自己生活了20年没离开过的湖南省。</p>
<p>遥想三年前,自己和当时一起考入一个大学的同桌坐高铁一起从那个湘西南的小县城去往湖南株洲。</p>
<p>当时两个从来没有离开过那个小县城的我们用着惊叹的眼神看着高铁站外面的高楼大厦,人来人往以及车让我们迷失了方向。</p>
<p>好在学校在高铁站有接待点,上了学校包的公交车,和不同地方五湖四海不同学院,和他们一起前往了那个我大学生涯待在那里的学校</p>
<p>如果八月中旬,我决定结束我的实习之旅 本周五完成工作交接并且正式离职。今天自己刷leetocde也达到了500道题 也想发点什么给自己记录一下,也想大学毕业的时候还能够继续看一下这些记录</p>
<!-- more -->
<p><img src="http://windxiao-1307340949.cosgz.myqcloud.com/20220810194831.png"></p>
<p>自己刷力扣是从9月份那时候大三刚开学 感觉自己要为工作准备一些 以前一直知道leetcode这个网站。</p>
<p>但是一直没有勇气坚持下去,我记得我大二的时候尝试过,但是被我想像中的两数之和以及核心代码不适应劝退了。</p>
<p> 大二一年忙着家教挣生活费,当时没时间去弄这样。记得刷了力扣两个月 大概11月份的样子 我去参加了学院组织的程序竞赛 获得了非新生组的二等奖 。</p>
<p> 离一等奖仅有一名只差 当然这要感谢我们学校的ACM大神们不屑于来欺负我们。但是的那个二等奖给了我很大的信心,后面断断续续的刷了一些题目。</p>
<p>后面加了<strong>宫水三叶姐</strong>的刷题群后,发现氛围真的是一个极其重要的东西。那里们有很多人细心的指导着新手对一些很常见问题的提问。</p>
<p>再后面跟着做每日一题 但是题太难了就会直接copy 老是想着有时间再去复习 实际上并没有坐到。</p>
<p>自己的水平再慢慢的提升,但是进步的空间依旧很大。</p>
<p>需要自己继续努力 秋招已经开始了。今年好像是过去十年最难的一届 好像也是将来十年最好的一年,听的人很焦虑,除了工作压力大之外 我承受受了这个的影响 想早一点的准备秋招。</p>
<p>在实习遇见了很多nice的同事 当然也会遇见很多不是很高兴的事情 比如比较push的组长 自己一直是一个想做到工作生活分离的人 不想在下班的时候被打扰 结果生活往往不是那么的如意。</p>
<p>也给我要步入社会的我上了一课。</p>
<p>在这里希望秋招顺利!工作顺心 万事如意。</p>
<p>也祝各位看到这的人<strong>天天开心</strong>!</p>
]]></content>
<tags>
<tag>所想</tag>
</tags>
</entry>
<entry>
<title>Java练手项目-pdf加水印</title>
<url>/2021/11/15/pdf%E6%B0%B4%E5%8D%B0%E9%A1%B9%E7%9B%AE%E5%88%9B%E5%BB%BA/</url>
<content><![CDATA[<p> 所需要的工具 一台服务器 一个可以编译jar的java环境 nginx用来正向代理</p>
<p>xshell连接服务器</p>
<p>安装java环境</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">yum install java-1.8.0-openjdk</span><br></pre></td></tr></table></figure>
<p>查看java是否安装好</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">java -version</span><br></pre></td></tr></table></figure>
<p>创建自己项目的路径并且cd到该路径</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mkdir java</span><br><span class="line">cd java</span><br></pre></td></tr></table></figure>
<p>用命令让他跑起来</p>
<span id="more"></span>
<p>Linux启动</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">nohup java -jar pdf-service-0.0.1-SNAPSHOT.jar </span><br><span class="line">--host=http://161.117.229.248/</span><br><span class="line">--pdfPassword=2021 --footerDesc=\u9875\u811a\u6587\u5b57 </span><br><span class="line">--watermarkPic=https://www.wwei.cn/yasuotu/images/logo.png </span><br><span class="line">--basicUrl=tmp/resources/static/pdf/ </span><br><span class="line">--location=10,10,30,30 > nohup.out 2>&1 &</span><br></pre></td></tr></table></figure>
<p>这里注意把它copy去浏览器 变成一行去粘贴 这里只是方便看的参数的意义</p>
<p>Linux查看日志<br><code>tail -f nohup.out</code></p>
<p>配置参数<br>host:zip下载域名<br>location:水印图片坐标<br>pdfPassword:pdf保护密码<br>footerDesc:底部水印文案(unicode编码)<br>watermarkPic:外网可访问的水印图片地址<br>basicUrl:输出pdf、zip的文件保存目录</p>
<p>查看包含“java”的所有进程</p>
<p>ps -ef |grep java </p>
<p><img src="https://i.loli.net/2021/11/15/Mx38SdDYwjAyH4P.png"></p>
<p>杀死进程</p>
<p><code>kill -9 id</code></p>
<p>首先导入依赖</p>
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.itextpdf<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>itextpdf<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>5.5.13<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="comment"><!-- https://mvnrepository.com/artifact/com.lowagie/itext --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.lowagie<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>itext<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.1.7<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
<p>代码如下</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> java.awt.AlphaComposite;</span><br><span class="line"><span class="keyword">import</span> java.awt.Color;</span><br><span class="line"><span class="keyword">import</span> java.awt.Font;</span><br><span class="line"><span class="keyword">import</span> java.awt.Graphics2D;</span><br><span class="line"><span class="keyword">import</span> java.awt.Image;</span><br><span class="line"><span class="keyword">import</span> java.awt.RenderingHints;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.FileOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.OutputStream;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"><span class="keyword">import</span> javax.swing.ImageIcon;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*******************************************************************************</span></span><br><span class="line"><span class="comment"> * Description: 图片水印工具类</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> zengshunyao</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ImageRemarkUtil</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 水印透明度</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">float</span> alpha = <span class="number">0.5f</span>;</span><br><span class="line"> <span class="comment">// 水印横向位置</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">int</span> positionWidth = <span class="number">150</span>;</span><br><span class="line"> <span class="comment">// 水印纵向位置</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">int</span> positionHeight = <span class="number">300</span>;</span><br><span class="line"> <span class="comment">// 水印文字字体</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Font font = <span class="keyword">new</span> Font(<span class="string">"宋体"</span>, Font.BOLD, <span class="number">100</span>);</span><br><span class="line"> <span class="comment">// 水印文字颜色</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Color color = Color.red;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> alpha</span></span><br><span class="line"><span class="comment"> * 水印透明度</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> positionWidth</span></span><br><span class="line"><span class="comment"> * 水印横向位置</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> positionHeight</span></span><br><span class="line"><span class="comment"> * 水印纵向位置</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> font</span></span><br><span class="line"><span class="comment"> * 水印文字字体</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> color</span></span><br><span class="line"><span class="comment"> * 水印文字颜色</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">setImageMarkOptions</span><span class="params">(<span class="keyword">float</span> alpha, <span class="keyword">int</span> positionWidth,</span></span></span><br><span class="line"><span class="params"><span class="function"> <span class="keyword">int</span> positionHeight, Font font, Color color)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span> (alpha != <span class="number">0.0f</span>)</span><br><span class="line"> ImageRemarkUtil.alpha = alpha;</span><br><span class="line"> <span class="keyword">if</span> (positionWidth != <span class="number">0</span>)</span><br><span class="line"> ImageRemarkUtil.positionWidth = positionWidth;</span><br><span class="line"> <span class="keyword">if</span> (positionHeight != <span class="number">0</span>)</span><br><span class="line"> ImageRemarkUtil.positionHeight = positionHeight;</span><br><span class="line"> <span class="keyword">if</span> (font != <span class="keyword">null</span>)</span><br><span class="line"> ImageRemarkUtil.font = font;</span><br><span class="line"> <span class="keyword">if</span> (color != <span class="keyword">null</span>)</span><br><span class="line"> ImageRemarkUtil.color = color;</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="comment"> * 给图片添加水印图片</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> iconPath</span></span><br><span class="line"><span class="comment"> * 水印图片路径</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> srcImgPath</span></span><br><span class="line"><span class="comment"> * 源图片路径</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> targerPath</span></span><br><span class="line"><span class="comment"> * 目标图片路径</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">markImageByIcon</span><span class="params">(String iconPath, String srcImgPath,</span></span></span><br><span class="line"><span class="params"><span class="function"> String targerPath)</span> </span>{</span><br><span class="line"> markImageByIcon(iconPath, srcImgPath, targerPath, <span class="keyword">null</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="comment"> * 给图片添加水印图片、可设置水印图片旋转角度</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> iconPath</span></span><br><span class="line"><span class="comment"> * 水印图片路径</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> srcImgPath</span></span><br><span class="line"><span class="comment"> * 源图片路径</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> targerPath</span></span><br><span class="line"><span class="comment"> * 目标图片路径</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> degree</span></span><br><span class="line"><span class="comment"> * 水印图片旋转角度</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">markImageByIcon</span><span class="params">(String iconPath, String srcImgPath,</span></span></span><br><span class="line"><span class="params"><span class="function"> String targerPath, Integer degree)</span> </span>{</span><br><span class="line"> OutputStream os = <span class="keyword">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"></span><br><span class="line"> Image srcImg = ImageIO.read(<span class="keyword">new</span> File(srcImgPath));</span><br><span class="line"></span><br><span class="line"> BufferedImage buffImg = <span class="keyword">new</span> BufferedImage(srcImg.getWidth(<span class="keyword">null</span>),</span><br><span class="line"> srcImg.getHeight(<span class="keyword">null</span>), BufferedImage.TYPE_INT_RGB);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 1、得到画笔对象</span></span><br><span class="line"> Graphics2D g = buffImg.createGraphics();</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 2、设置对线段的锯齿状边缘处理</span></span><br><span class="line"> g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,</span><br><span class="line"> RenderingHints.VALUE_INTERPOLATION_BILINEAR);</span><br><span class="line"></span><br><span class="line"> g.drawImage(</span><br><span class="line"> srcImg.getScaledInstance(srcImg.getWidth(<span class="keyword">null</span>),</span><br><span class="line"> srcImg.getHeight(<span class="keyword">null</span>), Image.SCALE_SMOOTH), <span class="number">0</span>, <span class="number">0</span>,</span><br><span class="line"> <span class="keyword">null</span>);</span><br><span class="line"> <span class="comment">// 3、设置水印旋转</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">null</span> != degree) {</span><br><span class="line"> g.rotate(Math.toRadians(degree),</span><br><span class="line"> (<span class="keyword">double</span>) buffImg.getWidth() / <span class="number">2</span>,</span><br><span class="line"> (<span class="keyword">double</span>) buffImg.getHeight() / <span class="number">2</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度</span></span><br><span class="line"> ImageIcon imgIcon = <span class="keyword">new</span> ImageIcon(iconPath);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 5、得到Image对象。</span></span><br><span class="line"> Image img = imgIcon.getImage();</span><br><span class="line"></span><br><span class="line"> g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,</span><br><span class="line"> alpha));</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 6、水印图片的位置</span></span><br><span class="line"> g.drawImage(img, positionWidth, positionHeight, <span class="keyword">null</span>);</span><br><span class="line"> g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));</span><br><span class="line"> <span class="comment">// 7、释放资源</span></span><br><span class="line"> g.dispose();</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 8、生成图片</span></span><br><span class="line"> os = <span class="keyword">new</span> FileOutputStream(targerPath);</span><br><span class="line"> ImageIO.write(buffImg, <span class="string">"JPG"</span>, os);</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"图片完成添加水印图片"</span>);</span><br><span class="line"></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 class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">null</span> != os)</span><br><span class="line"> os.close();</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><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 给图片添加水印文字</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> logoText</span></span><br><span class="line"><span class="comment"> * 水印文字</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> srcImgPath</span></span><br><span class="line"><span class="comment"> * 源图片路径</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> targerPath</span></span><br><span class="line"><span class="comment"> * 目标图片路径</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">markImageByText</span><span class="params">(String logoText, String srcImgPath,</span></span></span><br><span class="line"><span class="params"><span class="function"> String targerPath)</span> </span>{</span><br><span class="line"> markImageByText(logoText, srcImgPath, targerPath, <span class="keyword">null</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="comment"> * 给图片添加水印文字、可设置水印文字的旋转角度</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> logoText</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> srcImgPath</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> targerPath</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> degree</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">markImageByText</span><span class="params">(String logoText, String srcImgPath,</span></span></span><br><span class="line"><span class="params"><span class="function"> String targerPath, Integer degree)</span> </span>{</span><br><span class="line"></span><br><span class="line"> InputStream is = <span class="keyword">null</span>;</span><br><span class="line"> OutputStream os = <span class="keyword">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">// 1、源图片</span></span><br><span class="line"> Image srcImg = ImageIO.read(<span class="keyword">new</span> File(srcImgPath));</span><br><span class="line"> BufferedImage buffImg = <span class="keyword">new</span> BufferedImage(srcImg.getWidth(<span class="keyword">null</span>),</span><br><span class="line"> srcImg.getHeight(<span class="keyword">null</span>), BufferedImage.TYPE_INT_RGB);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 2、得到画笔对象</span></span><br><span class="line"> Graphics2D g = buffImg.createGraphics();</span><br><span class="line"> <span class="comment">// 3、设置对线段的锯齿状边缘处理</span></span><br><span class="line"> g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,</span><br><span class="line"> RenderingHints.VALUE_INTERPOLATION_BILINEAR);</span><br><span class="line"> g.drawImage(</span><br><span class="line"> srcImg.getScaledInstance(srcImg.getWidth(<span class="keyword">null</span>),</span><br><span class="line"> srcImg.getHeight(<span class="keyword">null</span>), Image.SCALE_SMOOTH), <span class="number">0</span>, <span class="number">0</span>,</span><br><span class="line"> <span class="keyword">null</span>);</span><br><span class="line"> <span class="comment">// 4、设置水印旋转</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">null</span> != degree) {</span><br><span class="line"> g.rotate(Math.toRadians(degree),</span><br><span class="line"> (<span class="keyword">double</span>) buffImg.getWidth() / <span class="number">2</span>,</span><br><span class="line"> (<span class="keyword">double</span>) buffImg.getHeight() / <span class="number">2</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 5、设置水印文字颜色</span></span><br><span class="line"> g.setColor(color);</span><br><span class="line"> <span class="comment">// 6、设置水印文字Font</span></span><br><span class="line"> g.setFont(font);</span><br><span class="line"> <span class="comment">// 7、设置水印文字透明度</span></span><br><span class="line"> g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,</span><br><span class="line"> alpha));</span><br><span class="line"> <span class="comment">// 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)</span></span><br><span class="line"> g.drawString(logoText, positionWidth, positionHeight);</span><br><span class="line"> <span class="comment">// 9、释放资源</span></span><br><span class="line"> g.dispose();</span><br><span class="line"> <span class="comment">// 10、生成图片</span></span><br><span class="line"> os = <span class="keyword">new</span> FileOutputStream(targerPath);</span><br><span class="line"> ImageIO.write(buffImg, <span class="string">"JPG"</span>, os);</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"图片完成添加水印文字"</span>);</span><br><span class="line"></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 class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">null</span> != is)</span><br><span class="line"> is.close();</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 class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">null</span> != os)</span><br><span class="line"> os.close();</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><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"></span><br><span class="line"> String logoText = <span class="string">"三 年 一 梦"</span>;</span><br><span class="line"> String iconPath = <span class="string">"D:/pdf/dp/dp_1.png"</span>;</span><br><span class="line"></span><br><span class="line"> String targerTextPath2 = <span class="string">"d:/qie_text_rotate.jpg"</span>;</span><br><span class="line"></span><br><span class="line"> String targerIconPath = <span class="string">"d:/qie_icon.jpg"</span>;</span><br><span class="line"> String targerIconPath2 = <span class="string">"d:/qie_icon_rotate.jpg"</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="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i < <span class="number">10</span>; i++) {</span><br><span class="line"> String srcImgPath = <span class="string">"D:/pdf/1/1_"</span>+i+<span class="string">".png"</span>;</span><br><span class="line"> String targerTextPath = <span class="string">"d:/水印/qie_text"</span>+i+<span class="string">".jpg"</span>;</span><br><span class="line"> <span class="comment">// 给图片添加水印文字</span></span><br><span class="line"> markImageByText(logoText, srcImgPath, targerTextPath);</span><br><span class="line"> <span class="comment">// 给图片添加水印文字,水印文字旋转-45</span></span><br><span class="line"> <span class="comment">//markImageByText(logoText, srcImgPath, targerTextPath2, -45);</span></span><br><span class="line"> }</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><br><span class="line"> <span class="comment">//System.out.println("给图片添加水印图片开始...");</span></span><br><span class="line"> <span class="comment">//setImageMarkOptions(0.3f, 1, 1, null, null);</span></span><br><span class="line"> <span class="comment">// 给图片添加水印图片</span></span><br><span class="line"> <span class="comment">//markImageByIcon(iconPath, srcImgPath, targerIconPath);</span></span><br><span class="line"> <span class="comment">// 给图片添加水印图片,水印图片旋转-45</span></span><br><span class="line"> <span class="comment">//markImageByIcon(iconPath, srcImgPath, targerIconPath2, -45);</span></span><br><span class="line"> <span class="comment">//System.out.println("给图片添加水印图片结束...");</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><br></pre></td></tr></table></figure>
<p>PDF水印demo学习</p>
<p>第一步创建一个Application类 加上@SpringBootApplication的注解</p>
<p>打印控制台消息</p>
<p><code>System.out.println("SpringBoot启动成功");</code></p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.SpringApplication;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Application</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> SpringApplication.run(Application.class, args);</span><br><span class="line"> System.out.println(<span class="string">"SpringBoot启动成功"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p><img src="https://i.loli.net/2021/11/25/QAhnxXS98FM6jws.png"></p>
<p>水印程序</p>
<p><img src="https://i.loli.net/2021/11/25/KcTm97dtOSshLg4.png"></p>
<p>FileDTO文件的属性</p>
<p>文件序号 index</p>
<p>文件路径 path</p>
<p>构造有参无参</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">{</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 文件序号</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer index;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 文件路径</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String path;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> Integer <span class="title">getIndex</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> index;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setIndex</span><span class="params">(Integer index)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.index = index;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getPath</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> path;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setPath</span><span class="params">(String path)</span> </span>{</span><br><span class="line"> <span class="keyword">this</span>.path = path;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>PDF拆分为image</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.example.pdfwatermark;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.pdfbox.pdmodel.PDDocument;</span><br><span class="line"><span class="keyword">import</span> org.apache.pdfbox.rendering.ImageType;</span><br><span class="line"><span class="keyword">import</span> org.apache.pdfbox.rendering.PDFRenderer;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</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="class"><span class="keyword">class</span> <span class="title">Pdf2Image</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 将File PDF文件转化为每一张图片</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> file PDF文件</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 返回每一张图片的实体对象集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> List<FileDTO> <span class="title">generate</span><span class="params">(File file)</span> </span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> Long now = System.currentTimeMillis();</span><br><span class="line"></span><br><span class="line"> <span class="comment">//读取PDF</span></span><br><span class="line"> PDDocument document = PDDocument.load(file);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//加载PDF对象</span></span><br><span class="line"> PDFRenderer pdfRenderer = <span class="keyword">new</span> PDFRenderer(document);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//存储的PDF每一张图片的路径以及索引</span></span><br><span class="line"> List<FileDTO> dataList = <span class="keyword">new</span> ArrayList<>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> page = <span class="number">0</span>;page<document.getNumberOfPages();page++){</span><br><span class="line"></span><br><span class="line"> <span class="comment">//读取PDF每一页的图片</span></span><br><span class="line"> BufferedImage img = pdfRenderer.renderImageWithDPI(page, <span class="number">300</span>, ImageType.RGB);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//生成图片的本地路径</span></span><br><span class="line"> String pathname = PdfWatermarkConstants.PDF_2_IMAGE + now + <span class="string">"/"</span> + file.getName() + page + <span class="string">".png"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//创建本地文件</span></span><br><span class="line"> File imageFile = <span class="keyword">new</span> File(pathname);</span><br><span class="line"> <span class="comment">//创建文件夹</span></span><br><span class="line"> imageFile.mkdirs();</span><br><span class="line"> <span class="comment">//创建文件</span></span><br><span class="line"> imageFile.createNewFile();</span><br><span class="line"></span><br><span class="line"> FileDTO dto = <span class="keyword">new</span> FileDTO();</span><br><span class="line"> dataList.add(dto);</span><br><span class="line"></span><br><span class="line"> dto.setIndex(page);</span><br><span class="line"> dto.setPath(pathname);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//生成PNG格式的图片</span></span><br><span class="line"> ImageIO.write(img, <span class="string">"png"</span>, imageFile);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//关闭Doc流</span></span><br><span class="line"> document.close();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> dataList;</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 class="keyword">return</span> <span class="keyword">new</span> ArrayList<>();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
]]></content>
<tags>
<tag>java</tag>
<tag>linux</tag>
<tag>nginx</tag>
</tags>
</entry>
<entry>
<title>springboot程序</title>
<url>/2021/11/19/springboot%E7%A8%8B%E5%BA%8F/</url>
<content><![CDATA[<p> 新建一个maven工程 注意选择JDK的版本 如果版本过高可能会不支持 最好选择8 9 11</p>
<span id="more"></span>
<p><img src="https://i.loli.net/2021/11/19/vyPn9YbNDIqgj5O.png"></p>
<p>像我第一次踩坑就是因为JDK是17 可能还不支持 把17改为8 就好了 所以大家选择的时候还是尽量选择一起的稳定版本</p>
<p><img src="https://i.loli.net/2021/11/19/ywctzqRAQuDHvaX.jpg"></p>
<p>修改名称</p>
<p><img src="https://i.loli.net/2021/11/19/goJIalrzDH7Lqh1.png"></p>
<p>新建一个包boot</p>
<p>在boot包下创建一个类 MainApplication</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> org.example.boot;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.SpringApplication;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;</span><br><span class="line"></span><br><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MainApplication</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> SpringApplication.run(MainApplication.class,args);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<p>点击pom.xml 进行导包</p>
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">parent</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-parent<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.3.4.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">parent</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"></<span class="name">dependencies</span>></span></span><br></pre></td></tr></table></figure>
<p>建立controller层</p>
<p>创建了类HelloController</p>
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> org.example.boot.Controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RestController;</span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">HelloController</span> </span>{</span><br><span class="line"> <span class="meta">@RequestMapping("/hello")</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">hello01</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"第一个springboot hello "</span>;</span><br><span class="line"> System.out.println(<span class="string">"Springboot程序启动成功"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<p>点击启动MainApplication</p>
<p><img src="https://i.loli.net/2021/11/19/ZSj5ATgpJKtFvRG.png"></p>
<p>如果显示端口被占用</p>
<p><img src="https://i.loli.net/2021/11/19/NGvJwUrAL3OYQdj.png"></p>
<p>则我们在resource包建一个文件application.properties</p>
<p><code>server.port=8111</code></p>
<p>定义这个没有被使用的端口</p>
<p><img src="https://i.loli.net/2021/11/19/jcBPxiRn3Ho68hu.png"></p>
<p>输出了我们写的内容 表示启动成功</p>
<p>我们用127.0.0.1+端口 /hello 来访问 例如我的就是127.0.0.1:8111/hello</p>
<p><img src="https://i.loli.net/2021/11/19/WeOlqNGX29dZ4Kt.png"></p>
<p>就可以显示成功啦</p>
]]></content>
<tags>
<tag>springboot</tag>
</tags>
</entry>
<entry>
<title>面试-哈啰一面</title>
<url>/2022/09/18/%E5%93%88%E5%95%B0%E5%87%BA%E8%A1%8C/</url>
<content><![CDATA[<h1 id="简单的自我介绍"><a href="#简单的自我介绍" class="headerlink" title="简单的自我介绍"></a>简单的自我介绍</h1><span id="more"></span>
<h2 id="项目"><a href="#项目" class="headerlink" title="项目"></a>项目</h2><p>模糊查询是怎么样设计</p>
<p>%模糊查询性能比较差 有没有更好的方法 es</p>
<p>Excel 导入与导出</p>
<p>10w行的excel导入会出现什么问题 </p>
<p>如果中间解析失败 导致整个异常怎么办</p>
<p>提高接口响应速度 </p>
<h2 id="基础问题"><a href="#基础问题" class="headerlink" title="基础问题"></a>基础问题</h2><p>怎么理解操作系统当中的进程和线程 在你的实习当中有用到哪一个吗</p>
<p>spring是怎么工作的</p>
<p>有看过spring相关的书吗</p>
<p>书看了多少呢 里面讲了多少知识呢</p>
<p>你学的计算机网络大概分几层 每层的作用大概是做什么</p>
<p>堆和栈有什么区别吗</p>
<p>你能简述一个你所熟悉的排序算法 + 原理</p>
<h2 id="写SQL"><a href="#写SQL" class="headerlink" title="写SQL"></a>写SQL</h2><table>
<thead>
<tr>
<th align="left">学生表</th>
<th>考试得分表</th>
<th>班级表</th>
</tr>
</thead>
<tbody><tr>
<td align="left">学生id</td>
<td>学生id</td>
<td>班级id</td>
</tr>
<tr>
<td align="left">学生姓名</td>
<td>课程名</td>
<td>班级名</td>
</tr>
<tr>
<td align="left">班级id</td>
<td>得分</td>
<td></td>
</tr>
</tbody></table>
<p>求语文平均分最高的班级名</p>
<p>代码管理工具 怎么提交代码 以及 解决代码冲突</p>
<p>怎样保证你自己开发的质量</p>
<p>有了解过程序员这个职业吗 后面有什么自己的职业规划</p>
<p>怎么样实现你所说的这个目标呢</p>
<p>上一份工作为什么辞职了呢</p>
<p>主要是看上海还是杭州啊</p>
<h2 id="反问"><a href="#反问" class="headerlink" title="反问"></a>反问</h2><ul>
<li>主要业务是哪一块</li>
<li>校招生需要加强哪一块</li>
<li>觉得表现怎么样</li>
</ul>
]]></content>
<tags>
<tag>实习</tag>
</tags>
</entry>
<entry>
<title>兑吧实习一面+二面+hr面 已OC</title>
<url>/2022/09/23/%E5%85%91%E5%90%A7%E6%8A%80%E6%9C%AF%E4%B8%80%E9%9D%A2%E3%80%81%E4%BA%8C%E9%9D%A2%E3%80%81HR%E9%9D%A2/</url>
<content><![CDATA[<h1 id="兑吧一面-9-22下午"><a href="#兑吧一面-9-22下午" class="headerlink" title="兑吧一面 9.22下午"></a>兑吧一面 9.22下午</h1><p>不得不说流程是真的快 9.21 实习同事推简历过去 9.22早上约一面的电话 半小时不到约第二天早上二面 半小时不到约hr面 hr面不到一小时OC</p>
<span id="more"></span>
<p>自我介绍</p>
<ul>
<li>Java集合认识的多吗</li>
<li>ArrayList和LinkedList的区别</li>
<li>HashMap有了解吗</li>
<li>你刚刚 说了HashMap的put方法 详细讲讲</li>
<li>得到下标是异或和位运算 讲讲为什么这样设计</li>
<li>怎么保证得到的数组下标在范围里面</li>
<li>随着你不断的放元素 他会有什么变化吗</li>
<li>为什么是双倍的扩张</li>
<li>它是不安全的类 那我们考虑线程安全的时候有什么替代方案吗</li>
<li>currentHashMap怎么做到线程安全的 数组 + segment + 分段锁 </li>
<li>哪些方式实现线程安全</li>
<li>sychronize你认识多少呢</li>
<li>有了解过他底层的实现吗</li>
<li>在你去使用sychronize的时候会注意什么 </li>
<li>Java除了sychronize还有其他的方式实现线程安全</li>
<li>除了volatile+juc.automic还有其他的吗?</li>
<li>有听说过Lock吗 Java中有哪些</li>
<li>AQS是什么?怎么用?</li>
<li>有听说过ReentrantLock吗</li>
<li>你对JVM的认识有多少</li>
<li>JVM五个区域哪几个区域会发生内存泄露呢</li>
<li>静态成员变量 在哪个区域 方法区</li>
<li>类的成员变量在哪个区域</li>
<li>垃圾回收算法</li>
<li>标记清除和标记整理来说他的好处在哪里</li>
<li>线程池有了解吗 什么是线程池有了解</li>
<li>做项目的时候有用到过线程池吗</li>
<li>有没有如何去了解过去创建一个线程池</li>
<li>mysql用的是什么搜索引擎</li>
<li>innodb和myisam有什么区别</li>
<li>事务有什么特性</li>
<li>innodb是怎么做的事务的 四个隔离级别</li>
<li>默认的隔离级别</li>
<li>可重复读解决了哪些问题</li>
<li>什么是幻读</li>
<li>mysql是索引怎么分</li>
<li>Hash索引和b+树索引有什么区别</li>
<li>单向链表的作用呢</li>
<li>where id < 5是怎么查询的</li>
<li>刚刚讲到索盖覆盖 索引覆盖是什么场景</li>
<li>在使用覆盖索引需要注意什么 最左浅醉原则 </li>
<li>以前项目讲到接口速度优化?</li>
<li>有接触过分布锁吗?怎么实现?</li>
<li>数据库是怎么实现分布式锁的?</li>
<li>redis实现分布式锁</li>
<li>使用redis分布式锁需要注意的地方</li>
<li>会设计分布式锁的过期时间吗</li>
<li>如何保证 redis 可重入锁</li>
<li>或者可以简单说一下什么是可重入吗 没有听过</li>
<li>如果让你去猜 你觉得他应该是什么样的性质</li>
<li>git的命令有哪些</li>
<li>聊下Spring, 你对Spring的认知</li>
<li>日志功能怎么实现呢</li>
<li>redis在项目里面主要做什么</li>
<li>常用的数据结构</li>
<li>zest是什么结构</li>
<li>平时的学习途径和频率</li>
<li>反问</li>
<li>技术栈 springcloud + redis</li>
<li>底层是否需要钻研? 需要有一个认知</li>
<li>工程经验和基础扎实哪个更重要 更侧重哪方面 基础扎实</li>
</ul>
<h1 id="兑吧二面-9-22上午"><a href="#兑吧二面-9-22上午" class="headerlink" title="兑吧二面 9.22上午"></a>兑吧二面 9.22上午</h1><p>自我介绍</p>
<p>讲讲项目</p>
<ul>
<li>多并发怎么实现的?</li>
<li>redis用来干嘛的</li>
<li>MQ用来干嘛的</li>
<li>robocom一等奖讲讲</li>
<li>实习的接口调优</li>
<li>为什么要从上家公司离职</li>
<li>是主要看杭州还是上海</li>
<li>有了解过我们公司的业务是做什么的吗</li>
</ul>
<p>后面就是介绍公司的业务,新人培养机制 项目制导向 有时候会忙</p>
<p>调休机制 等等 差不多介绍了10分钟</p>
<p>二面面完没多久就约hr面了 约在了下午两点</p>
<h1 id="兑吧HR面"><a href="#兑吧HR面" class="headerlink" title="兑吧HR面"></a>兑吧HR面</h1><ul>
<li>最近有一段实习的经历 怎么没有继续做下去</li>
<li>老家是哪的</li>
<li>这两个项目是在学校做的还是在实习的时候做的</li>
<li>讲一个项目印象深刻的案例</li>
<li>那你觉得具体项目做完之后最大的提升之后是什么?</li>
<li>个人觉得从事Java行业有什么优势</li>
<li>除了技能这个方面 个人还要在职场学习什么方面</li>
<li>什么时候自己会比较沮丧</li>
<li>个人比较倾向什么样的leader</li>
<li>你觉得是自己是主动性比较强的人吗</li>
<li>工作的话是兴趣导向为主吗</li>
<li>未来3-5年的个人规划</li>
<li>你觉得你周围有做的比较好的同学和同事吗</li>
<li>高强度学习?什么算高强度学习</li>
<li>像你们上一段实习工作强度大吗</li>
<li>那你为什么要考虑来杭州发展</li>
<li>找实习都在杭州吗?</li>
<li>其他公司面的怎么样</li>
</ul>
<p>这家真的速度非常快 面完半小时内就沟通下一面的时间</p>
<p>hr面完一小时就OC了 </p>
]]></content>
<tags>
<tag>面试</tag>
</tags>
</entry>
<entry>
<title>年终总结</title>
<url>/2022/01/01/%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93/</url>
<content><![CDATA[<p> 送走了迷茫的2021年 迎来了可能最为艰难的2022年 上学期突然下定决心决定工作,这学期开学到现在陆陆续续的刷了150道力扣 其实很多都是水题。不过像我这样努力了一个月也去拿了个程序设计二等奖。也明白了我现在一直坚持的一句话,</p>
<p><strong>任何时候努力都不算晚</strong></p>
<span id="more"></span>
<p><img src="https://s2.loli.net/2022/01/01/fbXKBq5ujagpmzk.png"></p>
<p>也许愿一下自己来年的愿望吧 希望自己能够春招实习能够找到一份好的实习,秋招能够找到自己满意的工作。去想去的上海,弥补高考的遗憾。</p>
<p>也给来年一些期许吧</p>
<p>1.力扣打卡 每月满勤</p>
<p>2.数据结构全部再过一遍</p>
<p>3.学好八股!</p>
]]></content>
<tags>
<tag>碎碎念</tag>
</tags>
</entry>
<entry>
<title>操作系统-操作系统</title>
<url>/2022/03/14/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/</url>
<content><![CDATA[<h1 id="操作系统"><a href="#操作系统" class="headerlink" title="操作系统"></a>操作系统</h1><h2 id="什么是操作系统?"><a href="#什么是操作系统?" class="headerlink" title="什么是操作系统?"></a>什么是操作系统?</h2><ul>
<li><p>操作系统(Operating System)是管理计算机硬件和软件资源的程序 是计算机的基石</p>
</li>
<li><p><strong>操作系统本质上是一个运行在计算机上的软件程序 ,用于管理计算机硬件和软件资源。</strong> 举例:运行在你电脑上的所有应用程序都通过操作系统来调用系统内存以及磁盘等等硬件。</p>
</li>
<li><p><strong>操作系统存在屏蔽了硬件层的复杂性。</strong> 操作系统就像是硬件使用的负责人,统筹着各种相关事项。</p>
</li>
<li><p><strong>操作系统的内核(Kernel)是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理</strong>。 内核是连接应用程序和硬件的桥梁,决定着系统的性能和稳定性。</p>
<span id="more"></span></li>
</ul>
<p>根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:</p>
<ol>
<li>用户态(user mode) : 用户态运行的进程可以直接读取用户程序的数据。</li>
<li>系统态(kernel mode):可以简单的理解系统态运行的进程或程序几乎可以访问计算机的任何资源,不受限制。</li>
</ol>
<h2 id="线程与进程的关系"><a href="#线程与进程的关系" class="headerlink" title="线程与进程的关系"></a>线程与进程的关系</h2><p>线程是进程划分成最小的运行单位,一个进程在其执行的过程中可以产生多个线程。</p>
<p>线程与进程最大的区别是 </p>
<p>进程各部分是独立的 而各线程则不一定·</p>
<p>因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反</p>
<p>进程有哪几种状态</p>
<ul>
<li><strong>创建状态:</strong> 进程目前正在被创建,尚未到就绪状态。</li>
<li><strong>就绪状态:</strong> 进程已处于准备允许状态。即进程获得了除了处理器之外的一切所需资源。一但得到处理器资源(处理器分配的时间片)即可运行。</li>