当前位置:首页 > 技术 > 正文内容

Java核心知识点解析与常见问题总结

访客 技术 2026年7月1日 1

1. 局部变量必须显式初始化

在Java中,局部变量在参与运算前必须被赋值,否则编译器会报错。例如以下代码无法通过编译:

public static void main(String[] args) {
    int x = 1;
    int y; // 未初始化
    int z = x + y; // 编译错误:可能尚未初始化变量 y
}

这是因为局部变量不会自动赋予默认值,开发者需手动初始化。

2. ArrayList 与 Vector 的主要区别

两者均基于动态数组实现,但关键差异在于线程安全性:

  • Vector 是线程安全的,其方法内部使用 synchronized 关键字同步,适合多线程环境,但性能较低。
  • ArrayList 非线程安全,操作更高效,在单线程场景下推荐使用。

因此正确选项是:A — Vector 支持线程同步。

3. 类初始化顺序分析

执行如下继承结构的类时:

class A {
    static { System.out.println("class A static"); }
    { System.out.println("I'm A class"); }
    public A() { System.out.println("class A"); }
}

public class B extends A {
    static { System.out.println("class B static"); }
    { System.out.println("I'm B class"); }
    public B() { System.out.println("class B"); }

    public static void main(String[] args) {
        new B();
    }
}

输出结果为:

class A static
class B static
I'm A class
class A
I'm B class
class B

初始化顺序规则如下:

  1. 父类静态代码块
  2. 子类静态代码块
  3. 父类实例代码块
  4. 父类构造函数
  5. 子类实例代码块
  6. 子类构造函数

4. 加载 JDBC 驱动的正确方式

JDBC驱动可通过以下方式加载:

  • Class.forName("driver.class.name"):触发驱动类加载并注册到 DriverManager
  • DriverManager.registerDriver():直接注册驱动实例
  • 设置系统属性 jdbc.drivers

DriverManager.getConnection() 是在驱动已加载后用于建立连接的方法,并不负责加载驱动本身。故不是驱动加载方式的是:A

5. Servlet 与 CGI 的对比

  • Servlet 运行于服务器进程内,采用多线程处理请求,每个请求由独立线程执行 service 方法,资源利用率高。
  • CGI 每次请求都会创建新进程,处理完即销毁,开销大、效率低。

虽然 CGI 具有较好的跨平台性,但由于现代 Web 容器普遍支持 Servlet,且其性能和功能优势明显,因此说"CGI 移植性高于 Servlet"并不准确。错误说法为:D

6. 实现 Collection 接口的类

Collection 接口的主要子接口包括 List 和 Set,常见实现类有:

  • ArrayList:实现了 List 接口,属于 Collection 体系
  • Vector:同样是 List 的实现类

而 HashMap 实现的是 Map 接口,与 Collection 无直接继承关系;Iterator 是迭代器接口,不属于集合类。正确答案为:B、C

7. 接口与抽象类特性(JDK 8 前)

  • 接口没有构造方法(不能实例化),B 正确
  • 抽象类可以有构造函数,用于子类调用,A 错误
  • Java 不支持多继承,抽象类也不能多重继承,C 正确

  • JDK 8 前接口中的方法均为抽象,不能有方法体,D 错误

正确选项为:B、C

8. Object 类中不存在的方法

Object 类定义了所有对象共有的基本方法,如:

  • clone():复制对象
  • finalize():垃圾回收前调用(已废弃)
  • toString():返回字符串表示

hasNext() 是 Iterator 接口的方法,用于判断是否还有下一个元素,不属于 Object 类。正确答案:D

9. 包访问权限控制

若要使一个类仅能被同一包内的其他类访问,应使用默认(包级)访问修饰符,即不加任何关键字:

  • 无修饰符:包内可见
  • private:仅本类可见
  • protected:包内 + 子类可见
  • void:非法修饰符(是返回类型)

正确做法是:A — 不使用任何关键字。

10. Java 线程锁定机制

  • Java 中每个对象都有一把内置锁(monitor lock)
  • synchronized 可用来获取对象的互斥锁,保证线程安全
  • 线程调度策略依赖 JVM 和操作系统,不同平台行为可能不同,故具有平台相关性

正确选项为:C、D

11. 自增自减运算符的计算

分析如下代码:

int a = 10;
System.out.println(a++ + a--);

运算过程分解:

  • 先计算 a++:表达式取当前值 10,之后 a 变为 11
  • 再计算 a--:此时 a 为 11,表达式取值 11,之后 a 减为 10
  • 总和为 10 + 11 = 21

最终输出:21,正确答案为 C

12. HttpServletResponse 不具备的功能

HttpServletResponse 主要职责包括:

  • 设置响应头(setHeader)
  • 添加 Cookie
  • 获取输出流(getOutputStream / getWriter)发送数据

而路径信息(如请求 URI、上下文路径等)来源于客户端请求,应由 HttpServletRequest 获取。读取路径信息不属于 HttpServletResponse 功能。正确答案:C

13. 多线程实现方式

Java 中创建线程的两种标准方式:

  • 继承 Thread 类,重写 run() 方法
  • 实现 Runnable 接口,将其实例传入 Thread 构造函数

不存在"实现 Thread 接口"的说法(Thread 是类)。正确答案:A、B

14. String 引用与不可变性

看下面代码:

String lx = "LeXin";
String nb = lx;
lx = "Fenqile";
System.out.println(nb);

尽管 lx 被重新赋值为 "Fenqile",但 nb 仍指向原字符串 "LeXin"。因为 String 是不可变对象,变量只是引用。修改引用不影响其他指向同一对象的变量。

程序正常运行,输出为 "LeXin"。正确选项:B、C

15. CMS 垃圾收集器的暂停阶段

CMS(Concurrent Mark-Sweep)以最小停顿时间为目标,分为四阶段:

  • 初始标记:短暂暂停,标记 GC Roots 直接可达对象
  • 并发标记:与用户线程并发运行
  • 重新标记:再次暂停,修正并发期间的变化
  • 并发清理:与用户线程并发进行

其中只有初始标记重新标记需要暂停用户线程。答案为:A、C

16. 接口中方法的实现要求

接口中方法默认为 public abstract,实现类重写时访问级别不能低于原方法。因此:

  • void drink()protected drink() 访问级别低于 public,非法
  • 必须使用 public void drink()

正确选项:C

17. request 参数编码来源

getParameter() 获取的参数编码受多种因素影响:

  • HTML 页面中指定的字符集(如 meta 标签)
  • 浏览器提交请求时采用的编码
  • Web 容器(如 Tomcat)的解码配置(如 URIEncoding)
  • GET 与 POST 请求处理方式不同(POST 可设置 request.setCharacterEncoding)

因此编码由客户端和服务器共同决定。正确答案:C

18. 获取 Request 作用域对象的方法

Request 作用域用于在请求转发过程中共享数据:

  • request.setAttribute(String, Object):存入对象
  • request.getAttribute(String):取出对象

getParameter() 用于获取客户端传递的表单或URL参数,与作用域无关。返回 request 范围内对象的方法是:request.getAttribute(),答案为 B

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。