Java
一 、基础
1. 介绍下Java中的基本数据类型
基本类型 | 大小(字节) | 默认值 | 封装类 |
byte | 1 | (byte)0 | Byte |
short | 2 | (short)0 | Short |
int | 4 | 0 | Integer |
long | 8 | 0l | Long |
float | 4 | 0.0f | Float |
double | 8 | 0.0d | Double |
boolean | - | false | Boolean |
char | 2 | \u0000(null) | Character |
boolean: int 4个字
需要注意:
- 1 int是基本数据类型,Integer是int的封装类,是引用类型。int默认值是0,而Integer默认值是null,所以Integer能区分出0和null的情况。一旦java看到null,就知道这个引用还没有指向某个对象,再任何引用使用前,必须为其指定一个对象,否则会报错。
- 2 基本数据类型在声明时系统会自动给它分配空间,而引用类型声明时只是分配了引用空间,必须通过实例化开辟数据空间之后才可以赋值。数组对象也是一个引用对象,将一个数组赋值给另一个数组时只是复制了一个引用,所以通过某一个数组所做的修改在另一个数组中也看的见。
2.自增自减运算符
自增运算符:
无论这个变量是否参与到运算中去,只要用++运算符,这个变量本身就加1操作
只是说如果变量参与到运算中去的话,对运算结果是产生影响:
看++在前还是在后,如果++在后:先运算,后加1;如果++在前,先加1,后运算
自减运算符:
无论这个变量是否参与到运算中去,只要用--运算符,这个变量本身就减1操作
只是说如果变量参与到运算中去的话,对运算结果是产生影响:
看--在前还是在后,如果--在后:先运算,后减1; 如果--在前,先减1,后运算
3. Java有哪几种注释?
Java中的注释主要有三种形式,这三种注释形式在Java编程中都有其特定的用途和场景,合理使用注释可以提高代码的可读性和可维护性:
3.1 单行注释:
a. 使用双斜杠(//)开头,仅在该行有效。
b. 适用于对少量代码或特定代码行进行简单说明。
c. 示例:// 这是一个单行注释。
3.2 多行注释:
a. 使用/* 开始,以 */结束,可以跨越多行。
b. 适用于对一大段代码或复杂逻辑进行详细解释。
c. 示例:/* 这是一个多行注释,它可以跨越多行 */。
3.3 文档注释:
a. 使用/** 开始,以 */结束,通常出现在类、方法、字段等的声明前面。
b. 用于生成代码文档,如API文档,这种注释可以被工具(如Javadoc)提取并生成相应的文档。
c. 文档注释可以包含特定的标签。
4. Java中的关键字有哪些?
Java关键字一共有53个,其中包括48个关键字、2个保留字和3个特殊直接量。具体来说:
- 48个关键字
访问修饰符:public、protected、private
类、接口、抽象类和实现接口、继承类、实例化对象:class、interface、abstract、implements、extends、new
包相关:import、package
数据类型:byte、char、boolean、short、int、float、long、double、void
条件循环:if、else、while、for、switch、case、default、do、break、continue、return、instanceof
修饰方法、类、属性和变量:static、super、final、this、native、strictfp、synchronized、transient、volatile
错误处理:catch、try、finally、throw、throws
其他:enum、assert
- 2个保留字
const、goto(这两个保留字在Java中目前没有实际用途,但可能在未来的Java版本中被用作关键字)
- 3个特殊直接量
null、true、false
5. & 和 && 的区别?
&运算符是:逻辑与;&&运算符是:短路与。
1)&和&&在程序中最终的运算结果是完全一致的,只不过&&存在短路现象。如果是&运算符,那么不管左边的表达式是true还是false,右边表达式是一定会执行的。当&&运算符左边的表达式结果为false的时候,右边的表达式不执行,此时就发生了短路现象,也就是说&&会更加的智能。这就是他们俩的本质区别。
2)当然,&运算符还可以使用在二进制位运算上,例如按位与操作。
6. char 型变量中能不能存储一个中文汉字,为什么?
char 类型可以存储一个中文汉字,因为Java中使用的编码是Unicode编码,一个char 类型占2个字节(16 比特),所以放一个中文是没问题的。
补充:使用Unicode 意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是 Unicode,当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以 Java 中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如 InputStreamReader和OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务。
7. break ,continue ,return 的区别及作用
break 跳出总上一层循环,不再执行循环(结束当前的循环体) 。
continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件) 。
return 程序返回,不再执行下面的代码(结束当前的方法 直接返回) 。
另外在switch...case语句中,break不是必须的,但是会较大影响到运行结果。如果没有break,后面的一旦有case匹配成功,后面的case将无条件的向下执行其它的case
8. switch 是否能作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
早期的 JDK 中,switch(expr)中,expr 可以是 byte、short、char、int。从 1.5 版开始,Java 中引入了枚举类型(enum),
expr 也可以是枚举,从 JDK 1.7 版开始,还可以是字符串(String)。长整型(long)是不可以的。
9. Math.round(11.5)等于多少?Math.round(- 11.5) 又等于多少?
Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后进行取整。
10. short s1 = 1; s1 = s1 + 1; 有错吗?short s1 = 1; s1 += 1 有错吗?
前者不正确,后者正确。
对于 short s1 = 1; s1 = s1 + 1;由于 1 是 int 类型,因此 s1+1 运算结果也是 int 型,需要强制转换类型才能赋值给 short 型。
而 short s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换。
11.数组有没有length()方法?String有没有length()方法?
Java中的数组没有length()方法,但是有length属性。String有length()方法。
12. 用最有效率的方法计算2乘以8?
2 << 3,将2左移3位
案例: 4乘以8最快的方式: 4<<3
- << 左移
3<<2 = 12

