Java面试基础题

Java面试题目

本文记述了一些我遇到的面试题目, 以及一些答案的总结


一、Java语言的特点

  1. 它是一门面向对象的语言, 具有封装, 继承, 多态等特性.

    面向对象易维护, 易复用, 易扩展, 因为面向对象有封装, 继承, 多态的特性, 所以可以设计出低耦合的系统, 使系统更加灵活, 更易于维护, 但是面向对象性能比面向过程低.

  2. java语言一次编译到处运行, 即平台无关性, Java虚拟机实现平台无关性.

    JVM是Java跨平台的关键。 在运行程序之前,Java源代码(.java)需要经过编译器,将源代码翻译成字节码(.class),但字节码不能直接运行,所以必须通过JVM将字节码翻译成特定平台的机器码运行程序。但跨平台的是Java程序、而不是JVM,所以需要在不同平台下安装不同版本的JVM。

  3. 具有较好的安全性和健壮性, 开发人员不需要对内存的使用进行管理.

  4. 支持多线程, 网络编程, 提供了对Web应用开发的支持, 例如Applet, Servlet, JSP等.

    java语言经常被用在网络环境中,为了增强程序的安全性,java语言提供了一个防止恶意代码攻击的安全机制(数组边界检测和Bytecode校验等)

  5. 使用范围广, 提供了很多内置的类库, 通过这些类库简化了开发人员的程序设计工作, 缩短了项目开发时间.

  6. 解释与编译共存. Java程序要先编译, 后解释, 由Java编写的程序需要先经过编译生成字节码文件, 再由Java解释器解释执行.

二、Java基本数据类型以及引用类型

基本数据类型:
  1. 整数类型 : byte (1字节) , short (2字节) , int (4字节) , long (8字节)

  2. 浮点类型 : float (4字节) , double (8字节)

  3. 布尔类型 : boolean

    1. boolean类型被编译为int类型,等于是说JVM里占用字节和int完全一样,int是4个字节,于是boolean也是4字节

    1. boolean数组在Oracle的JVM中,编码为byte数组,每个boolean元素占用8位=1字节

  4. 字符类型 : char (2字节)

基本数据类型在声明时会在栈内存中分配空间.

引用数据类型:

除了八个基本数据类型, 其他类型都是引用类型. 例如 类, 接口, 数组, String 等, 这些变量在声明时会在堆内存中分配空间.

每个基本类型都有其对应的包装类, 基本数据类型和其对应的引用类型可以通过装箱 (Integer.valueOf) 和拆箱 (i.intValue) 来完成, 基本类型之间允许低精度对象向高精度对象转化, 但是不能反过来, 例如short类型可以转换为int类型.

三、抽象类与接口的区别

相同点

两者都不能实例化 , 可以拥有抽象方法.

区别
  1. 用来定义抽象类的关键字是 abstract calss , 而接口定义的关键字是implement.

  2. 在属性上, 抽象类可以有静态变量, 常量和成员变量, 而接口只能有常量.

  3. 在抽象方法中可以有普通方法, 而在jdk1.8之前, 接口中只能存在抽象方法, 在1.8之后增加了静态方法和默认方法.

  4. 抽象方法可以有构造方法, 接口没有构造方法.

  5. 类与类之间只能单继承, 而接口之间可以多继承.

  6. 抽象类多用于在同类事物中有无法具体描述的方法的场景,而接口多用于不同类之间,定义不同类之间的通信规则.

四、String StringBuffer StringBuilder

对象创建

String可以直接字符串赋值创建,或者new String()创建,前者会判断字符串常量池中是否存在,如果存在直接引用,不存在则创建一个在字符串常量池中,后者会在堆内存中new一个对象,同时如果字符串常量池中没有值相同的,也会给字符串常量池创建一个。StringBuilder和Stringbuffer则都abstractStringBuilder的子类,需要在堆内存中new一个。

可变性

String类中使用字符数组来保存字符串, 且用final关键字来修饰, 所以String对象不可变, 在Java9之后, String类改用byte数组存储字符串.

StringBuilder 和StringBuffer 都继承自AbstractStringBuilder类, 在这个类中也是使用字符数组来保存字符串, 但是没有final关键字修饰, 所以这两种对象都是可变的. 可以通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()、等方法来改变这个字符串对象的字符序列.

线程安全性

String对象是不可变的, 所以线程安全.

StringBuffer对其方法加了同步锁或者是对其调用的方法加了同步锁, 所以是线程安全的.

StringBuilder没有对方法加同步锁, 所以是非线程安全的.

性能

每次对String类型改变时, 都会生成一个新的String对象, 然后将指针指向新的String对象, 所以String 使用于操作少量数据时.

StringBuilder和StringBuffer每次都是对对象本身进行操作, 不是生成新的对象. 由于StringBuilder是线程不安全的,不用考虑锁的开销,所以比StringBuffer的性能更好, 但是有线程不安全的风险.

所以在单线程操作字符串缓冲区下的大量数据更适用于StringBuilder, 多线程高并发时更适用StringBuffer.


总结

总结了几道简单的Java面试可能会遇到的问题.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值