面试_java基础
1.JDK和JRE区别
- JDK:Java Development kit即java开发工具,提供了java的开发环境和运行环境
- JRE:Java Runtime Environmnet即java运行环境,提供了java运行的所需环境
JDK包含JRE,同时还包含编译java源码的编译器javac,还包含了很多java程序调测和分析工具.如果你需要运行java程序,那么只有安装JRE就可以了,如果你要编写java程序,就要安装JDK
2.==和equals的区别
1.==解读
对于基本类型和引用类型==的作用效果是不同的,如下所示:
- 基本类型:比较的是值是否相同;
- 引用类型:比较的是引用是否相同;
代码示范:
因为x和y指向同一个引用,所以==是true,而new String()方法则重新开辟了内存空间,所以==的结果是false,而String类因为重写equals方法,所以比较的是值,结果为true
2.equals解读
equals本质上就是==,只不过String和Integer等重写了equals方法,把它变成了值的比较
所以
- 基本类型:比较的是值是否相同;
- 基本包装类型:比较的是值是否相同;
- 引用类型:比较的是引用是否相同;
如果我们自定义的类不重写equals()方法,那么继承objcet的equals()方法,我们看下它是怎么写的
如图所示,equals本质上就是==
那么为什么,两个相同值的String对象,返回是true?
因为String类型重写equals()方法,将引用的比较改为值的比较了
总结:==对于基本类型是值的比较,对于引用类型比较的是引用,而equals默认情况下和==一样,只有当这个类重写了equals方法,比如String,Integer等,将它变成了值的比较,在实际应用中,equals一般用于比较值是否相等
3.String为什么不可变
1.什么是不可变对象
如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。
打印结果为:
s = ABCabc
s = 123456
从打印结果可以看出,s的值确实改变了。那么怎么还说String对象是不可变的呢?
其实这里存在一个误区: s只是一个String对象的引用,并不是对象本身。对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。用只是一个4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。 也就是说,s只是一个引用,它指向了一个具体的对象,当s=“123456”; 这句代码执行过之后,又创建了一个新的对象“123456”, 而引用s重新指向了这个心的对象,原来的对象“ABCabc”还在内存中存在,并没有改变。内存结构如下图所示:
可参考:String为什么不可变
4.两个对象的hashCode()相同,则equals()也一定为true吗?
错误,两个对象的hashCode相同,equals不一样为true
结果如下:
5.final在java中的作用?
- final修饰的类叫最终类,不能被继承
- final修饰的方法不能被重写
- final修饰的变量叫常量,常量必须初始化, 初始化后值不能被修改
运行结果如下:
由此可见 - final修饰的map、list、数组、StringBuilder 、StringBuffer .它们的内容是可以修改的。
- String和基本数据类型的变量,同样final表示地址不能修改,但是地址的存储跟常量的值有关,给他重新赋值会指向另外一个对象,地址就改变了。
总结:被final修饰的变量,不可变的是变量的引用,而非变量的内容
可参考: final修饰变量的问题
6.Java中Math.round(-1.5)等于多少?
Math.round 四舍五入
Math.round(-1.5)结果为-1,因为在数轴上取值时,中间值(0.5)是向右取整,round(1.5)取2,round(-1.5)则取-1
7.Java中操作字符串的有哪些类?它们之间的区别?
操作字符串有:
- String
- StringBuffer
- StringBuilder
1.String操作字符串
实例测试:
此处 str+= "hello"的过程相当于将原有的str变量指向的对象内容取出与"hello"作字符串相加操作再存进另一个新的String对象当中,再让string变量指向新生成的对象。当这个过程在循环中时,会产生很多无用的中间对象,对性能有影响
其实在jvm中会自动被JVM优化成:
不信的话,我们做个实验:
结果显示,两个方法的耗时差不多
2.StringBuilder和StringBuffer的差别
StringBuilder和StringBuffer类拥有的成员属性以及成员方法基本相同,区别是StringBuffer类的成员方法前面多了一个关键字:synchronized,不用多说,这个关键字是在多线程访问时起到安全保护作用的,也就是说StringBuffer是线程安全的。
总结:
1.当有大量字符串操作情况下,执行效率是StringBuilder > StringBuffer > String
8.String str = “i” 和 String str = new String(“i”)一样吗?
不同,内存的分配方式不同,前者是分配到常量池中,后者是在堆内存中
9.字符串反转
使用StringBuilder或者StringBuffer的reverse()方法
10.String类常用方法
使用StringBuilder或者StringBuffer的reverse()方法
- indexOf():返回指定字符的索引
- charAt():返回指定索引处的字符
- replace():字符串替换
- trim():去除字符串两端的空白
- split():分割字符串,返回一个分割后字符串数组
- getBytes():返回字符串的byte类型数组
- length():返回字符串长度
- toLowerCase():转小写字母
- toUpperCase():转大写字母
- substring():截取字符串
- equals():字符串比较
11.抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法
12.普通类和抽象类有哪些区别?
- 普通类不能包含抽象方法,抽象类可以包含抽象方法
- 抽象类不能直接实例化,普通类可以直接实例化
13.抽象类能使用final修饰吗?
不能,定义抽象类就是能让其他类继承,如果定义为final该类就不能被继承,这样就有矛盾了
14.接口和抽象类的区别?
- 实现:抽象类子类使用extends来继承,接口必须用implements来实现接口
- 构造函数:抽象类可以有构造函数,接口不能有
- 实现数量:类可以实现很多接口,但只能继承一个抽象类
- 访问修饰符:接口中方法默认使用public修饰;抽象类中方法可以是任意访问修饰符.
15.Java中IO流分为几种?
功能来分:输出流、输出流
类型来分:字节流和字符流
字节流和字符流的区别是:字节流按8位传输以字节为单位输入输出数据,字符流按16位传输以字符为单位输入输出数据.
16.Files的常用方法有哪些?
- exists():检测文件路径是否存在
- createFile():创建文件
- createDirectory():创建文件夹
- delete():删除一个文件或文件夹
- copy():复制文件
- move():移动文件
- size():查看文件个数
- read():读取文件
- write():写入文件