面试题: 4乘以8最快的方式: 4<<3
- >> 有符号右移
6>>2 = 1

- >>> 无符号右移
6>>>2 = 1

13. 下面 Integer 类型的数值比较输出的结果为?
public class Test{
public static void main(String[] args) {
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150; System.out.println(f1 == f2);
System.out.println(f3 == f4);
}
}
f1==f2的结果是 true,而f3==f4 的结果是false。为什么呢?先来说说装箱的本质。当我们给一个Integer 对象赋一个 int 值的时候,会调用 Integer 类的静态方法 valueOf,如果看看valueOf的源代码就知道发生了什么。如果整型字面量的值在-128 到 127 之间,那么不会 new 新的 Integer 对象,而是直接引用常量池中的Integer对象,所以上面的面试题中f1==f2的结果是 true,而f3==f4 的结果是false。
14. int 和 Integer 有什么区别?
Java 的JDK从 1.5 开始引入了自动装箱/拆箱机制。它为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是 Integer,其它基本类型对应的包装类如下:原始类型: boolean,char,byte,short,int,long,float,double包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double。
15. 什么是方法的返回值?返回值的作用是什么?
方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能 产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!
16. 如何将数值型字符转换为数字?
调用数值类型相应包装类中的方法 parse***(String)或 valueOf(String) 即可返回相应基本类型或包装类型数值;
17. 如何将数字转换为字符?
将数字与空字符串相加即可获得其所对应的字符串;另外对于基本类型 数字还可调用 String 类中的 valueOf(…)方法返回相应字符串,而对于包装类型数字则可调用其 toString()方法获得相应字符串;
18. 如何取小数点前两位并四舍五入?
可用该数字构造一 java.math.BigDecimal 对象,再利用其 round()方法 进行四舍五入到保留小数点后两位,再将其转换为字符串截取最后两位。
19. 3*0.1 == 0.3 将会返回什么? true 还是 false?
false,因为有些浮点数不能完全精确的表示出来。
20 . Java移位运算符?
java中有三种移位运算符
<< :左移运算符,x << 1,相当于x乘以2(不溢出的情况下),低位补0
>> :带符号右移,x >> 1,相当于x除以2,正数高位补0,负数高位补1
>>> :无符号右移,忽略符号位,空位都以0补齐
二、面向对象
1. 面向过程语言和面向对象语言的区别
面向过程:是分析解决问题的步骤,然后用函数把这些步骤一步一步地实现,然后在使用的时候一一调用则可。性能较高,所以单片机、嵌入式开发等一般采用面向过程开发
面向对象:是把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为。面向对象有封装、继承、多态的特性,所以易维护、易复用、易扩展。可以设计出低耦合的系统。 但是性能上来说,比面向过程要低。
2.java面向对象的理解?面向对象的特征?
整体上是封装、继承、多态、抽象。
首先面向对象是一种思想。在java中万事万物皆对象。类是对相同事物的一种抽象、是不可见的,对象具体的、可见的。由对象到类的过程是抽象的过程,由类到对象的过程是实例化的过程。面向对象的三大特征分别是封装、继承和多态。
封装隐藏了类的内部实现机制,对外界而言它的内部细节是隐藏的,暴露给外界的只是它的访问方法。例如在属性的修饰符上我们往往用的private私有的,这样其它类要想访问就通过get和set方法。因此封装可以程序员按照既定的方式调用方法,不必关心方法的内部实现,便于使用; 便于修改,增强 代码的可维护性。
继承在本质上是特殊~一般的关系,即常说的is-a关系。子类继承父类,表明子类是一种特殊的父类,并且具有父类所不具有的一些属性或方法。比如从猫类、狗类中可以抽象出一个动物类,具有和猫、狗、虎类的共同特性(吃、跑、叫等)。通过extends关键字来实现继承。Java中的继承是单继承,即一个子类只允许有一个父类。
Java多态是指的是首先两个类有继承关系,其次子类重写了父类的方法,最后父类引用指向子类对象。如Animal a=new Dog();这行代码就体现了多态。

查看4道真题和解析