做网站维护的人叫啥,做网站需要字体授权,无锡网站怎么优化排名,wordpress拼团小程序Java基础常见面试题总结(上)
Java有哪些特性
简单易学#xff1b;面向对象#xff08;封装#xff0c;继承#xff0c;多态#xff09;#xff1b;平台无关性#xff08; Java 虚拟机实现平台无关性#xff09;#xff1b;支持多线程#xff08; C 语言没有内置的多…Java基础常见面试题总结(上)
Java有哪些特性
简单易学面向对象封装继承多态平台无关性 Java 虚拟机实现平台无关性支持多线程 C 语言没有内置的多线程机制因此必须调用操作系统的多线程功能来进行多线程程序设计而 Java 语言却提供了多线程支持可靠性具备异常处理和自动内存管理机制安全性Java 语言本身的设计就提供了多重安全防护机制如访问权限修饰符、限制程序直接访问操作系统资源高效性通过 Just In Time 编译器等技术的优化Java 语言的运行效率还是非常不错的支持网络编程并且很方便编译与解释并存
Java EE 和Java Se
Java SE 是 Java 的基础版本Java EE 是 Java 的高级版本。Java SE 更适合开发桌面应用程序或简单的服务器应用程序Java EE 更适合开发复杂的企业级应用程序或 Web 应用程序。
JVM vs JDK vs JRE Java 虚拟机JVM是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现WindowsLinuxmacOS目的是使用相同的字节码它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译随处可以运行”的关键所在 JDKJava Development Kit它是功能齐全的 Java SDK是提供给开发者使用能够创建和编译 Java 程序的开发套件。它包含了 JRE同时还包含了编译 java 源码的编译器 javac 以及一些其他工具比如 javadoc文档注释工具、jdb调试器、jconsole基于 JMX 的可视化监控⼯具、javap反编译工具等等。 JREJava Runtime Environment 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合主要包括 Java 虚拟机JVM、Java 基础类库Class Library。 也就是说JRE 是 Java 运行时环境仅包含 Java 应用程序的运行时环境和必要的类库。而 JDK 则包含了 JRE同时还包括了 javac、javadoc、jdb、jconsole、javap 等工具可以用于 Java 应用程序的开发和调试。如果需要进行 Java 编程工作比如编写和编译 Java 程序、使用 Java API 文档等就需要安装 JDK。而对于某些需要使用 Java 特性的应用程序如 JSP 转换为 Java Servlet、使用反射等也需要 JDK 来编译和运行 Java 代码。因此即使不打算进行 Java 应用程序的开发工作也有可能需要安装 JDK。 什么是字节码?采用字节码的好处是什么?
在 Java 中JVM 可以理解的代码就叫做字节码即扩展名为 .class 的文件它不面向任何特定的处理器只面向虚拟机。Java 语言通过字节码的方式在一定程度上解决了传统解释型语言执行效率低的问题同时又保留了解释型语言可移植的特点。所以 Java 程序运行时相对来说还是高效的不过和 C、 CRustGo 等语言还是有一定差距的而且由于字节码并不针对一种特定的机器因此Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。 我们需要格外注意的是 .class-机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件然后通过解释器逐行解释执行这种方式的执行速度会相对比较慢。而且有些方法和代码块是经常需要被调用的(也就是所谓的热点代码)所以后面引进了 JITJust in Time Compilation 编译器而 JIT 属于运行时编译。当 JIT 编译器完成第一次编译后其会将字节码对应的机器码保存下来下次可以直接使用。而我们知道机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言 。
为什么说 Java 语言“编译与解释并存”
编译型编译型语言open in new window 会通过编译器open in new window将源代码一次性翻译成可被该平台执行的机器码。一般情况下编译语言的执行速度比较快开发效率比较低。常见的编译性语言有 C、C、Go、Rust 等等。解释型解释型语言open in new window会通过解释器open in new window一句一句的将代码解释interpret为机器代码后再执行。解释型语言开发效率比较快执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。
这是因为 Java 语言既具有编译型语言的特征也具有解释型语言的特征。因为 Java 程序要经过先编译后解释两个步骤由 Java 编写的程序需要先经过编译步骤生成字节码.class 文件这种字节码必须由 Java 解释器来解释执行
AOT 有什么优点为什么不全部使用 AOT 呢 JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation) 。和 JIT 不同的是这种编译模式会在程序被执行前就将其编译成机器码属于静态编译C、 CRustGo 等语言就是静态编译。AOT 避免了 JIT 预热等各方面的开销可以提高 Java 程序的启动速度避免预热时间长。并且AOT 还能减少内存占用和增强 Java 程序的安全性AOT 编译后的代码不容易被反编译和修改特别适合云原生场景。 AOT 的主要优势在于启动时间、内存占用和打包体积。JIT 的主要优势在于具备更高的极限处理能力可以降低请求的最大延迟。
Java 和 C 的区别?
Java 不提供指针来直接访问内存程序内存更加安全Java 的类是单继承的C 支持多重继承虽然 Java 的类不可以多继承但是接口可以多继承。Java 有自动内存管理垃圾回收机制(GC)不需要程序员手动释放无用内存。C 同时支持方法重载和操作符重载但是 Java 只支持方法重载操作符重载增加了复杂性这与 Java 最初的设计思想不符
Java基本数据类型 基本类型和包装类型的区别
用途除了定义一些常量和局部变量之外我们在其他地方比如方法参数、对象属性中很少会使用基本类型来定义变量。并且包装类型可用于泛型而基本类型不可以。存储方式基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中基本数据类型的成员变量未被 static 修饰 存放在 Java 虚拟机的堆中。包装类型属于对象类型我们知道几乎所有对象实例都存在于堆中。占用空间相比于包装类型对象类型 基本数据类型占用的空间往往非常小。默认值成员变量包装类型不赋值就是 null 而基本类型有默认值且不是 null。比较方式对于基本数据类型来说 比较的是值。对于包装数据类型来说 比较的是对象的内存地址。所有整型包装类对象之间值的比较全部使用 equals() 方法。
包装类型的缓存机制了解么
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128127] 的相应类型的缓存数据Character 创建了数值在 [0,127] 范围的缓存数据Boolean 直接返回 True or False。
自动装箱与拆箱了解吗原理是什么
装箱将基本类型用它们对应的引用类型包装起来拆箱将包装类型转换为基本数据类型
Integer i 10; //装箱
int n i; //拆箱
为什么浮点数运算的时候会有精度丢失的风险
这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的而且计算机在表示一个数字时宽度是有限的无限循环的小数存储在计算机时只能被截断所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示
如何解决浮点数运算的精度丢失问题
BigDecimal 可以实现对浮点数的运算不会造成精度丢失。通常情况下大部分需要浮点数精确运算结果的业务场景比如涉及到钱的场景都是通过 BigDecimal 来做的。
BigDecimal a new BigDecimal(1.0);
BigDecimal b new BigDecimal(0.9);
BigDecimal c new BigDecimal(0.8);BigDecimal x a.subtract(b);
BigDecimal y b.subtract(c);System.out.println(x); /* 0.1 */
System.out.println(y); /* 0.1 */
System.out.println(Objects.equals(x, y)); /* true */超过 long 整型的数据应该如何表示
基本数值类型都有一个表达范围如果超过这个范围就会有数值溢出的风险。
变量
成员变量与局部变量的区别
语法形式从语法形式上看成员变量是属于类的而局部变量是在代码块或方法中定义的变量或是方法的参数成员变量可以被 public,private,static 等修饰符所修饰而局部变量不能被访问控制修饰符及 static 所修饰但是成员变量和局部变量都能被 final 所修饰。存储方式从变量在内存中的存储方式来看如果成员变量是使用 static 修饰的那么这个成员变量是属于类的如果没有使用 static 修饰这个成员变量是属于实例的。而对象存在于堆内存局部变量则存在于栈内存。生存时间从变量在内存中的生存时间上看成员变量是对象的一部分它随着对象的创建而存在而局部变量随着方法的调用而自动生成随着方法的调用结束而消亡。默认值从变量是否有默认值来看成员变量如果没有被赋初始值则会自动以类型的默认值而赋值一种情况例外:被 final 修饰的成员变量也必须显式地赋值而局部变量则不会自动赋值。
静态变量有什么作用
静态变量也就是被 static 关键字修饰的变量。它可以被类的所有实例共享无论一个类创建了多少个对象它们都共享同一份静态变量。也就是说静态变量只会被分配一次内存即使创建多个对象这样可以节省内存。
字符型常量和字符串常量的区别?
形式 : 字符常量是单引号引起的一个字符字符串常量是双引号引起的 0 个或若干个字符。 含义 : 字符常量相当于一个整型值( ASCII 值),可以参加表达式运算; 字符串常量代表一个地址值(该字符串在内存中存放位置)。占内存大小字符常量只占 2 个字节; 字符串常量占若干个字节。
什么是方法的返回值?方法有哪几种类型
方法的返回值 是指我们获取到的某个方法体中的代码执行后产生的结果前提是该方法可能产生结果。返回值的作用是接收出结果使得它可以用于其他的操作
静态方法为什么不能调用非静态成员?
静态方法是属于类的在类加载的时候就会分配内存可以通过类名直接访问。而非静态成员属于实例对象只有在对象实例化之后才存在需要通过类的实例对象去访问。在类的非静态成员不存在的时候静态方法就已经存在了此时调用在内存中还不存在的非静态成员属于非法操作。类名.方法名 的方式来调用静态方法
重载和重写有什么区别
重载就是同样的一个方法能够根据输入数据的不同做出不同的处理重写就是当子类继承自父类的相同方法输入数据一样但要做出有别于父类的响应时你就要覆盖父类方法重载就是同一个类中多个同名方法根据不同的传参来执行不同的逻辑处理重写就是子类对父类方法的重新改造外部样子不能改变内部逻辑可以改变