01 - Java 基础

本章节主要涵盖 Java 语言的基础知识,包括 JDK/JRE 区别、基础语法、字符串操作、面向对象特性(抽象类、接口)、以及 IO 流的基础概念。这些是 Java 开发的基石,也是面试中必问的环节。
<h3>1. JDK 和 JRE 有什么区别?</h3>
<p><strong>JDK (Java Development Kit)</strong> 是 Java 开发工具包,它包含了 JRE,同时还包含了编译 java 源码的编译器 javac,以及其他一些工具(如 javadoc, jdb 等)。它是给开发人员用的。</p>
<p><strong>JRE (Java Runtime Environment)</strong> 是 Java 运行环境,它包含了 JVM (Java Virtual Machine) 和 Java 核心类库。它是给运行 Java 程序的用户用的。</p>
<p><strong>总结</strong>:如果你需要运行 java 程序,只需安装 JRE 才可以,如果你需要编写 java 程序,需要安装 JDK。</p>
<h3>2. == 和 equals 的区别是什么?</h3>
<ul>
<li><strong>==</strong>:对于基本类型,比较的是值是否相等;对于引用类型,比较的是两个对象的内存地址是否相等(即是否是同一个对象)。</li>
<li><strong>equals()</strong>:是 Object 类的方法。默认情况下(Object类中)equals() 和 == 是一样的,比较内存地址。但是很多类(如 String, Integer 等)重写了 equals() 方法,用来比较对象的内容是否相等。</li>
</ul>
<h3>3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?</h3>
<p><strong>不对</strong>。</p>
<ul>
<li>hashCode() 相同,equals() 不一定为 true(哈希冲突)。</li>
<li>equals() 为 true,hashCode() 一定相同(这是 Java 规范的要求)。</li>
</ul>
<h3>4. final 在 java 中有什么作用?</h3>
<ul>
<li><strong>修饰变量</strong>:如果是基本数据类型,数值一旦初始化后不可更改;如果是引用类型的变量,初始化后不能再指向另一个对象,但对象对应的内容是可变的。</li>
<li><strong>修饰方法</strong>:不能被子类重写。</li>
<li><strong>修饰类</strong>:不能被继承(如 String 类)。</li>
</ul>
<h3>5. java 中的 Math.round(-1.5) 等于多少?</h3>
<p>等于 <strong>-1</strong>。</p>
<p>Math.round(x) 的原理是 <code>(long)Math.floor(x + 0.5)</code>。</p>
<p>-1.5 + 0.5 = -1.0,floor(-1.0) = -1.0,转为 long 就是 -1。</p>
<h3>6. String 属于基础的数据类型吗?</h3>
<p><strong>不属于</strong>。</p>
<p>Java 的 8 种基础数据类型是:byte, short, int, long, float, double, char, boolean。</p>
<p>String 是一个对象,是引用类型。</p>
<h3>7. java 中操作字符串都有哪些类?它们之间有什么区别?</h3>
<p>主要有 <strong>String</strong>, <strong>StringBuffer</strong>, <strong>StringBuilder</strong>。</p>
<ul>
<li><strong>String</strong>:不可变字符序列,每次操作都会生成新的 String 对象,效率低,适合少量字符串操作。</li>
<li><strong>StringBuffer</strong>:可变字符序列,<strong>线程安全</strong>(方法有 synchronized 修饰),效率较低。</li>
<li><strong>StringBuilder</strong>:可变字符序列,<strong>线程不安全</strong>,效率最高,适合单线程大量字符串操作。</li>
</ul>
<h3>8. String str="i"与 String str=new String(“i”)一样吗?</h3>
<p><strong>不一样</strong>。</p>
<ul>
<li><code>String str="i"</code>:Java 虚拟机会将其分配到常量池中,如果常量池中有 "i",则直接指向它;如果没有,则创建并放入常量池。</li>
<li><code>String str=new String("i")</code>:会被分配到堆内存中,创建一个新的对象。</li>
</ul>
<h3>9. 如何将字符串反转?</h3>
<p>可以使用 <strong>StringBuilder</strong> 或 <strong>StringBuffer</strong> 的 <code>reverse()</code> 方法。</p>
<pre>
<code>StringBuilder sb = new StringBuilder("abc");
System.out.println(sb.reverse().toString()); // cba</code></pre>
<h3>10. String 类的常用方法都有那些?</h3>
<ul>
<li><code>length()</code>: 字符串长度</li>
<li><code>charAt(int index)</code>: 返回指定索引处的字符</li>
<li><code>substring(int beginIndex, int endIndex)</code>: 截取字符串</li>
<li><code>equals(Object anObject)</code>: 比较字符串内容</li>
<li><code>indexOf(String str)</code>: 返回指定子字符串第一次出现的索引</li>
<li><code>trim()</code>: 去除前后空格</li>
<li><code>toUpperCase()</code> / <code>toLowerCase()</code>: 大小写转换</li>
<li><code>split(String regex)</code>: 分割字符串</li>
<li><code>replace(CharSequence target, CharSequence replacement)</code>: 替换字符串</li>
</ul>
<h3>11. 抽象类必须要有抽象方法吗?</h3>
<p><strong>不需要</strong>。</p>
<p>抽象类可以没有抽象方法,但是如果一个类包含了抽象方法,那么这个类必须声明为抽象类。</p>
<h3>12. 普通类和抽象类有哪些区别?</h3>
<ul>
<li>抽象类不能被实例化,普通类可以。</li>
<li>抽象类可以包含抽象方法,普通类不能。</li>
<li>抽象类主要用于被继承,作为子类的模板。</li>
</ul>
<h3>13. 抽象类能使用 final 修饰吗?</h3>
<p><strong>不能</strong>。</p>
<p>定义抽象类就是为了让其他类继承的,而 final 修饰的类不能被继承,二者矛盾。</p>
<h3>14. 接口和抽象类有什么区别?</h3>
<ul>
<li><strong>实现</strong>:抽象类是 <code>extends</code>,接口是 <code>implements</code>。</li>
<li><strong>构造函数</strong>:抽象类可以有构造函数,接口不能有。</li>
<li><strong>成员变量</strong>:接口中的成员变量默认是 <code>public static final</code>,抽象类可以是各种类型。</li>
<li><strong>方法</strong>:Java 8 之前接口只有抽象方法,Java 8 开始接口可以有默认方法(default)和静态方法。抽象类可以有普通方法和抽象方法。</li>
<li><strong>继承</strong>:一个类只能继承一个抽象类,但可以实现多个接口。</li>
</ul>
<h3>15. java 中 IO 流分为几种?</h3>
<ul>
<li>按<strong>流向</strong>分:输入流(Input)、输出流(Output)。</li>
<li>按<strong>操作单元</strong>分:字节流(Byte)、字符流(Character)。</li>
<li>字节流基类:InputStream, OutputStream</li>
<li>字符流基类:Reader, Writer</li>
<li>按<strong>角色</strong>分:节点流、处理流。</li>
</ul>
<h3>16. BIO、NIO、AIO 有什么区别?</h3>
<ul>
<li><strong>BIO (Blocking I/O)</strong>:同步阻塞 I/O。服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理。适用于连接数目比较小且固定的架构。</li>
<li><strong>NIO (Non-blocking I/O)</strong>:同步非阻塞 I/O。服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器(Selector)上,多路复用器轮询到连接有 I/O 请求时才启动一个线程进行处理。适用于连接数目多且连接比较短(轻操作)的架构。</li>
<li><strong>AIO (Asynchronous I/O)</strong>:异步非阻塞 I/O。服务器实现模式为一个有效请求一个线程,客户端的 I/O 请求都是由 OS 先完成了再通知服务器应用去启动线程进行处理。适用于连接数目多且连接比较长(重操作)的架构。</li>
</ul>
<h3>17. Files的常用方法都有哪些?</h3>
<p><code>java.nio.file.Files</code> 是 Java 7 引入的操作文件的工具类。</p>
<ul>
<li><code>Files.exists(Path path)</code>: 检测文件路径是否存在</li>
<li><code>Files.createFile(Path path)</code>: 创建文件</li>
<li><code>Files.createDirectory(Path path)</code>: 创建文件夹</li>
<li><code>Files.delete(Path path)</code>: 删除文件</li>
<li><code>Files.copy(Path source, Path target)</code>: 复制文件</li>
<li><code>Files.move(Path source, Path target)</code>: 移动文件</li>
<li><code>Files.size(Path path)</code>: 查看文件个数</li>
<li><code>Files.readAllLines(Path path)</code>: 读取文件所有行</li>
<li><code>Files.write(Path path, byte[] bytes)</code>: 写文件</li>
</ul>
评论 (0)
加载评论中…