面试_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.==解读
对于基本类型和引用类型==的作用效果是不同的,如下所示:

  • 基本类型:比较的是值是否相同;
  • 引用类型:比较的是引用是否相同;

代码示范:
面试_java基础
因为x和y指向同一个引用,所以==是true,而new String()方法则重新开辟了内存空间,所以==的结果是false,而String类因为重写equals方法,所以比较的是值,结果为true

2.equals解读
equals本质上就是==,只不过String和Integer等重写了equals方法,把它变成了值的比较
所以

  • 基本类型:比较的是值是否相同;
  • 基本包装类型:比较的是值是否相同;
  • 引用类型:比较的是引用是否相同;

如果我们自定义的类不重写equals()方法,那么继承objcet的equals()方法,我们看下它是怎么写的
面试_java基础
如图所示,equals本质上就是==

那么为什么,两个相同值的String对象,返回是true?
面试_java基础
因为String类型重写equals()方法,将引用的比较改为值的比较了

总结:==对于基本类型是值的比较,对于引用类型比较的是引用,而equals默认情况下和==一样,只有当这个类重写了equals方法,比如String,Integer等,将它变成了值的比较,在实际应用中,equals一般用于比较值是否相等


3.String为什么不可变

1.什么是不可变对象
如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的。不能改变状态的意思是,不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。

面试_java基础
打印结果为:
s = ABCabc
s = 123456

从打印结果可以看出,s的值确实改变了。那么怎么还说String对象是不可变的呢?
其实这里存在一个误区: s只是一个String对象的引用,并不是对象本身。对象在内存中是一块内存区,成员变量越多,这块内存区占的空间越大。用只是一个4字节的数据,里面存放了它所指向的对象的地址,通过这个地址可以访问对象。 也就是说,s只是一个引用,它指向了一个具体的对象,当s=“123456”; 这句代码执行过之后,又创建了一个新的对象“123456”, 而引用s重新指向了这个心的对象,原来的对象“ABCabc”还在内存中存在,并没有改变。内存结构如下图所示:
面试_java基础
可参考:String为什么不可变


4.两个对象的hashCode()相同,则equals()也一定为true吗?

错误,两个对象的hashCode相同,equals不一样为true
面试_java基础
结果如下:
面试_java基础


5.final在java中的作用?

  • final修饰的类叫最终类,不能被继承
  • final修饰的方法不能被重写
  • final修饰的变量叫常量,常量必须初始化, 初始化后值不能被修改
    面试_java基础
    运行结果如下:
    面试_java基础
    由此可见
  • 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操作字符串
实例测试:
面试_java基础
此处 str+= "hello"的过程相当于将原有的str变量指向的对象内容取出与"hello"作字符串相加操作再存进另一个新的String对象当中,再让string变量指向新生成的对象。当这个过程在循环中时,会产生很多无用的中间对象,对性能有影响

其实在jvm中会自动被JVM优化成:
面试_java基础
不信的话,我们做个实验:
面试_java基础
结果显示,两个方法的耗时差不多
面试_java基础

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():写入文件