java语言有啥特点?
-
1.面向对象,java语言是面向对象的(封装,继承,多态)
-
2.具有丰富的生态和类库。
-
3.具有跨平台特点,一次编译,随处运行。
-
4.简单易学。
-
5.支持网络编程。
-
6.本身提供多线程处理的解决办法。
-
7.编译和解释并存。
JavaSE是啥?JavaEE是啥?
-
JavaSE-Java平台的平台标准版,用于构建桌面应用程序或简单的服务器应用程序。
-
JavaEE-Java平台的企业标准版,用于构建分布式,健壮的服务端Java应用程序。
JVM是啥?JDK是啥?JRE是啥?
-
JDK = JRE + 开发工具(JDK是Java完整的工具包)
-
JRE = JVM + 核心类库(JRE是可以直接运行.class文件的运行环境,JVM就是虚拟机)
AOT有啥优点?为啥不全用AOT呢?
AOT模式与JIT模式比较
-
AOT就是静态编译,优点是启动时间少,内存占用少,打包体积小。
-
JIT是即时编译,优点是有高的处理延迟能力,可以降低请求的最大延迟。
-
AOT不支持Java的反射,动态代理,动态加载,而很多框架都是用这个特性,AOT更适合当下的云原生场景,对微服务架构的支持更友好。
啥是字节码?采用字节码的好处是啥?
- 字节码就是JVM可以直接识别的代码(即扩展名为.class文件的文件),由于可直接在JVM上运行,所以可以无需编译直接在不同平台上运行(即跨平台性)。
为啥说Java语言 “编译与解释共存”?
-
编译是因为Java先经过编译阶段,即将Java代码编译成.class文件。
-
解释是因为Java运行时是Java解释器一行一行解释并执行代码的。
-
所以编译与解释共存。
OracleJDK 和 OpenJDK 有啥区别?
- 简单来说就是前期这两个没有啥大的区别,后面OracleJDK为了恰钱产生这两个,前者是要付钱的,后者是开源版本。
Java与C++的区别
-
Java内存更安全,Java不支持单指针直接操作内存。
-
Java是编译与解释共存,而C++是编译性语言。
-
Java支持单继承,C++支持多继承。
-
C ++同时支持方法重载和操作符重载,但是 Java 只支持方法重载。
-
Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
Java注释有几种
三种
-
单行注释 -用于注释单行代码的作用
-
多行注释 -用于注释多行代码的作用
-
文档注释 -用于生成 Java 开发文档
标识符 和 关键字 的区别是啥?
标识符就是一个名字
关键字是被赋予特殊含义的标识符
自增,自减符号
-
++a,- -a (前缀形式,计算时先减1或加1,再用a的变量)
-
a++, a- - (后缀形式,计算时用a的值,再将a的值减1或加1)
移位运算符
三种运算符
<<
:左移运算符,向左移若干位,高位丢弃,低位补零。x << n
,相当于 x 乘以 2 的 n 次方(不溢出的情况下)。>>
:带符号右移,向右移若干位,高位补符号位,低位丢弃。正数高位补 0,负数高位补 1。x >> n
,相当于 x 除以 2 的 n 次方。>>>
:无符号右移,忽略符号位,空位都以 0 补齐。
Java的几种基本数据类型
四种八类
-
布尔型 boolean占一个字节 false或者true
-
字符型 char占两个字节
-
数值型 byte占一个字节 short占两个字节 int 占4个字节 long(后面加L)占8个字节
-
浮点型 float(后面加f或者F)占4个字节 double占8个字节
基本类型和包装类型的区别
- 存储方式 基本数据类型的局部变量存放在 Java 虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被 static 修饰 )存放在 Java 虚拟机的堆中。 包装类型属于对象类型,我们知道几乎所有对象实例都存在于堆中。
- 用途 除了定义一些常量和局部变量之外,我们在其他地方比如方法参数、对象属性中很少会使用基本类型来定义变量。并且,包装类型可用于泛型,而基本类型不可以。
- 占用空间 相比于包装类型(对象类型), 基本数据类型占用的空间往往非常小。
- 包装类型的默认值为null, 基本类型的默认值不是null
- == 可以比较基本类型的值,而包装类型的值得用equals比较
包装类型的缓存机制了解吗?
Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。
- Integer,Byte,Long,Short默认创建了数值[-128, 127]的相应类型的缓存数据
- Character创建了[0,127]范围的缓存数据,
- Boolean直接返回True or False
自动装箱与拆箱了解吗? 原理是啥?
-
装箱就是将基本数据类型转变为包装类型
-
拆箱就是将包装类型转变为基本数据类型
如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作
为啥浮点数运算的时候会有精度丢失的风险?
- 二进制表示的限制:十进制系统中的某些小数(如0.1、0.2等)在二进制系统中只能通过无限循环小数来近似表示。
- 舍入误差:由于计算机只能存储有限的位数,因此在进行浮点数运算时,不可避免地会产生舍入误差。
- 浮点数存储结构:浮点数在计算机中的存储遵循IEEE 754标准,该标准将浮点数拆分为符号位、指数位和尾数位
如何解决浮点数运算的精度丢失问题
- BigDecimal 可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过 BigDecimal 来做的。
超过long整形的数据应该如何表示?
可以用BigInteger处理
- BigInteger内部用int[]数组来存储任意大小的整形数据 相对于常规整数类型的运算来说,BigInteger运算的效率会相对较低
成员变量与局部变量的区别
- 语法形式:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。
- 存储方式:从变量在内存中的存储方式来看,如果成员变量是使用 static 修饰的,那么这个成员变量是属于类的,如果没有使用 static 修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。
- 生存时间:从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡。
静态变量有啥用?
静态变量可以节省内存
- 静态变量随着类的加载而创建,所以它可以被类的所有实例共享,所以可以节省内存
字符型常量和字符串常量的区别
形式: 字符常量是单引号引起的一个字符,字符串常量是双引号引起的0个或若干个字符 含义: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算;字符串常量代表一个地址值(该字符串在内存中存放位置)。 占内存大小: 字符常量只占2个字节;字符串常量占若干个字节。
啥是方法的返回值?方法有哪几种类型?
- 返回值就是方法体返回的数值。
- 方法有4种
- 无参数,无返回的
- 有参数,无返回的
- 无参数,有返回的
- 有参数,有返回的
静态方法为啥不能调用非静态方法?
静态方法随着类的加载而加载,而非静态方法只有类被实例化时才能加载,所以可以得到静态方法存在时而非静态方法不存在的情况,由此得到静态方法不能调用非静态方法。
静态方法和实例方法有啥不同?
- 调用方式不同, 调用静态方法可以无需创建对象,用类名.方法名的方式来调用静态方法。
- 访问类成员是否存在限制, 静态方法在访问本类的成员时,仅仅让访问静态成员,而实例方法不存在这个限制。
重载和重写有啥区别?
重载就是在同样的一个方法能够根据输入数据的不同,做出不同的处理。 重写就是子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应,你就要覆盖父类的方法
区别点 | 重载方法 | 重写方法 |
---|---|---|
发生范围 | 本类中 | 子类中 |
参数列表 | 必须修改 | 不能修改 |
返回类型 | 可修改 | 子类的返回类型与父类返回的类型相同或者时父类返回类型的子类 |
异常 | 可修改 | 子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等; |
访问修饰符 | 可修改 | 一定不能做更严格的限制(可以降低限制) |
发生阶段 | 编译期 | 运行期 |
啥是可变长参数?
从 Java5 开始,Java 支持定义可变长参数,所谓可变长参数就是允许在调用方法时传入不定长度的参数。