面试题之----Java基础(后续更新)

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虚拟机会利用反射机制来加载类  以及类里面的成员变量和方法等  该过程为反射)

好处:通过其 实现动态装配,降低代码的耦合度;动态代理等;反射的严重使用会严重消耗系统资源

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值