Cyan Blog Cyan Blog
首页
  • Java (opens new window)
  • JUC (opens new window)
  • JVM (opens new window)
  • Redis

    • Redis安装 (opens new window)
    • Redis基础 (opens new window)
    • Redis实战 (opens new window)
    • Redis集群安装 (opens new window)
    • Redis分布式缓存 (opens new window)
    • Redis多级缓存 (opens new window)
    • Redis原理 (opens new window)
  • 管理工具

    • Maven (opens new window)
    • Git (opens new window)
  • SSM

    • Spring (opens new window)
    • SpringBoot (opens new window)
    • Mybatis (opens new window)
    • MybatisPlus (opens new window)
  • 微服务

    • Docker (opens new window)
    • RabbitMQ (opens new window)
    • SpringCloud (opens new window)
    • Dubbo (opens new window)
    • MongoDB (opens new window)
    • Zookeeper (opens new window)
  • Java面试题 (opens new window)
  • JUC面试题 (opens new window)
  • JVM面试题 (opens new window)
  • Linux面试题 (opens new window)
  • SQL面试题 (opens new window)
  • Maven面试题 (opens new window)
  • Redis面试题 (opens new window)
  • SSM面试题 (opens new window)
  • SpringCloud面试题 (opens new window)
  • Linux (opens new window)
  • C++ (opens new window)
  • 数据库

    • MySQL (opens new window)
    • NoSQL (opens new window)
  • 软件测试

    • 软件测试 (opens new window)
  • 加密解密 (opens new window)
  • bilibili字幕提取 (opens new window)
  • 道理 (opens new window)
  • 关于博主

    • Github (opens new window)
    • CSDN (opens new window)
  • 关于本站

    • 如何搭建博客网站 (opens new window)
首页
  • Java (opens new window)
  • JUC (opens new window)
  • JVM (opens new window)
  • Redis

    • Redis安装 (opens new window)
    • Redis基础 (opens new window)
    • Redis实战 (opens new window)
    • Redis集群安装 (opens new window)
    • Redis分布式缓存 (opens new window)
    • Redis多级缓存 (opens new window)
    • Redis原理 (opens new window)
  • 管理工具

    • Maven (opens new window)
    • Git (opens new window)
  • SSM

    • Spring (opens new window)
    • SpringBoot (opens new window)
    • Mybatis (opens new window)
    • MybatisPlus (opens new window)
  • 微服务

    • Docker (opens new window)
    • RabbitMQ (opens new window)
    • SpringCloud (opens new window)
    • Dubbo (opens new window)
    • MongoDB (opens new window)
    • Zookeeper (opens new window)
  • Java面试题 (opens new window)
  • JUC面试题 (opens new window)
  • JVM面试题 (opens new window)
  • Linux面试题 (opens new window)
  • SQL面试题 (opens new window)
  • Maven面试题 (opens new window)
  • Redis面试题 (opens new window)
  • SSM面试题 (opens new window)
  • SpringCloud面试题 (opens new window)
  • Linux (opens new window)
  • C++ (opens new window)
  • 数据库

    • MySQL (opens new window)
    • NoSQL (opens new window)
  • 软件测试

    • 软件测试 (opens new window)
  • 加密解密 (opens new window)
  • bilibili字幕提取 (opens new window)
  • 道理 (opens new window)
  • 关于博主

    • Github (opens new window)
    • CSDN (opens new window)
  • 关于本站

    • 如何搭建博客网站 (opens new window)
  • 简历项目
  • Java面试题

    • Java面试题
      • Java反射的优、缺点
    • JUC面试题

    • JVM面试题

    • Java集合面试题
  • 后端开发
  • 数据库面试题
  • Maven
  • MyBatis面试题
  • Spring面试题
  • SpringBoot面试题
  • SpringCloud面试题

  • Redis面试题

  • 设计模式
  • 中间件

  • 场景题
  • Other

  • Random

  • 项目面试题

  • 面试
  • Java面试题
2025-03-12
0
0
目录

Java面试题

# JDK、JRE、JVM之间的区别

  • JDK(Java SE Development Kit)是 java 开发工具包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java运行时环境JRE、Java编译器,以及常用的Java类库等

  • JRE(Java Runtime Environment) ,Java运行环境,用于运行Java的字节码文件,JRE中包括了 JVM以及JVM工作所需要的类库,只需要安装JRE来运行Java程序,而程序开发者必须安装JDK来编译、调试程序。

  • JVM(Java Virtual Mechinal),Java虚拟机,是一个运行在计算机上的程序,负责运行字节码文件,它是整个java实现跨平台的最核心的部分。

  • 如果我们要开发Java程序,那就需要JDK来编译Java源文件。 如果我们只想运行已经编译好的Java字节码文件,也就是.class文件,那么就只需要JRE。 JDK中包含了JRE,JRE中包含了JVM。 另外,JVM在执行Java字节码时,需要把字节码解释为机器指令,而不同操作系统的机器指令是有可能 不一样的,所以就导致不同操作系统上的JVM是不一样的,所以我们在安装JDK时需要选择操作系统。 另外,JVM是用来执行Java字节码的,所以编译之后是Java字节码,那就都能在JVM上运行,比如Apache Groovy, Scala and Kotlin 等等。

# 为何JDK9要将String底层实现由char[]改成byte[]?

JDK 9并没有将String的底层实现由char [] 改成byte[],而是在 JDK 9中,引入了Compact Strings的优化,优化的目的是减少String对象的内存消耗。

jdk9中字符串由char[]数组来存储该字符串的所有字符,且内部采用utf-16编码,每个字符占用两个字符,但是如果字符串只包含英文字符或者ASCII字符,这些只需要一个字符就可以存储,这意味着字符串实际存储的空间比需要的空间多一倍 。引入了Compact String优化,String的底层实现由char[]中改为byte[],只在存储非ASCII字符时使用char[],对于纯ASCII字符就会存储再byte[]中,从而节省一半的内存空间。这个优化是在编译器和运行时实现,对开发者透明,只需通过虚拟机参数-XX:+UseCompressedstrings控制是否优化。

# Java反射的优、缺点

优点

  • 增加程序的灵活性,可以在运行的过程中动态对类进行修改和操作

  • 提高代码的复用率,比如动态代理,就是用到了反射来实现

  • 可以在运行时轻松获取任意一个类的方法、属性,并且还能通过反射进行动态调用

缺点

  • 反射会涉及到动态类型的解析,所以VM无法对这些代码进行优化,导致性能要比非反射调用更低
  • 使用反射以后,代码的可读性会下降
  • 反射可以绕过一些限制访问的属性或者方法,可能会导致破坏了代码本身的抽象性
#面试#Java
上次更新: 2025/4/13 14:39:08
简历项目
JUC基础知识

← 简历项目 JUC基础知识→

最近更新
01
项目优化
05-06
02
项目优化
05-06
03
延迟消息
05-05
更多文章>
Theme by Vdoing | Copyright © 2025-2025 Cyan Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式