Repository navigation
Expand file tree
/
Copy pathJavajibenchengxushejijiegou.html-Cu8qFqmk.js
More file actions
102 lines (102 loc) · 70.6 KB
/
Copy pathJavajibenchengxushejijiegou.html-Cu8qFqmk.js
File metadata and controls
102 lines (102 loc) · 70.6 KB
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
import{_ as a,c as s,e,o as t}from"./app-B42q5VFX.js";const p={};function c(o,n){return t(),s("div",null,n[0]||(n[0]=[e(`<h1 id="java基本程序设计结构" tabindex="-1"><a class="header-anchor" href="#java基本程序设计结构"><span>Java基本程序设计结构</span></a></h1><h2 id="_1-java项目构建" tabindex="-1"><a class="header-anchor" href="#_1-java项目构建"><span>1 Java项目构建</span></a></h2><p>源代码的文件名必须和公共类的类名相同,并用 <code>.java</code> 作为扩展名。运行已编译的程序时,虚拟机总是从指定类中的 <code>main</code> 方法开始执行代码。例如以下程序</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Sample</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"Hello World!"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="_2-数据类型" tabindex="-1"><a class="header-anchor" href="#_2-数据类型"><span>2 数据类型</span></a></h2><h3 id="_2-1-整型" tabindex="-1"><a class="header-anchor" href="#_2-1-整型"><span>2.1 整型</span></a></h3><table><thead><tr><th style="text-align:center;">类型</th><th style="text-align:center;">长度</th><th style="text-align:center;">范围</th></tr></thead><tbody><tr><td style="text-align:center;"><code>byte</code></td><td style="text-align:center;"><code>1</code>字节</td><td style="text-align:center;">-128~127</td></tr><tr><td style="text-align:center;"><code>short</code></td><td style="text-align:center;"><code>2</code>字节</td><td style="text-align:center;">-32768~32767</td></tr><tr><td style="text-align:center;"><code>int</code></td><td style="text-align:center;"><code>4</code>字节</td><td style="text-align:center;">-2147483648~2147483647</td></tr><tr><td style="text-align:center;"><code>long</code></td><td style="text-align:center;"><code>8</code>字节</td><td style="text-align:center;">-9223372036854775808~9223372036854775807</td></tr></tbody></table><p>特别的,长整型字面量有一个后缀 <code>l</code> 或 <code>L</code> ;另外,可以给数字字面量添加下划线,10进制每3位分隔,2进制每4位分隔。</p><p>注意,Java没有无符号类型。</p><h3 id="_2-2-浮点型" tabindex="-1"><a class="header-anchor" href="#_2-2-浮点型"><span>2.2 浮点型</span></a></h3><p>Java的浮点型分为 <code>float</code> 和 <code>double</code> 两种,单精度浮点型字面量有一个 <code>f</code> 或 <code>F</code> 后缀,无后缀或者 <code>d</code> 或 <code>D</code> 后缀的字面量为双精度浮点型。可以使用十六进制表示浮点数字面量,用 <code>p</code> 表示指数。尾数采用十六进制,指数采用十进制,指数以2为基数。</p><p>另外有三个特殊的浮点数常量</p><ol><li><code>Double.POSITIVE_INFINITY</code>表示正无穷</li><li><code>Double.NEGATIVE_INFINITY</code>表示负无穷</li><li><code>Double.NaN</code>表示<code>not_a_number</code></li></ol><p>所有的 <code>NaN</code> 都认为是不相同的,可以使用 <code>Double.isNan</code> 方法来检测。</p><h3 id="_2-3-char型" tabindex="-1"><a class="header-anchor" href="#_2-3-char型"><span>2.3 char型</span></a></h3><p><code>char</code> 类型的范围从 <code>\\u0000</code> 到 <code>\\uFFFF</code> ,转义序列 <code>\\u</code> 可以在加引号字符或字符串字面量之外使用,并且其会在解析代码之前处理。这种转义序列可能会带来一些意想不到的错误。</p><p>Java的 <code>char</code> 类型采用了16位的Unicode字符集。码点是指与一个编码表中的某个字符对应的代码值,在Unicode标准中,码点采用十六进制书写,并加前缀 <code>U+</code> 。Unicode的码点分成17个代码平面,第一个代码平面称为基本多语言平面,包括码点从 <code>U+0000</code> 到 <code>U+FFFF</code> 的经典Unicode代码;其余16个代码平面的码点从 <code>U+10000</code> 到 <code>U+10FFFF</code> 包括各种辅助字符。</p><p>UTF-16编码采用不同长度的代码表示所有的Unicode码点。在基本多语言平面中,每个字符用16位表示称为代码单元,辅助字符编码为一对连续的代码单元。采用这种编码对表示的每个值都属于基本多语言平面中未使用的2048个值的范围,通常称为替代区域。其中 <code>U+D800</code> 到 <code>U+DBFF</code> 用于第一个代码单元, <code>U+DC00</code> 到 <code>U+DFFF</code> 用于第二个代码单元。</p><p>在Java中, <code>char</code> 类型描述了采用UTF-16编码的一个代码单元。</p><h3 id="_2-4-boolean类型" tabindex="-1"><a class="header-anchor" href="#_2-4-boolean类型"><span>2.4 boolean类型</span></a></h3><p><code>boolean</code> 类型有 <code>true</code> 和 <code>false</code> 两个值,整型和布尔型直接不能相互转换。</p><h2 id="_3-变量与常量" tabindex="-1"><a class="header-anchor" href="#_3-变量与常量"><span>3 变量与常量</span></a></h2><h3 id="_3-1-变量" tabindex="-1"><a class="header-anchor" href="#_3-1-变量"><span>3.1 变量</span></a></h3><p>可以使用 <code>var</code> 而无需指定类型来声明变量,如果可以从变量的初始值推断出它的类型。</p><p>相当于C++中的 <code>auto</code> 关键字。</p><h3 id="_3-2-常量" tabindex="-1"><a class="header-anchor" href="#_3-2-常量"><span>3.2 常量</span></a></h3><p>可以使用 <code>final</code> 指示常量,习惯上常量名使用全大写。</p><p>可以使用 <code>static final</code> 设置类常量。</p><p>Java并没有使用 <code>const</code> 关键字,必须使用 <code>final</code> 声明常量。</p><h2 id="_4-运算符" tabindex="-1"><a class="header-anchor" href="#_4-运算符"><span>4 运算符</span></a></h2><h3 id="_4-1-switch表达式" tabindex="-1"><a class="header-anchor" href="#_4-1-switch表达式"><span>4.1 switch表达式</span></a></h3><p>例如以下程序代码</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token class-name">String</span> seasonName <span class="token operator">=</span> <span class="token keyword">switch</span><span class="token punctuation">(</span>seasonCode<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token keyword">case</span> <span class="token number">0</span> <span class="token operator">-></span> <span class="token string">"Spring"</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token keyword">case</span> <span class="token number">1</span> <span class="token operator">-></span> <span class="token string">"Summer"</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token keyword">case</span> <span class="token number">2</span> <span class="token operator">-></span> <span class="token string">"Fall"</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token keyword">case</span> <span class="token number">3</span> <span class="token operator">-></span> <span class="token string">"Winter"</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token keyword">default</span> <span class="token operator">-></span> <span class="token string">"???"</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>case</code> 标签还可以是字符串或枚举类型常量。可以为各个 <code>case</code> 提供多个标签,用逗号分隔。</p><p>在 <code>switch</code> 表达式中使用枚举类型常量时,不需要为各个标签提供枚举名。</p><p>需要注意的是 <code>switch</code> 表达式必须生成一个值。</p><p>如果操作数为 <code>null</code> 会抛出一个 <code>NullPointerException</code> 异常。</p><h3 id="_4-2-位运算符" tabindex="-1"><a class="header-anchor" href="#_4-2-位运算符"><span>4.2 位运算符</span></a></h3><p>运算符 <code>>></code> 和 <code><<</code> 可以将位模式左移或右移,运算符 <code>>>></code> 会用 <code>0</code> 填充高位,而 <code>>></code> 会用符号位填充高位,不存在 <code><<<</code> 运算符。移位运算符的右操作数要完成模32或模64运算,例如 <code>(int)1<<35</code> 等同于 <code>(int)1<<3</code> 的结果。</p><h2 id="_5-字符串" tabindex="-1"><a class="header-anchor" href="#_5-字符串"><span>5 字符串</span></a></h2><p>Java的字符串是不可变的,可以通过提取想要保留的子串,再和希望替换的字符拼接。</p><p>不要使用 <code>==</code> 判断两个字符串是否相等,完全有可能将多个相等的字符串副本存放在不同的位置上。如果虚拟机总是共享相等的字符串,则可以使用 <code>==</code> 检测字符串是否相等,但实际上只有字符串字面量会共享,而 <code>+</code> 或 <code>substring</code> 等操作得到的字符串并不共享。</p><p>空串不同于Null串,要检测一个字符串是否为 <code>null</code> 可以使用 <code>if(str==null)</code> 代码,在执行各种操作之前必须检测操作对象是否为 <code>null</code> 值。</p><h3 id="_5-1-字符串api" tabindex="-1"><a class="header-anchor" href="#_5-1-字符串api"><span>5.1 字符串API</span></a></h3><p>下面是一些常用的String API</p><ul><li><p><code>char charAt(int index)</code></p><p>返回指定位置的代码单元</p></li><li><p><code>int codePointAt(int index)</code></p><p>返回从给定位置开始的码点</p></li><li><p><code>int offsetByCodePoints(int startIndex, int cpCount)</code></p><p>返回从 <code>startPoint</code> 开始 <code>cpCount</code> 个码点后的码点索引。</p></li><li><p><code>int compareTo(String other)</code></p><p>如果字符串位于 <code>other</code> 之前返回负数,位于之后返回正数,相等返回 <code>0</code> 。</p></li><li><p><code>IntStream codePoints()</code></p><p>将这个字符串的码点作为一个流返回,调用 <code>toArray</code> 将它们存放在一个数组中。</p></li><li><p><code>new String(int[] codePoints, int offset, int count)</code></p><p>用数组中从 <code>offset</code> 开始的 <code>count</code> 个码点构造一个字符串。</p></li><li><p><code>boolean isEmpty()</code></p><p>如果字符串为空,返回 <code>true</code> 。</p></li><li><p><code>boolean isBlank()</code></p><p>如果字符串由空白符组成,返回 <code>true</code> 。</p></li><li><p><code>boolean equals(Object other)</code></p><p>如果字符串和 <code>other</code> 相等返回 <code>true</code> 。</p></li><li><p><code>boolean equalsIgnoreCase(String other)</code></p><p>如果字符串和 <code>other</code> 忽略大小写后相等,返回 <code>true</code> 。</p></li><li><p><code>boolean startsWith(String prefix)</code></p><p>如果字符串以 <code>prefix</code> 开头返回 <code>true</code> 。</p></li><li><p><code>boolean endsWith(String suffix)</code></p><p>如果字符串以 <code>suffix</code> 结尾返回 <code>true</code> 。</p></li><li><p><code>int indexOf(String str)</code></p></li><li><p><code>int indexOf(String str, int fromIndex)</code></p></li><li><p><code>int indexOf(int cp)</code></p></li><li><p><code>int indexOf(int cp, int fromIndex)</code></p><p>返回与字符串 <code>str</code> 或码点 <code>cp</code> 相等的第一个子串的开始位置,从 <code>0</code> 或 <code>fromIndex</code> 开始匹配。如果 <code>str</code> 不在字符串中返回 <code>-1</code> 。</p></li><li><p><code>int lastIndexOf(String str)</code></p></li><li><p><code>int lastIndexOf(String str, int fromIndex)</code></p></li><li><p><code>int lastIndexOf(int cp)</code></p></li><li><p><code>int lastIndexOf(int cp, int fromIndex)</code></p><p>返回与字符串 <code>str</code> 或码点 <code>cp</code> 相等的最后一个子串的开始位置,从字符串末尾或 <code>fromIndex</code> 开始匹配。如果 <code>str</code> 不在字符串中返回 <code>-1</code> 。</p></li><li><p><code>int length()</code></p><p>返回字符串代码单元的个数。</p></li><li><p><code>int codePointCount(int startIndex, int endIndex)</code></p><p>返回从 <code>startIndex</code> 到 <code>endIndex-1</code> 之间的码点个数。</p></li><li><p><code>String replace(CharSequence oldString, CharSequence newString)</code></p><p>返回用 <code>newString</code> 替换原字符串中所有 <code>oldString</code> 得到的字符串,可以使用 <code>String</code> 或 <code>StringBuilder</code> 对象作为 <code>CharSequence</code> 参数。</p></li><li><p><code>String substring(int beginIndex)</code></p></li><li><p><code>String substring(int beginIndex, int endIndex)</code></p><p>返回从 <code>beginIndex</code> 到字符串末尾或 <code>endIndex-1</code> 的所有代码单元组成的字符串。</p></li><li><p><code>String toLowerCase()</code></p></li><li><p><code>String toUpperCase()</code></p><p>将原字符串中所有的大写字母替换成小写字母,或者将所有的小写字母替换成大写字母。</p></li><li><p><code>String strip()</code></p></li><li><p><code>String stripLeading()</code></p></li><li><p><code>String stripTrailing()</code></p><p>返回将原字符串头尾或者仅头部或尾部的空白符去掉的新字符串。</p></li><li><p><code>String join(CharSequence delimiter, CharSequence... elements)</code></p><p>返回用给定的定界符连接所有元素得到的新字符串。</p></li><li><p><code>String repeat(int count)</code></p><p>返回将当前字符串重复 <code>count</code> 次得到的新字符串。</p></li></ul><h3 id="_5-2-遍历字符串" tabindex="-1"><a class="header-anchor" href="#_5-2-遍历字符串"><span>5.2 遍历字符串</span></a></h3><p>遍历字符串的第一种方法是使用循环变量依次访问</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token comment">// 正向遍历</span></span>
<span class="line"><span class="token keyword">int</span> cp <span class="token operator">=</span> sentence<span class="token punctuation">.</span><span class="token function">codePointAt</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">i <span class="token operator">+=</span> <span class="token class-name">Character</span><span class="token punctuation">.</span><span class="token function">charCount</span><span class="token punctuation">(</span>cp<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token comment">// 反向遍历</span></span>
<span class="line">i<span class="token operator">--</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token class-name">Character</span><span class="token punctuation">.</span><span class="token function">isSurrogate</span><span class="token punctuation">(</span>sentence<span class="token punctuation">.</span><span class="token function">charAt</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> i<span class="token operator">--</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">int</span> cp <span class="token operator">=</span> sentence<span class="token punctuation">.</span><span class="token function">codePointAt</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>第二种方法是使用 <code>codePoints</code> 方法生成 <code>int</code> 值的一个流,每个 <code>int</code> 值对应一个码点,可以将流转换成一个数组再进行遍历。</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> codePoints <span class="token operator">=</span> str<span class="token punctuation">.</span><span class="token function">codePoints</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toArray</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> cp <span class="token operator">:</span> codePoints<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_5-3-转换字符串" tabindex="-1"><a class="header-anchor" href="#_5-3-转换字符串"><span>5.3 转换字符串</span></a></h3><p>对于很多类型,都可以使用 <code>toString</code> 方法将其转换为一个字符串。这是一个定义在 <code>Object</code> 类中的方法,很多类扩展了它。</p><h3 id="_5-4-注意" tabindex="-1"><a class="header-anchor" href="#_5-4-注意"><span>5.4 注意</span></a></h3><p>虚拟机不一定将字符串实现为代码单元序列,在Java 9中使用了一个更紧凑的表示。只包含单字节代码单元的字符串使用 <code>byte</code> 数组实现,所有其他字符串使用 <code>char</code> 数组。</p><h3 id="_5-5-构建字符串" tabindex="-1"><a class="header-anchor" href="#_5-5-构建字符串"><span>5.5 构建字符串</span></a></h3><p>使用 <code>StringBuilder</code> 类或者 <code>StringBuffer</code> 类构建字符串,可以避免频繁拼接带来的效率下降问题。</p><blockquote><p><code>StringBuffer</code> 类的效率不如 <code>StringBuilder</code> 类,不过它允许采用多线程的方式添加或删除字符。这两个类的API是相同的。</p></blockquote><p>下面是常用的API</p><ul><li><p><code>StringBuilder()</code></p><p>创建空的字符串构建器。</p></li><li><p><code>int length()</code></p><p>返回构建器或缓冲器中的代码单元的个数。</p></li><li><p><code>StringBuilder append(String str)</code></p><p>追加一个字符串并返回 <code>this</code> 。</p></li><li><p><code>StringBuilder appendCodePoint(int cp)</code></p><p>追加一个码点,将其转化为一个或两个代码单元并追加后返回 <code>this</code> 。</p></li><li><p><code>void setCharAt(int i, int c)</code></p><p>将第 <code>i</code> 个代码单元设置为 <code>c</code> 。</p></li><li><p><code>StringBuilder insert(int offset, char c)</code></p></li><li><p><code>StringBuilder insert(int offset, String str)</code></p><p>在 <code>offset</code> 位置插入一个字符串 <code>str</code> 或代码单元 <code>c</code> 并返回 <code>this</code> 。</p></li><li><p><code>StringBuilder delete(int startIndex, int endIndex)</code></p><p>删除从 <code>startIndex</code> 到 <code>endIndex-1</code> 的代码单元并返回 <code>this</code> 。</p></li><li><p><code>String toString()</code></p><p>返回构建器或缓冲器生成的字符串。</p></li></ul><h3 id="_5-6-文本块" tabindex="-1"><a class="header-anchor" href="#_5-6-文本块"><span>5.6 文本块</span></a></h3><p>文本块是Java 15的新特性,可以很容易地提供跨过多行的字符串字面量。文本块以 <code>"""</code> 开头,后面是一个换行符,并以另一个 <code>"""</code> 结尾。如果不想要最后一行后面的换行符,可以让结束 <code>"""</code> 紧跟在最后一个字符的后面。</p><p>除此之外,需要注意以下几点:</p><ol><li>一般不需要对引号转义,只有两种情况需要转义: <ul><li>文本块以一个引号结尾;</li><li>文本块中包含三个或更多引号组成的序列。</li></ul></li><li>所有的反斜线都需要转义。</li><li>行尾的反斜线会把这一行和下一行连接起来。</li><li>文本块会对行结束符进行标准化,删除末尾的空白符,并把Windows的行结束符 <code>\\r\\n</code> 替换成简单的 <code>\\n</code> 换行符。</li><li>如果确实需要保留末尾的空格,可以把最后一个空格转换为一个 <code>\\s</code> 转义序列。</li><li>对于文本块中的缩进,空白符前缀必须与文本块中的所有行完全匹配,去除缩进过程中不考虑空行。结束符前面的空白符必须要缩进到想要去除的空白符的末尾。如果一个文本块中包含非Java代码,最好沿左边界放置。</li></ol><p>对于第6条考虑以下代码:</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token class-name">String</span> html <span class="token operator">=</span> <span class="token triple-quoted-string string">"""</span>
<span class="line"> <div class="Warning"></span>
<span class="line"> Beware of those who say "Hello" to the world</span>
<span class="line"> </div></span>
<span class="line"> """</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>实际得到的字符串等价为</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token class-name">String</span> html <span class="token operator">=</span> <span class="token string">"<div class=\\"Warning\\">\\n Beware of those who say \\"Hello\\" to the world\\n</div>\\n"</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><h2 id="_6-输入与输出" tabindex="-1"><a class="header-anchor" href="#_6-输入与输出"><span>6 输入与输出</span></a></h2><h3 id="_6-1-读取输入" tabindex="-1"><a class="header-anchor" href="#_6-1-读取输入"><span>6.1 读取输入</span></a></h3><p>从标准输入流中读取首先需要创建一个 <code>Scanner</code> 对象。</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token class-name">Scanner</span> in <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Scanner</span><span class="token punctuation">(</span><span class="token class-name">System</span><span class="token punctuation">.</span>in<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>由于 <code>Scanner</code> 类不是在 <code>java.lang</code> 包而是在 <code>java.util</code> 包中定义,所以需要手动导入</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">import</span> <span class="token import"><span class="token namespace">java<span class="token punctuation">.</span>util<span class="token punctuation">.</span></span><span class="token operator">*</span></span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>另外如果想要处理密码,可以考虑使用 <code>Console</code> 类。</p><p>下面是一些常用的 <code>Scanner</code> 类API</p><ul><li><p><code>Scanner(InputStream in)</code></p><p>用给定的流构造一个 <code>Scanner</code> 对象。</p></li><li><p><code>String nextLine()</code></p><p>读取下一行输入。</p></li><li><p><code>String next()</code></p><p>读取输入的下一个单词。</p></li><li><p><code>int nextInt()</code></p></li><li><p><code>double nextDouble()</code></p><p>读取下一个数值。</p></li><li><p><code>boolean hasNext()</code></p><p>检测输入中是否还有其他单词。</p></li><li><p><code>boolean hasNextInt()</code></p></li><li><p><code>boolean hasNextDouble()</code></p><p>检测下一个字符序列是否表示一个整数或浮点数。</p></li></ul><h3 id="_6-2-格式化输出" tabindex="-1"><a class="header-anchor" href="#_6-2-格式化输出"><span>6.2 格式化输出</span></a></h3><p>可以使用 <code>System.out.printf()</code> 方法完成格式化输出,语法和C语言中的 <code>printf()</code> 函数基本相同。</p><p>特别的,可以使用 <code>%s</code> 转换字符格式化任意对象,如果该对象实现了 <code>Formattable</code> 接口则会调用这个对象的 <code>formatTo</code> 方法;否则会调用 <code>toString</code> 方法将这个对象转换为一个字符串。</p><p>可以使用静态的 <code>String.format</code> 方法创建一个格式化字符串。</p><p>另外在Java 15中可以使用 <code>formatted</code> 方法完成同样的工作。</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token class-name">String</span> message <span class="token operator">=</span> <span class="token class-name">String</span><span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span>str<span class="token punctuation">,</span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token class-name">String</span> message <span class="token operator">=</span> str<span class="token punctuation">.</span><span class="token function">formatted</span><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_6-3-文件输入与输出" tabindex="-1"><a class="header-anchor" href="#_6-3-文件输入与输出"><span>6.3 文件输入与输出</span></a></h3><p>文件输入同样需要构建一个 <code>Scanner</code> 对象,例如</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token class-name">Scanner</span> in <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Scanner</span><span class="token punctuation">(</span><span class="token class-name">Path</span><span class="token punctuation">.</span><span class="token function">of</span><span class="token punctuation">(</span><span class="token string">"myfile.txt"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">StandardCharsets</span><span class="token punctuation">.</span><span class="token constant">UTF_8</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>如果文件名中包含反斜线符号则需要转义。</p><p>如果将字符串作为参数构建 <code>Scanner</code> 对象,那么 <code>Scanner</code> 会把这个字符串解释为输入数据而不是文件名。</p><p>如果想要写入文件,需要创建一个 <code>PrintWriter</code> 对象。</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token class-name">PrintWriter</span> out <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PrintWriter</span><span class="token punctuation">(</span><span class="token string">"myfile.txt"</span><span class="token punctuation">,</span> <span class="token class-name">StandardCharsets</span><span class="token punctuation">.</span><span class="token constant">UTF_8</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>使用方法和 <code>System.out</code> 相同。</p><blockquote><p>注意:指定一个相对文件名时,文件将相对于启动Java虚拟机的目录放置。</p></blockquote><p>下面是常用的输入输出API</p><ul><li><p><code>Scanner(Path p, String encoding)</code></p><p>由给定路径和给定字符编码创建读取对象。</p></li><li><p><code>Scanner(String data)</code></p><p>从给定字符串读取数据。</p></li><li><p><code>PrintWriter(String fileName)</code></p><p>由给定文件名创建写入文件对象。</p></li><li><p><code>static Path of(String pathname)</code></p><p>由给定路径创建一个 <code>Path</code> 对象。</p></li></ul><blockquote><p>需要注意抛出 <code>IOException</code> 异常;</p><p>需要注意放置在 <code>try-with-resources</code> 块中,如果放置在这样的语句块中,不需要显式抛出异常,并且无论是否抛出异常,程序都会自动关闭这些资源。</p></blockquote><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">Main</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token class-name">String</span><span class="token punctuation">[</span><span class="token punctuation">]</span> args<span class="token punctuation">)</span> <span class="token keyword">throws</span> <span class="token class-name">IOException</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token class-name">Scanner</span> in <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Scanner</span><span class="token punctuation">(</span><span class="token class-name">Path</span><span class="token punctuation">.</span><span class="token function">of</span><span class="token punctuation">(</span><span class="token string">"myFile.txt"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">StandardCharsets</span><span class="token punctuation">.</span><span class="token constant">UTF_8</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token keyword">try</span> <span class="token punctuation">(</span><span class="token class-name">PrintWriter</span> out <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PrintWriter</span><span class="token punctuation">(</span><span class="token string">"write.txt"</span><span class="token punctuation">,</span> <span class="token class-name">StandardCharsets</span><span class="token punctuation">.</span><span class="token constant">UTF_8</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token number">114514</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token punctuation">}</span></span>
<span class="line"> <span class="token keyword">try</span> <span class="token punctuation">(</span><span class="token class-name">Scanner</span> test <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Scanner</span><span class="token punctuation">(</span><span class="token class-name">Path</span><span class="token punctuation">.</span><span class="token function">of</span><span class="token punctuation">(</span><span class="token string">"newFile.txt"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token class-name">StandardCharsets</span><span class="token punctuation">.</span><span class="token constant">UTF_8</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token class-name">String</span> get <span class="token operator">=</span> test<span class="token punctuation">.</span><span class="token function">next</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token punctuation">}</span></span>
<span class="line"> <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这里只是粗略地介绍,更细节的问题将在后续章节介绍。</p><h2 id="_7-控制流程" tabindex="-1"><a class="header-anchor" href="#_7-控制流程"><span>7 控制流程</span></a></h2><h3 id="_7-1-switch语句" tabindex="-1"><a class="header-anchor" href="#_7-1-switch语句"><span>7.1 switch语句</span></a></h3><p><code>switch</code> 语句的语法规则和C/C++基本相同,下面是 <code>switch</code> 语句的基本形式。</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">switch</span> <span class="token punctuation">(</span>choice<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token keyword">case</span> <span class="token number">1</span> <span class="token operator">-></span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token keyword">case</span> <span class="token number">2</span> <span class="token operator">-></span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token keyword">case</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span> <span class="token operator">-></span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">;</span></span>
<span class="line"> <span class="token keyword">default</span> <span class="token operator">-></span> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>如果需要使用直通式 <code>switch</code> 语句,可以在外围方法添加注解,防止编译器生成警告。</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token annotation punctuation">@SuppressWarnings</span><span class="token punctuation">(</span><span class="token string">"fallthrough"</span><span class="token punctuation">)</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p><code>switch</code> 一共有四种,分别是有直通行为的 <code>switch</code> 表达式,无直通行为的 <code>switch</code> 表达式,有直通行为的 <code>switch</code> 语句,无直通行为的 <code>switch</code> 语句。</p><p>有直通的使用 <code>:</code> 作为 <code>case</code> 的结束符,无直通的使用 <code>-></code> 作为 <code>case</code> 的结束符。</p><p>在 <code>switch</code> 表达式中使用 <code>yield</code> 关键字可以给表达式生成一个值。需要注意的是 <code>switch</code> 表达式必须生成一个值,或者跟在 <code>-></code> 的后面,或者使用 <code>yield</code> 关键字。另外可以在 <code>switch</code> 表达式中抛出 <code>IllegalArgumentException</code> 异常,不允许在 <code>switch</code> 表达式中使用 <code>return</code> 或 <code>break</code> 或 <code>continue</code> 语句。</p><h3 id="_7-2-中断控制流程" tabindex="-1"><a class="header-anchor" href="#_7-2-中断控制流程"><span>7.2 中断控制流程</span></a></h3><p>在Java中可以使用带标签的 <code>break</code> 语句,标签必须放在想要跳出的最外层循环之前并紧跟一个冒号,执行带标签的 <code>break</code> 语句会跳转到带标签的语句块的末尾。另外,标签可以放在任意语句块之前,并且只能跳出语句块不能跳入语句块。另外还有带标签的 <code>continue</code> 语句,执行后将跳转到有匹配标签的循环的首部,直接执行标签处的下一次循环。</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line">label<span class="token operator">:</span></span>
<span class="line"><span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> <span class="token keyword">break</span> label<span class="token punctuation">;</span></span>
<span class="line"> <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2 id="_8-大数" tabindex="-1"><a class="header-anchor" href="#_8-大数"><span>8 大数</span></a></h2><p>大数是 <code>java.math</code> 包中的 <code>BigInteger</code> 类和 <code>BigDecimal</code> 类,可以实现高精度运算。但是由于无法实现运算符重载,使用起来会有一些不便。使用方法可以在需要时查阅相关资料,这里不再具体介绍。</p><h2 id="_9-数组" tabindex="-1"><a class="header-anchor" href="#_9-数组"><span>9 数组</span></a></h2><h3 id="_9-1-声明数组" tabindex="-1"><a class="header-anchor" href="#_9-1-声明数组"><span>9.1 声明数组</span></a></h3><p>声明数组有以下几种方式</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> a <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">int</span><span class="token punctuation">[</span><span class="token number">100</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token comment">// int a[] = new int[100];</span></span>
<span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> b <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">new</span> <span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">17</span><span class="token punctuation">,</span> <span class="token number">19</span><span class="token punctuation">,</span> <span class="token number">23</span><span class="token punctuation">,</span> <span class="token number">29</span><span class="token punctuation">,</span> <span class="token number">31</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>可以通过创建匿名数组将该数组绑定到原来的数组变量。</p><p>另外可以可以创建长度为 <code>0</code> 的数组,长度为 <code>0</code> 的数组和空数组并不相同。</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">new</span> arr<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">new</span> arr<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_9-2-访问数组元素" tabindex="-1"><a class="header-anchor" href="#_9-2-访问数组元素"><span>9.2 访问数组元素</span></a></h3><p>创建数字数组时,所有元素自动初始化为 <code>0</code> ,创建 <code>boolean</code> 数组自动初始化为 <code>false</code> ,创建对象数组自动初始化为 <code>null</code> 。</p><p>要想获得数组中的元素个数可以使用 <code>array.length</code> 操作。</p><h3 id="_9-3-范围for循环" tabindex="-1"><a class="header-anchor" href="#_9-3-范围for循环"><span>9.3 范围for循环</span></a></h3><p>形式如下</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">for</span> <span class="token punctuation">(</span>variable <span class="token operator">:</span> collection<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>其中 <code>collection</code> 必须是数组或者实现了 <code>Iterable</code> 接口的类对象。</p><h3 id="_9-4-数组拷贝" tabindex="-1"><a class="header-anchor" href="#_9-4-数组拷贝"><span>9.4 数组拷贝</span></a></h3><p>可以通过赋值让两个数组变量引用相同的数组对象</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arrOne <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arrTwo <span class="token operator">=</span> arrOne<span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>如果需要得到新的数组可以使用 <code>Arrays</code> 类的 <code>copyOf</code> 方法</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arrOne <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arrTwo <span class="token operator">=</span> <span class="token class-name">Arrays</span><span class="token punctuation">.</span><span class="token function">copyOf</span><span class="token punctuation">(</span>arrOne<span class="token punctuation">,</span> arrOne<span class="token punctuation">.</span>length<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>第二个参数时新数组的长度,可以用这个方法来增加数组的大小;如果新长度小于原长度,则只拷贝前面的数据;新增的数组元素自动填充,填充方式和创建新数组时相同。</p><p>Java的数组引用类似于C++的数组指针,并且Java的 <code>[]</code> 运算符会自动完成越界检查。</p><div class="language-c++ line-numbers-mode" data-highlighter="prismjs" data-ext="c++" data-title="c++"><pre class="language-c++"><code><span class="line">int* arr = new int[100];</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><h3 id="_9-5-命令行参数" tabindex="-1"><a class="header-anchor" href="#_9-5-命令行参数"><span>9.5 命令行参数</span></a></h3><p>需要注意的是Java的 <code>main</code> 方法中,程序名并不存储在 <code>args</code> 数组中。</p><h3 id="_9-6-数组排序" tabindex="-1"><a class="header-anchor" href="#_9-6-数组排序"><span>9.6 数组排序</span></a></h3><p>可以通过调用 <code>Arrays</code> 类的 <code>sort</code> 方法对数组进行排序,默认升序排列。也有其他的方法可以实现自定义排序。</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">sort</span><span class="token punctuation">(</span><span class="token class-name">T</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arr<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line">pubilc <span class="token keyword">static</span> <span class="token generics"><span class="token punctuation"><</span><span class="token class-name">T</span><span class="token punctuation">></span></span> <span class="token keyword">void</span> <span class="token function">sort</span><span class="token punctuation">(</span><span class="token class-name">T</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arr<span class="token punctuation">,</span> <span class="token keyword">int</span> startIndex<span class="token punctuation">,</span> <span class="token keyword">int</span> endIndex<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token generics"><span class="token punctuation"><</span><span class="token class-name">T</span><span class="token punctuation">></span></span> <span class="token keyword">void</span> <span class="token function">sort</span><span class="token punctuation">(</span><span class="token class-name">T</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arr<span class="token punctuation">,</span> <span class="token class-name">Comparator</span><span class="token generics"><span class="token punctuation"><</span><span class="token operator">?</span> <span class="token keyword">super</span> <span class="token class-name">T</span><span class="token punctuation">></span></span> c<span class="token punctuation">)</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_9-7-多维数组" tabindex="-1"><a class="header-anchor" href="#_9-7-多维数组"><span>9.7 多维数组</span></a></h3><h4 id="_9-7-1-初始化" tabindex="-1"><a class="header-anchor" href="#_9-7-1-初始化"><span>9.7.1 初始化</span></a></h4><p>以二维数组为例,下面是它的初始化方式</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arr1 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">int</span><span class="token punctuation">[</span>m<span class="token punctuation">]</span><span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arr2 <span class="token operator">=</span> </span>
<span class="line"><span class="token punctuation">{</span></span>
<span class="line"> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line"> <span class="token punctuation">{</span><span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">6</span><span class="token punctuation">,</span> <span class="token number">7</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line"> <span class="token punctuation">{</span><span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token number">11</span><span class="token punctuation">,</span> <span class="token number">12</span><span class="token punctuation">}</span><span class="token punctuation">,</span></span>
<span class="line"> <span class="token punctuation">{</span><span class="token number">13</span><span class="token punctuation">,</span> <span class="token number">14</span><span class="token punctuation">,</span> <span class="token number">15</span><span class="token punctuation">,</span> <span class="token number">16</span><span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="_9-7-2-循环" tabindex="-1"><a class="header-anchor" href="#_9-7-2-循环"><span>9.7.2 循环</span></a></h4><p>下面是二维数组的范围循环</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">int</span><span class="token punctuation">[</span>m<span class="token punctuation">]</span><span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> row <span class="token operator">:</span> arr<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">var</span> col <span class="token operator">:</span> row<span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> <span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span></span>
<span class="line"> <span class="token punctuation">}</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h4 id="_9-7-3-不规则数组" tabindex="-1"><a class="header-anchor" href="#_9-7-3-不规则数组"><span>9.7.3 不规则数组</span></a></h4><p>和C/C++相同,Java也没有多维数组,所谓的多维数组实际上是数组的数组。可以通过循环创建不规则数组。</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">int</span><span class="token punctuation">[</span>m<span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> m<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></span>
<span class="line"> arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">int</span><span class="token punctuation">[</span>i <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"><span class="token punctuation">}</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>Java的多维数组声明</p><div class="language-java line-numbers-mode" data-highlighter="prismjs" data-ext="java" data-title="java"><pre class="language-java"><code><span class="line"><span class="token keyword">int</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token punctuation">]</span> arr <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token keyword">int</span><span class="token punctuation">[</span>m<span class="token punctuation">]</span><span class="token punctuation">[</span>n<span class="token punctuation">]</span><span class="token punctuation">;</span></span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div></div></div><p>不同于C++的</p><div class="language-c++ line-numbers-mode" data-highlighter="prismjs" data-ext="c++" data-title="c++"><pre class="language-c++"><code><span class="line">int arr[m][n];</span>
<span class="line">int (*arr)[n] = new int[m][n];</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div></div></div><p>而是相当于完成了如下操作</p><div class="language-c++ line-numbers-mode" data-highlighter="prismjs" data-ext="c++" data-title="c++"><pre class="language-c++"><code><span class="line">int** arr = new int*[m];</span>
<span class="line">for (int i = 0; i < m; i++) {</span>
<span class="line"> arr[i] = new int[n];</span>
<span class="line">}</span>
<span class="line"></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>只有需要不规则数组时才需要手动完成上述操作。</p><h3 id="_9-8-常用数组api" tabindex="-1"><a class="header-anchor" href="#_9-8-常用数组api"><span>9.8 常用数组API</span></a></h3><ul><li><p><code>static String toString(T[] a)</code></p></li><li><p><code>static String deepToString(T[][] a)</code></p><p>将数组转化为字符串形式。</p></li><li><p><code>static T[] copyOf(T[] a, int end)</code></p></li><li><p><code>static T[] copyOfRange(T[] a, int start, int end)</code></p><p>拷贝数组元素并返回新的数组。</p></li><li><p><code>static void sort(T[] a)</code></p><p>排序数组。</p></li><li><p><code>static int binarySearch(T[] a, T v)</code></p></li><li><p><code>static int binarySearch(T[] a, int start, int end, T v)</code></p><p>使用二分查找算法在有序数组中查找对应元素,如果找到对应元素返回相应索引,否则返回负数值 <code>r</code> , <code>-r-1</code> 即该元素应该被插入的位置。</p></li><li><p><code>static void fill(T[] a, T v)</code></p><p>将数组的所有元素设置为 <code>v</code> 。</p></li><li><p><code>static boolean equals(T[] a, T[] b)</code></p><p>如果两个数组长度相同并且相同索引对应的元素都相同则返回 <code>true</code> 。</p></li><li><p><code>public static <T> void setAll(T[] array, IntFunction<? extends T> generator)</code></p><p>其中 <code>generator</code> 为接受索引并为该位置生成所需值的函数。</p></li></ul>`,157)]))}const i=a(p,[["render",c],["__file","Javajibenchengxushejijiegou.html.vue"]]),d=JSON.parse('{"path":"/blogs/Java/Javajibenchengxushejijiegou.html","title":"Java基本程序设计结构","lang":"en-US","frontmatter":{"title":"Java基本程序设计结构","categories":["Java"]},"headers":[{"level":2,"title":"1 Java项目构建","slug":"_1-java项目构建","link":"#_1-java项目构建","children":[]},{"level":2,"title":"2 数据类型","slug":"_2-数据类型","link":"#_2-数据类型","children":[{"level":3,"title":"2.1 整型","slug":"_2-1-整型","link":"#_2-1-整型","children":[]},{"level":3,"title":"2.2 浮点型","slug":"_2-2-浮点型","link":"#_2-2-浮点型","children":[]},{"level":3,"title":"2.3 char型","slug":"_2-3-char型","link":"#_2-3-char型","children":[]},{"level":3,"title":"2.4 boolean类型","slug":"_2-4-boolean类型","link":"#_2-4-boolean类型","children":[]}]},{"level":2,"title":"3 变量与常量","slug":"_3-变量与常量","link":"#_3-变量与常量","children":[{"level":3,"title":"3.1 变量","slug":"_3-1-变量","link":"#_3-1-变量","children":[]},{"level":3,"title":"3.2 常量","slug":"_3-2-常量","link":"#_3-2-常量","children":[]}]},{"level":2,"title":"4 运算符","slug":"_4-运算符","link":"#_4-运算符","children":[{"level":3,"title":"4.1 switch表达式","slug":"_4-1-switch表达式","link":"#_4-1-switch表达式","children":[]},{"level":3,"title":"4.2 位运算符","slug":"_4-2-位运算符","link":"#_4-2-位运算符","children":[]}]},{"level":2,"title":"5 字符串","slug":"_5-字符串","link":"#_5-字符串","children":[{"level":3,"title":"5.1 字符串API","slug":"_5-1-字符串api","link":"#_5-1-字符串api","children":[]},{"level":3,"title":"5.2 遍历字符串","slug":"_5-2-遍历字符串","link":"#_5-2-遍历字符串","children":[]},{"level":3,"title":"5.3 转换字符串","slug":"_5-3-转换字符串","link":"#_5-3-转换字符串","children":[]},{"level":3,"title":"5.4 注意","slug":"_5-4-注意","link":"#_5-4-注意","children":[]},{"level":3,"title":"5.5 构建字符串","slug":"_5-5-构建字符串","link":"#_5-5-构建字符串","children":[]},{"level":3,"title":"5.6 文本块","slug":"_5-6-文本块","link":"#_5-6-文本块","children":[]}]},{"level":2,"title":"6 输入与输出","slug":"_6-输入与输出","link":"#_6-输入与输出","children":[{"level":3,"title":"6.1 读取输入","slug":"_6-1-读取输入","link":"#_6-1-读取输入","children":[]},{"level":3,"title":"6.2 格式化输出","slug":"_6-2-格式化输出","link":"#_6-2-格式化输出","children":[]},{"level":3,"title":"6.3 文件输入与输出","slug":"_6-3-文件输入与输出","link":"#_6-3-文件输入与输出","children":[]}]},{"level":2,"title":"7 控制流程","slug":"_7-控制流程","link":"#_7-控制流程","children":[{"level":3,"title":"7.1 switch语句","slug":"_7-1-switch语句","link":"#_7-1-switch语句","children":[]},{"level":3,"title":"7.2 中断控制流程","slug":"_7-2-中断控制流程","link":"#_7-2-中断控制流程","children":[]}]},{"level":2,"title":"8 大数","slug":"_8-大数","link":"#_8-大数","children":[]},{"level":2,"title":"9 数组","slug":"_9-数组","link":"#_9-数组","children":[{"level":3,"title":"9.1 声明数组","slug":"_9-1-声明数组","link":"#_9-1-声明数组","children":[]},{"level":3,"title":"9.2 访问数组元素","slug":"_9-2-访问数组元素","link":"#_9-2-访问数组元素","children":[]},{"level":3,"title":"9.3 范围for循环","slug":"_9-3-范围for循环","link":"#_9-3-范围for循环","children":[]},{"level":3,"title":"9.4 数组拷贝","slug":"_9-4-数组拷贝","link":"#_9-4-数组拷贝","children":[]},{"level":3,"title":"9.5 命令行参数","slug":"_9-5-命令行参数","link":"#_9-5-命令行参数","children":[]},{"level":3,"title":"9.6 数组排序","slug":"_9-6-数组排序","link":"#_9-6-数组排序","children":[]},{"level":3,"title":"9.7 多维数组","slug":"_9-7-多维数组","link":"#_9-7-多维数组","children":[]},{"level":3,"title":"9.8 常用数组API","slug":"_9-8-常用数组api","link":"#_9-8-常用数组api","children":[]}]}],"git":{"createdTime":1726994140000,"updatedTime":1726994140000,"contributors":[{"name":"gitDebuger","email":"hygchn04@gmail.com","commits":1}]},"filePathRelative":"blogs/Java/Java基本程序设计结构.md"}');export{i as comp,d as data};