4.7面试题
面试题
文章目录
- 面试题
-
- JDK、JRE、JVM的区别:
- java的8种基本数据类型是什么?(简述java的8种基本数据类型)
- switch可以作用于哪些数据类型上?
- 抽象类和接口的区别:
- 重写(overriding)与重载(overloading)的区别:
- 实例变量与静态变量的区别:
- String s = new String("hello"); 创建了几个对象?
- String常用的方法有哪些?
- `ArrayList`和`LinkedList`的区别:
- Collection和Collections的区别:
- 函数式接口?
- java是值传递还是引用传递?
- String、StringBuilder、StringBuffer的区别:
- List、Set、Map的区别:
- 补充:
-
- 重载的特殊形式:
- 值传递:
JDK、JRE、JVM的区别:
- JDK:java开发工具包,是java的核心,包括:JRE+编译、运行等命令工具
- JRE:java运行环境,是运行java程序所必须的环境集合,包括:JVM+java系统类库
- JVM:java虚拟机,是java实现跨平台的最核心部分,能够运行java语言所开发的程序
java的8种基本数据类型是什么?(简述java的8种基本数据类型)
8种基本数据类型包括:byte、short、int、long、float、double、boolean、char
- byte:字节型,用于存储整数的,占用1个字节,范围-128到127
- short:短整型,用于存储整数的,占用2个字节,范围-32768到32767
- int:最常用的整型,用于存储整数的,占用4个字节,范围-231到231-1
- long:长整型,用于存储较大的整数的,占用8个字节,范围-263到263-1
- float:单精度浮点型,用于存储小数的,占用 4个字节,不能表示精确的值
- double:双精度浮点型,最常用的存储小数的类型,占用8个字节,不能表示精确的值
- boolean:布尔型,用于存储true或false,占用1个字节
- char:字符型,采用Unicode字符编码格式,用于存储单个字符,占用2个字节
switch可以作用于哪些数据类型上?
只能作用于byte、short、int、char、String、枚举上,其它类型都不允许
抽象类和接口的区别:
-
抽象类:
- 由abstract修饰
- 可以包含变量、常量、构造方法、普通方法、静态方法、抽象方法
- 派生类通过extends继承
- 只能继承一个(单一继承)
- 抽象类中的成员,任何访问权限都可以
-
接口:
- 由interface定义
- 可以包含抽象方法、常量、静态方法(jdk1.8后)、默认方法(jdk1.8后)
- 实现类通过implements实现
- 可以实现多个(多实现)
- 接口中的成员,访问权限只能是public
重写(overriding)与重载(overloading)的区别:
- 重写:发生在父子类中,方法名相同,参数列表相同
- 重载:发生在同一类中,方法名相同,参数列表不同
实例变量与静态变量的区别:
- 实例变量和静态变量都属于成员变量
- 实例变量:是属于对象的,在创建对象时存储在内存堆中,创建多少个对象,则实例变量就会在内存中存在多少份,需要通过引用变量来访问
- 静态变量:是属于类的,在类被加载是存储在内存方法区中,无论创建多少个对象,静态变量在内存中都只有一份,常常通过类名点来访问
String s = new String(“hello”); 创建了几个对象?
两个。一个是hello字面量对象,另一个是new出来的对象
String常用的方法有哪些?
- length():获取字符串的长度(字符个数)
- trim():去除两边的空白字符
- toUpperCase()/toLowerCase():将英文部分给转换为全大写字母/全小写字母
- startsWith()/endsWith():判断是否是以???开始/结束的
- charAt():根据下标找字符
- indexOf()/lastIndexOf():查找字符串第一次出现/最后一次出现的下标
- substring():截取字符串
- 静态方法valueOf():将其它类型的数据转换为字符串
- matches():验证匹配(正则表达式)
- replaceAll():替换(正则表达式)
- split():拆分(正则表达式)
ArrayList
和LinkedList
的区别:
ArrayList
是基于数组实现的,容量不够时采用复制方式扩容,而LinkedList
使用链表实现ArrayList
比LinkedList
在随机访问的时候效率要高,因为ArrayList
通过下标直接找到物理地址查询,性能好。LinkedList
是链表结构,需要依次查找元素,性能不高。LinkedList
首尾增删具备很高的效率,而ArrayList
的增删性能稍差。
综合来讲:需要频率读取集合中的元素时,更推荐使用ArrayList
,而在头尾增删操作较多时,更推荐使用LinkedList
。ArrayList
综合性能优秀,应优选。
Collection和Collections的区别:
- Collection是一个集合接口,是所有集合类的一个顶级接口,它里面定义了所有集合通用的方法,List 和 Set 直接继承了Collection接口。
- Collections是集合的一个工具类,其中提供了一系列静态方法,用于对集合中的元素进行排序、反转、搜索以及线程安全等操作。
函数式接口?
- 是指仅仅只包含一个必须被实现类重写的方法
- 但可以有多个非抽象方法(默认方法、静态方法)的接口。
java是值传递还是引用传递?
在java中,无论是基本类型还是引用类型,都是值传递
- 对于基本类型而言,传递的是具体的值的副本
- 对于引用类型而言,传递的是具体的地址的副本
String、StringBuilder、StringBuffer的区别:
-
String 类型和 StringBuffer 的主要性能区别:String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
-
使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。
-
在某些特别情况下, String 对象的字符串拼接其实是被 Java Compiler 编译成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,
-
在大部分情况下,StringBuilder > StringBuffer。这主要是由于前者不需要考虑线程安全。
List、Set、Map的区别:
List
:线性表,有序可以重复的集合,元素有先后次序,可以按照位置访问元素,可以存储nullSet
:元素不重复集合,重复元素算⼀个,不保证元素的先后次序,可以存储⼀个nullMap
:元素按照key:value
成对存储,可以按照key
查找value
,查找性能好,key
不可以重复,可以存储一个 null key
补充:
重载的特殊形式:
class Aoo{void show(){}
}
class Boo extends Aoo{ //在Boo类中发生了show()方法的重载void show(String name){ }
}
值传递:
- 基本类型间的值传递:——传递的是值
int a = 5;
int b = a; //将a的值(5)的副本赋值给b了,意味着b和a的值是相同的
- 引用类型间的值传递:——传递的是地址值
Student zs = new Student();
Student zss = zs; //将zs的值(地址)的副本赋值给zss了,意味着zs和ls指向了同一个对象