Java初级工程师面试题–Java基础部分
1. JDK 和 JRE 有什么区别?
JDK:java开发工具包,提供了java开发环境和运行的环境
JRE:java运行环境,为java提供了所需的运行环境
总体来说:
JDK包含了jre,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析工具
如果你只需要运行java程序,只需要安装JRE就行,如果要编写JAVA程序那就必须有JDK环境
2. == 和 equals 的区别是什么?
“==”:
1.作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等
2. 作为引用类型的变量比较的是两个引用在内存中指向同一块内存空间
“equals”:
1.如果没有对Object中的equals重写那么比较的是就是两个引用类型变量在内存中指向的位置是否一样
2.不能用来比较基本类型的变量(如int,float,double等)
3.如果对Object中的Equals进行了重写那么用来检测两个对象内容是否相等
3. 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对:因为equals()在普通时候比较的是两个对象内存中的值,如果值相同HashCode值也应该相同,
但是如果不重写hashcode方法,值就不相同
4. final 在 java 中有什么作用?
Final可用于三个地方,修饰类,修饰方法,修饰属性
修饰类:此类不能被继承
修饰类方法:此类方法不能被重写
修饰类属性:此属性不能被修改
5.java 中的 Math.round(-1.5) 等于多少?
运算方法是形参+0.5向下取整,答案为-1
6.String 属于基础的数据类型吗?
不是基础的数据类型,他是一个引用类型
基本类型:他的值就是一个数字,一个字符,或者一个bool值
引用类型:他的值指向内存空间的引用(地址),所指向的地址保存一个值或者一组值
7.java 中操作字符串都有哪些类?它们之间有什么区别?
String:final修饰,String类的方法返回值都为new String,即对String对象的任何改变都不影响原对象,对字符串的修改操作都会产生新的对象
StringBuffer:对字符串的操作都加了synchronized保证线程安全
StringBuilder:不保证线程安全,方法体内需要对字符串修改,可以通过new StringBuilder对象的append,replace,delete等方法修改
8.String str="i"与 String str=new String(“i”)一样吗?
Str=“i”,前者回去查询常量池看常量池有没有这个数据,没有的话直接在永久代开辟一个空间将地址托付给栈指针,如果已经有了“i”内存直接把他的地址赋给栈指针
而str=new String(“i”)是根据”a”这个String对象再次构造一个对象,在堆中新new一块内存,把指针赋给栈,new一个就新new一个空间
两者“==”不相等,“equals”相等
9.如何将字符串反转?
1.通过StringBuilder的reverse()方法
2.通过String类的CharAt()方法来获取字符串的每一个字符串,然后其拼接为一个新的字符串
3.通过String的toCharArray()方法可以获取字符串中每一个字符串并转换为字符数组,然后一个空的字符串数组拼接位一个新的字符串
10.String 类的常用方法都有那些?
(1.equals:对比两个字符串是否相等
(2.Charat(int index):返回指定索引处char值
(3.IsEmpty:判断字符串是否为空(length是否为0)
(4.Length:返回字符串的长度
10.抽象类必须要有抽象方法吗?
抽象类可以没有抽象方法,但是抽象类就没办法实例化了
11.普通类和抽象类有哪些区别?
(1.普通类不能包含抽象方法,可以被实例化,可以拥有static修饰的方法
(2.抽象类可以被继承,也可以包含普通方法,但是不能被实例化,不能拥有static修饰的方法,抽象类的子类必须把抽象类中的方法全部实现,否则子类也为抽象类
12.抽象类能使用 final 修饰吗?
抽象类不能被final修饰,因为抽象类存在的意义就是被继承实现,如果被final实现就不能被继承从而失去抽象类存在的意义
13.接口和抽象类有什么区别?
接口的方法不能有方法体(JDK1.8之前),抽象类可以拥有方法体
一个类可以实现多个接口,一个类只能继承一个抽象类
接口方法默认为public(只能为),抽象类方法访问类型可以为public,protect
接口中不能拥有构造方法,抽象类可以拥有抽象方法
接口中不能有静态方法 ,而抽象类可以拥有静态方法
接口和抽象类都可包含静态成员变量,抽象类中的静态成员变量的访问类型可以是任意的,但接口定义的静态成员变量只能是public static final类型,并且默认是public static final类型
-
14.java 中 IO 流分为几种?
(1.按照数据流向 输入流,输出流 (2.按照流数据格式 字符流,字节流 (3.按照流数据包装过程 节点流,处理流
15.File的常用方法都有哪些?
(1.public String getName():获取文件名
(2.public boolean canWriter():判断是否可写
(3.public boolean exists():判断文件是否存在
(4.public int length():获取文件长度
16.java中四种修饰符的限制范围。
Public:该项目内均可访问
Protect:本类,同包类,夸包子类可访问
Default:本类,同包类
Private:本类
17.Object类中的方法。
1.构造函数
2.hashCode和equlas来判断两个对象是否相等
3.Wait(),wait(long),long(long,int),notify(),notifyall()线程等待和唤醒
4.toString,getClass
5.Clone
6.Finalize()用于垃圾回收
18.动态代理的两种方式,以及区别。
(1.JDK动态代理:
利用反射机制生成一个实现代理接口的匿名类,在调用具体方法之前调用Invokehandler来处理
(2.CGlib动态代理:
利用ASM开源包(开源的Java字节码编辑库,操作字节码 ),将代理对象类额class对象加载进来,通过修改器其字节码生成子类来处理
19.Java序列化的方式
序列化:将对象转化成字节流,便于储存
反序列化:将字节流转化回对象
优点:可以实现对象的”持久性”,所谓持久性就是对象的生命周期不取决于程序本身
通过实现Serializable接口,这种是隐式序列化,这种是最简单的序列化方式,会自动序列化所有的非static和非transient(表示不需要序列化)关键字修饰的成员变量
20.传值和传引用的区别,Java是怎么样的,有没有传值引用。
传值:传递的是值得副本,方法中对副本修改不会影响到调用方
传引用:传递的是引用的副本,因为副本和本身共用一个内存,会影响到调用方,此时形参和实参共同指向同一个内存地址。对引用副本本身(对象地址)的修改,如设置为null重新指向其他的对象,不会影响到调用方