1.对Java平台的理解
1)Java本身一种面向对象的语言 显著的两个方面特性
一是 书写一次 到处运行;能够非常容易获得跨平台的能力
(并不是说Java语言可以跨平台,而是不同的平台上 都有可以让Java语言运行的环境而已 所以才有一次编译 到处运行)
二是 垃圾收集 Java通过垃圾收集器回收分配内存,大部分情况下,程序员 不需要自己担心内存分配和回收
2)Java具有三大特性: 封装 继承 多态 这三大特性增加代码的复用率和灵活率
3)Java具有:简单性、纯粹的面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。
4)Java可以编写:桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等
2.String,StringBuffer,StringBuilder的区别
String : 是典型的不可变类型 ;内部使用final关键字,所以每次进行字符串操作(拼接,截取等)
都会产生新对象 开发中会大量使用字符串操作,字符串临时对象会对程序操作产生较大的性能开销,产生了大量的内存浪费
StringBuilder : 比StringBuffer 速度快 StringBuffer又比String 速度快
StringBuffer:所有公开方法都是synchronized修饰的,所以 线程安全
他们三者最大的区别是String内容不可更改,改内容只是改它对象的引用指向而已;而其他两者内容可修改
3.int 和Integer 的区别
int是基本数据类型 是Java的8个基本数据类型之一 可以直接存数值
Integer是int 对应的包装类 (必须进行实例化才能够使用 )在拆箱和装箱 可以自动转换 极大简化了相关编程
Integer实际是一个对象的引用,当new一个Integer对象时,实际是生成一个指针指向该对象,在jvm中对象需要一定的数据结构进行描述,相比int而言,其占用的内存更大一些
(以下例子为转载)
小题:在使用Integer时,对于-128到127之间的数,会进行缓存,Integer i1 = 127时,会将127进行缓存,下次再写Integer i2 = 127时,就会直接从缓存中取,不会新new一个Integer,所以i1和i2用 ‘==’ 进行比较时,会为true。
4.==和equals的区别是什么?
1).== 是用来直接比较两个对象的堆内存地址
如何相等 说明这两个引用实际是指向同一个对象地址的。因此基本数据类型和String常量是可以通过== 来直接进行比较
2)对于引用对象 对比是否相等 使用equals方法 比较对象中的值是否相等,但是要重写hashcode和equals方法
5.jdk1.8新特性
1)lambda 表达式
其本质是匿名内部类,也可以是一段可以传递的代码。可以简化代码的书写
2)函数式接口 (有且仅有一个抽象方法, 标注有@Functional interface注解的的接口都是
生产性接口 )
supplier 用来生产数据(提供数据的)
消费性接口 consumer 用来处理数据
条件判断性接口 predicate 用来判断数据是否符合指定条件
类型转换接口 function<T,R> 将T类型数据转成R类型
3)方法引用 (::) 用它来代替已知对象的已知方法
4)新的日期类LocalDate 多使用于多线程的使用环境下
表示日期的LocalDate
表示时间的LocalTime
表示日期时间的LocalDateTime
常用api:
//获取当前日期,只含年月日 固定格式 yyyy-MM-dd 2018-05-04
LocalDate today = LocalDate.now();
// 根据年月日取日期,5月就是5,
LocalDate oldDate = LocalDate.of(2018, 5, 1);
// 根据字符串取:默认格式yyyy-MM-dd,02不能写成2
LocalDate yesteday = LocalDate.parse("2018-05-03");
// 如果不是闰年 传入29号也会报错
LocalDate.parse("2018-02-29");
新API的 优点:
之前使用的java.util.Date月份从0开始,我们一般会+1使用,很不方便,java.time.LocalDate月份和星期都改成了enum
java.util.Date和SimpleDateFormat都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。
java.util.Date是一个“万能接口”,它包含日期、时间,还有毫秒数,更加明确需求取舍
新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date配合Calendar要写好多代码,而且一般的开发人员还不一定能写对。
5)引入Stream流 支持链式编程
6.final 关键字的作用
final 关键字 可以用来修饰变量,方法和类
被final修饰的类 会成为最终类,无法被继承
被final修饰的方法 会成为最终方法 无法被子类重写 但仍然可以被继承
final修饰 类中的属性或变量 无论属性是基本类型还是引用类型,final起到的作用只是变量中存放的值不发生改变
final变量 (如果是基本数据类型变量 其数值初始化之后不能更改; 如果是引用类型变量,初始化后不能再让其指向另一个对象)
7. 什么是内存泄漏 和 内存溢出
内存泄漏:指应用程序在申请内存后,无法释放已经申请的内存空间,一次泄漏的危害可以忽略,但如果任其发展最终会导致内存溢出(如 读取文件流之后 要进行及时的关闭;数据库连接的释放等)
内存溢出: 指应用程序在申请内存时,没有足够的内存空间供其使用。
(为此,我们在项目中对于大批量数据的导入,采用分批量提交的方式)
8.抽象类和接口的区别
抽象类:必须是abstract修饰,子类必须实现抽象类中的抽象方法(未实现的(0--n个抽象方法),子类也必须用abstract修饰) 抽象类默认的权限修饰符是public 可以定义为(public或protected) 如果定义为private 则子类无法继承
抽象类不能创建对象(不能实例化)
区别是: 抽象类只能继承一次 但可以实现多个接口
他俩都必须实现其中的所有的方法。 抽象类如果有未实现的抽象方法 子类也需要定义为抽象类,抽象类中可以有非抽象的方法
接口: 其中的变量必须是public static final修饰 并且需要给初始值 所以实现类不能被重新定义,也不能改变其值; 其中的方法默认是public abstract 也只能是该类型,不能用static,接口中的方法也不允许子类覆写
jdk1.8之后:接口中的方法不再是只能有抽象方法,他可以有静态方法和default方法。
抽象类中允许有static 方法
9.Error和Exception的区别
他们两个都是继承了Throwable类, 在Java中只有该类的实例才可以被抛出(throw)或者捕获(catch) ,是异常处理机制的基本组成类型
他们两个体现了 Java平台设计者对不同异常情况的分类。
Exception是程序正常运行中可以预料的意外情况,可能并且应该被捕获并进行相应处理
Exception又分为可检查异常;不检查异常
而Error是指在正常情况下 不大可能出现的 绝大多数的Error会导致程序处于非正常,不可恢复状态 -----> 不便于捕获 常见的比如:OutOfMemoryError之类 都是Error的子类
10.常见的异常有 Exception
1)数组越界异常 ---->访问了不存在的索引 : 在索引0到 (数组长度-1)的范围内取值
2)空指针异常---->对象未创建就访问 :判断哪个对象没有new 如果没有 就创建该对象
3)没有该元素异常 ----> 在迭代器迭代的时候没有下一个元素 : 在迭代器之前做相应判断,没有就不迭代输出
4)并发修改异常 ---> 迭代器迭代的同时 使用集合修改 元素 : 使用普通for循环遍历 使用toArray遍历 使用ListIterator 遍历
5)类型转换异常 --->向下转换的过程中没有转换成真实类型 转型前用instanceof 对所有子类进行逐一判断
6)算法出错异常 --->除数不能为0 :改变除数的结果 再进行测试
7)没有实现序列化异常 ---->没有实现Serializable接口 :实现它
11.重写和重载的区别
重写: 子类继承父类 在子类中存在和父类一摸一样的方法 重新编写编写方法中的代码 实现效果
重载 : 同一个类中存在多个方法名相同,传参个数,顺序和类型不同,返回值可以相同也可以不同的方法
12. 什么是反射 反射的好处是什么
反射指的是在运行状态下可以获取任类的名称,属性,方法,判断任意一个对象所属的类,,实例化任意一个类的对象
(将一个源码(.java 文件)编译成一个class文件的过程中,jvm虚拟机会利用反射机制来加载类 以及类里面的成员变量和方法等 该过程为反射)
好处:通过其 实现动态装配,降低代码的耦合度;动态代理等;反射的严重使用会严重消耗系统资源