面试官:上次我们的Java基础还没说完
文章目录
1、JDK、JRE、JVM有什么区别?
JDK(Java Development Kit):针对Java程序员的产品,Java程序开发包。(JDK面向开发人员,就是一个工具库)
JRE(Java Runtime Environment):是运行Java的环境集合,提供Java的
标准实现和基本类库。(JRE只看的懂字节码,看不懂.java的文件)
JVM:Java虚拟机用于运行Java字节码文件,跨平台的核心。
2、常用数字类型的区别?
3、Float在JVM的表达方式?
打印结果为:d1 == d2
float类型在内存中的存储形式为科学计数法,表达为:4.2343242E7
d2用科学计数法表示同样为4.2343242E7,因此d1 == d2
4、面向对象三大特性是什么
封装:把数据和操作数据的方法封装起来,对数据的访问只能通过已经定义的接口
封装的好处:
- 实现专业的分工
- 减少代码耦合
- 可以自由修改类的内部结构
继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类北城为父类(超类/基类),得到继承信息的被称为子类(派生类)。
接口与接口类有哪些异同?
相同点 | 不同点 |
---|---|
都是上层的抽象 | 抽象类可包含方法的实现,接口则只能包含方法的声明 |
不能被实例化 | 继承类只能继承一个抽象类实现类可以实现多个接口 |
都可以包含抽象方法 | 抽象级别:接口>抽象类>实现类 |
作用不同:接口用于约束程序行为,继承则用于代码复用 |
多态:多态是同一个行为具有多个不同表现形式或形态的能力,多态是同一个接口,使用不同的实例而执行不同操作。
5、静态和实例变量(方法)的区别?
语法区别:静态变量前要加static关键字,实例则不用
隶属区别:实例变量属于某个对象的属性,而静态属于类
运行区别:静态变量在JVM加载类自己创建,实例变量在实例化对象时创建
存储位置:静态变量存储在方法区,不发生垃圾回收,实例变量存储在堆中,发生垃圾回收
6、说一下类的执行顺序
1、静态优先
2、父类优先
3、非静态块优先于构造函数
7、String与字符串常量池,做个题
String s1 = "abc";//指向常量池的abc,内存地址与s2相等
String s2 = "abc";//指向常量池的abc,内存地址与s1相等
String s3 = "abc" + "def";//指向常量池的abcdef,内存地址与s4相等
String s4 = "abcdef";//指向常量池的abcdef,内存地址与s3相等
String s5 = s2 + "def";//会产生新的内存地址
String s6 = new String("abc");//创建的字符串对象,不在常量池
System.out.println(s1 == s2);//true
System.out.println(s3 == s4);//true
System.out.println(s4 == s5);//false
System.out.println(s4.equals(s5));//比较内容,返回true
System.out.println(s1 == s6);//false
8、String、StringBuilder、StringBuffer的区别?
String | StringBuffer | StringBuilder | |
---|---|---|---|
执行速度 | 最差 | 其次 | 最高 |
线程安全 | 线程安全 | 线程安全 | 线程不安全 |
使用场景 | 少量字符串操作 | 多线程环境下的大量操作 | 单线程环境下的大量操作 |
9、Object类hashCode()和equals()的区别?
equals()方法用来判断两个对象是否“相同”
hashCode()返回一个int,代表“将该对象的内部地址”
序号 | 描述 |
---|---|
1 | 两个对象如果equals()成立,hashcode()一定成立 |
2 | 如果equals()不成立,hashcode()可能成立 |
3 | 如果hashcode()成立,equals()不一定成立 |
4 | hashcode()不相等,equals()一定不成立 |
10、Java IO中有几种类型的流
输入流 | 输出流 | |
---|---|---|
字节流 | InputStream、FileInputStream、BufferedInputStream | OutputStream、FileOutputStream、BufferedOutputStream |
字符流 | Reader、FileReader、InputStreamReader、BufferedReader | Writer、FileWriter、OutputStreamWriter、BufferedWriter |
11、利用IO实现文件复制
File source = new File("d:/WinSCP.rar");
File target = new File("d:/VUE/WinSCP.rar");
InputStream input = null;
OutputStream output = null;
try {
input = new FileInputStream(source);
output = new FileOutputStream(target);
byte[] buf = new byte[1024];
int byteRead;
while((byteRead = input.read(buf)) != -1){
output.write(buf,0,byteRead);
}
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}