Java基础面试题(一)----基础知识

JAVA概述
1.JVM、JRE和JDK的关系

JDK包含JRE,JRE包含JVM

JDK=开发工具(java.exe,javac.exe等等)+JRE

JRE=核心类库(util,concurrent等等)+JVM

2.什么是跨平台性?原理是什么

跨平台性
一次编译到处执行

原理
Java程序是通过java虚拟机在系统平台上运行的,只要该系统可以安装相应的java虚拟机,该系统就可以运行java程序

基础语法
1.Java有哪些数据类型

基本数据类型
数值型
整数类型(byte,short,int,long)
浮点类型(float,double)
字符型(char)
布尔型(boolean)

引用数据类型(String等)

2.用最有效率的方法计算 2 乘以 8

2<<3

3.float f=3.4;是否正确

不正确
3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失
因此需要强制类型转换float f =(float)3.4; 或者写成 float f =3.4F;

4.short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗

前者不对,后者对
由于 1 是 int 类型,因此 s1+1 运算结果也是 int型,需要强制转换类型才能赋值给 short 型
因为 s1+= 1;相当于 s1 = (short(s1 + 1);其中有隐含的强制类型转换,所以后者对

5.访问修饰符 public,private,protected,以及不写(默认)时的区别

private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。

public : 对所有类可见。使用对象:类、接口、变量、方法

6.final 有什么用

被final修饰的类不可以被继承
被final修饰的方法不可以被重写
被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用(堆中的),而不是引用本身(栈中的),引用本身是可以改变的

7.final finally finalize区别

final可以修饰类、变量、方法
参考Q.6
finally一般作用在try-catch代码块中,无论是否发生异常,finally的代码块都会执行
finalize是一个方法,属于Object类的一个方法
当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断

8.在 Java 中,如何跳出当前的多重嵌套循环

可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环

面向对象基础
1.重写和重载的区别?重载中方法的返回值可以相同吗?

重写(override)⽅法原则
1.⼦类的⽅法的名称必须和所覆盖的⽅法相同
2.⼦类的⽅法的参数必须和所覆盖的⽅法相同
3.⼦类的返回类型必须和所覆盖的⽅法相同 (除过⼦类中⽅法的返回类型是⽗类中返回类型的⼦类)
4.⼦类抛出异常⼩于等于⽗类⽅法抛出异常
5.⼦类访问权限⼤于等于⽗类⽅法访问权限
重载(overload)⽅法原则
1.⽅法名必须相同
2.⽅法的参数列表不相同(包括参数类型,参数个数,参数顺序)
3.⽅法的返回类型和⽅法的修饰符可以不相同
总结
方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性
⽅法重载的返回值类型可以不相同,⽅法重写的返回类型必须相同,否则编译报错

2.JAVA支持多继承吗,如果想要多继承怎么办?

不支持,可以考虑多实现、内部类、多层继承

3.抽象类和接口的区别,抽象类和接口可以实例化吗?

共同点:都不能实例化

声明实现构造器访问修饰符多继承字段声明
抽象类抽象类使用abstract关键字声明子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现抽象类可以有构造器抽象类中的方法可以是任意访问修饰符一个类最多只能继承一个抽象类抽象类的字段声明可以是任意的
接口接口使用interface关键字声明子类使用implements关键字来实现接口。它需要提供接口中所有声明的方法的实现接口不能有构造器接口方法默认修饰符是public。并且不允许定义为 private 或者 protected一个类可以实现多个接口接口的字段默认都是 static 和 final 的

参考Q.5

4.String可以被继承吗

不能被继承,因为String类有final修饰符

5.抽象类和接口的对比

抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。
从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
相同点
接口和抽象类都不能实例化
都位于继承的顶端,用于被其他实现或继承
都包含抽象方法,其子类都必须覆写这些抽象方法

6.内部类的分类有哪些

静态内部类
成员内部类
局部内部类
匿名内部类
就是没有名字的内部类,日常开发中使用的比较多

7.内部类的优点

一个内部类对象可以访问创建它的外部类对象的内容,包括私有数据!
内部类不为同一包的其他类所见,具有很好的封装性;
内部类有效实现了“多重继承”,优化 java 单继承的缺陷。
匿名内部类可以很方便的定义回调。

8.局部内部类和匿名内部类访问局部变量的时候,为什么变量必须要加上final

是因为生命周期不一致, 局部变量直接存储在栈中,当方法执行结束后,非final的局部变量就被销毁。而局部内部类对局部变量的引用依然存在(该匿名内部类作为返回值返回了),如果局部内部类要调用局部变量时,就会出错。加了final,可以确保局部内部类使用的变量与外层的局部变量区分开,解决了这个问题
参考

9.String中equals与==的区别

equals比较的是值比较
==表示:
引用数据类型比较引用地址
基本数据类型比较值

10.hashCode 与 equals

Object中的实现
hashcode()
本地方法,返回调用对象在内存堆上的独特值
equals()
this==obj
为什么散列表hash一定要重写hashcode和equals
步骤
先调用hashcode比较是否相等(是否在一个bucket中)
如果Hashcode相等,再调用equals判断是否是一个对象(属性是否相同)
equals 方法被覆盖过,则 hashCode 方法也必须被覆盖
若hashcode不重写,默认调用Object的,无论如何hashcode都不会相等

​ 若equals不重写,默认调用Object的,除非是同一个对象,否则就算属性值相同也会返回false。

总结
当我们需要将某一个类的对象存入散列表时(如 HashMap、HashTable 等),hashCode 和 equals 都必须重写

原理 例子

11.值传递和引用传递有什么区别

值传递
传的是值的拷贝
引用传递
传的是引用地址(即存在栈中的)

其他
1.说一下JAVA中的泛型?

使用泛型参数,可以增强代码的可读性以及稳定性
泛型一般有三种使用方式:泛型类、泛型接口、泛型方法

2.Java int 和Integer的区别,怎样比较int和Integer类型的值是否相等。

区别
1.Integer是int的包装类,int则是java的一种基本数据类型
2.Integer变量必须实例化后才能使用,而int变量不需要
3.Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4.Integer的默认值是null,int的默认值是0
int和Integer比较
Integer会自动拆箱,相当于两个int比较
缓存机制
如对于两个非new生成的Integer对象(值在-128~127之间,会从缓存中拿)
自动装箱和自动装箱
装箱:将基本类型用它们对应的引用类型包装起来;
Integer i = 10; //装箱
等价于Integer i = Integer.valueOf(10)
拆箱:将包装类型转换为基本数据类型;
int n = i; //拆箱
等价于int n = i.intValue()

3.java 中 IO 流分为几种

按照流的流向分,可以分为输入流和输出流;
按照操作单元划分,可以划分为字节流和字符流;
按照流的角色划分为节点流和处理流
InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流

4.BIO,NIO,AIO 有什么区别

BIO
Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低
NIO
Non IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用
AIO
实现了异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制

5.什么是反射机制

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性

6.反射机制优缺点

优点: 运行期类型的判断,动态加载类,提高代码灵活度。
缺点: 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。

7.获取反射的三种方法

通过建立对象
Student stu = new Student();
Class classobj1 = stu.getClass();
所在通过路径-相对路径
Class classobj2 = Class.forName(“fanshe.Student”)
通过类名
Class classobj3 = Student.class

8.String的特性

不变性
定义了final char value[]的成员变量
但是引用自身(栈中)可以改变,但是引用指向的内容(堆中)不能变
字符串常量池
位于堆内存,提高内存的使用率
final
不可被继承

9.在使用 HashMap 的时候,用 String 做 key 有什么好处

因为String的不变性,它的hashcode被缓存了下来,不需要被再次计算,速度比其他对象更快

10.String和StringBuffer、StringBuilder的区别是什么

可变性
String 是不可变的
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,定义了char[] value,这两种对象都是可变的
线程安全性
String中的对象是不可变的,也就可以理解为常量,线程安全
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的
性能
每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象
StringBuffer和StringBuilder每次都会对对象本身进行操作,而不是生成新的对象并改变对象引用
总结
如果要操作少量的数据用 => String
单线程操作字符串缓冲区 下操作大量数据 => StringBuilder
多线程操作字符串缓冲区 下操作大量数据 => StringBuffer

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值