Java面试题目
本文记述了一些我遇到的面试题目, 以及一些答案的总结
一、Java语言的特点
-
它是一门面向对象的语言, 具有封装, 继承, 多态等特性.
面向对象易维护, 易复用, 易扩展, 因为面向对象有封装, 继承, 多态的特性, 所以可以设计出低耦合的系统, 使系统更加灵活, 更易于维护, 但是面向对象性能比面向过程低.
-
java语言一次编译到处运行, 即平台无关性, Java虚拟机实现平台无关性.
JVM是Java跨平台的关键。 在运行程序之前,Java源代码(.java)需要经过编译器,将源代码翻译成字节码(.class),但字节码不能直接运行,所以必须通过JVM将字节码翻译成特定平台的机器码运行程序。但跨平台的是Java程序、而不是JVM,所以需要在不同平台下安装不同版本的JVM。
-
具有较好的安全性和健壮性, 开发人员不需要对内存的使用进行管理.
-
支持多线程, 网络编程, 提供了对Web应用开发的支持, 例如Applet, Servlet, JSP等.
java语言经常被用在网络环境中,为了增强程序的安全性,java语言提供了一个防止恶意代码攻击的安全机制(数组边界检测和Bytecode校验等)
-
使用范围广, 提供了很多内置的类库, 通过这些类库简化了开发人员的程序设计工作, 缩短了项目开发时间.
-
解释与编译共存. Java程序要先编译, 后解释, 由Java编写的程序需要先经过编译生成字节码文件, 再由Java解释器解释执行.
二、Java基本数据类型以及引用类型
基本数据类型:
-
整数类型 : byte (1字节) , short (2字节) , int (4字节) , long (8字节)
-
浮点类型 : float (4字节) , double (8字节)
-
布尔类型 : boolean
-
boolean类型被编译为int类型,等于是说JVM里占用字节和int完全一样,int是4个字节,于是boolean也是4字节
-
boolean数组在Oracle的JVM中,编码为byte数组,每个boolean元素占用8位=1字节
-
-
字符类型 : char (2字节)
基本数据类型在声明时会在栈内存中分配空间.
引用数据类型:
除了八个基本数据类型, 其他类型都是引用类型. 例如 类, 接口, 数组, String 等, 这些变量在声明时会在堆内存中分配空间.
每个基本类型都有其对应的包装类, 基本数据类型和其对应的引用类型可以通过装箱 (Integer.valueOf) 和拆箱 (i.intValue) 来完成, 基本类型之间允许低精度对象向高精度对象转化, 但是不能反过来, 例如short类型可以转换为int类型.
三、抽象类与接口的区别
相同点
两者都不能实例化 , 可以拥有抽象方法.
区别
-
用来定义抽象类的关键字是 abstract calss , 而接口定义的关键字是implement.
-
在属性上, 抽象类可以有静态变量, 常量和成员变量, 而接口只能有常量.
-
在抽象方法中可以有普通方法, 而在jdk1.8之前, 接口中只能存在抽象方法, 在1.8之后增加了静态方法和默认方法.
-
抽象方法可以有构造方法, 接口没有构造方法.
-
类与类之间只能单继承, 而接口之间可以多继承.
-
抽象类多用于在同类事物中有无法具体描述的方法的场景,而接口多用于不同类之间,定义不同类之间的通信规则.
四、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面试可能会遇到的问题.