java面试基础篇(一)

前言

这系列的文章,为自己自己复习时的学习总结,要是有写的不对的地方,还希望大家纠正指出

1.什么是java(你认为的java是什么)

这个问题非常的简单,非常的基础,但当你被问到的时候是不是也会有一瞬间突然不知道该怎么回答,接下来我来阐述下我的个人观点。

首先,java是一种面向对象的语言,具有封装、继承、多态这三大特性,其次是它的简单易学,语法贴近c和c++相信只要有一点编程语言基础的,就能够看懂java语法。但它最大的特点便是平台无关性,发展至今,几乎可以在所有的平台上运行,真正的做到了,“一次编译,到处运行”这句话。它非十分的可靠安全,支持多线程和网络编程,这也为我们现如今被各大公司所提到的高可用,高并发这种词汇打下了坚实的基础。随着JIT的不断发展,也让java与其他高级脚本语言相比,具有更好的性能。

2.面向对象和面向过程的区别

面向过程
面向过程比面向对象:因为面向过程的语言,不具有将类实例化的能力(类的实例化,开销大,比较占有资源),所以当我们面对将性能放在首要考量因素时,我们优先选用面向过程的语言。例如:单片机,操作系统,嵌入式开发等。
面向
面向对象
面向对象具有,易维护,易扩展,易复用的特点。因为面向对象具有封装、继承、多态这三大特性,所以更容易设计出低耦合的系统 ,提高系统的灵活度,更易于维护。

其实实例化这个原因并不是根本原因,因为面向过程也需要分配内存,计算内存偏移量,而Java性能差的主要原因并不是因为它是面向对象语言,而是Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机械码。而面向过程语言大多都是直接编译成机械码在电脑上执行

3.谈谈对多态的理解

其实呢,面向对象的三大特性:封装,继承,多态,从某种角度上来说,封装和继承其实是为了多态服务的。面向对象的语言他的优势就如上面所提到的,我们知道封装是我了要隐藏细节,是代码模块化,继承可扩展已存在的代码模块,他们的共同目的就是为了代码复用。而多态除了可以使代码复用外,还可以解决类型中紧耦合的问题,从而提高了程序得扩展性。

4.多态的定义

指不同类的对象对同一消息做出响应,即不同的对象对同一消息进行响应会得到不同的结果.例如:最为直接简单的例子就是我们平常写项目借出最多的接口与实现类,对于不同的类对同一个接口进行实现,实现属于自己的操作。

5.重载和重写的区别

重载
发生在同一个方法中,方法名必须相同,但参数类型,个数,顺序可以不同。方法的返回值,修饰符也可以不同。
重写
发生在父子类当中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。

6.java和c++的区别

都是面向对象的语言,具有封装,继承,多态的特性。
java不提供指针访问,数据更加的安全。
java是单继承,c++支持多继承,但是java支持多实现。
java具有自动内存管理机制,无需手动去释放

7.String StringBuilder StringBuffer的区别

可变性
String类使用final来修饰字符数组保存字符串,所以String类是不可变的。
在这里插入图片描述而StringBuilder和StringBuffer都继承于AbstractStringBuilder在AbstractStringBuilder中是使用char []value来作为变量,但是没有用final关键字来修饰因而是可变的。而StringBuilder和StringBuffer的构造方法时调用父类的方法来完成构造的因而StringBuilder和StingBuffer也具有可变性
在这里插入图片描述在这里插入图片描述
大家可以行阅读AbstractStringBuilder的源码

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    char[] value;
    int count;
    AbstractStringBuilder() {
    }
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];
    }

线程安全性
String是线程安全的,因为它是不可变的,由于它用final修饰的所以可以将它理解为常量。StringBuffer对每个方法都加了同步锁所以是线程安全的,StringBuilder未加同步锁所以是线程不安全的。

性能
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,这会特别影响性能。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。

通过以上总结我们可以得出:当我们不频繁操作字符串时可以使用String,在单线程环境下如果频繁操作字符串可以使用StringBuilder,多线程环境下的话可以使用StringBuffer。

8.为什么需要包装类

我们知道,java是一种面向对象的语言,可是基本类型并不具有面向对象的性质,有些使用起来就并不是很方便,所以就出现了包装类,它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。另外如果我们需要使用集合,往ArrayList,HashMap存数据,基本类型是会报编译时错误的,只可以存储包装类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值