常见面试题(javase)
Posted luojie1216
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常见面试题(javase)相关的知识,希望对你有一定的参考价值。
原文:https://blog.csdn.net/qq_39498603/article/details/83536639
1.请说出ArrayList、Vector、LinkedList的存储性能和特性。
ArrayList底层 数组结构,线程不安全 线程异步 效率高 查找快 增加删除慢
Vector、底层数组结构 线程同步 线程安全 效率低 存储的是键值对
LinkedList :底层双向链表结构 查找慢 增加删除快 线程异步,不安全,效率高
2.数组有没有length()这个方法?String有没有length()这个方法?
数组没有length()这个方法 但是 有length属性
String 有length()方法
集合的长度 size()
3.List、Set、Map是否继承自Collection接口?
List set 集合继承了collection接口
Map 不继承 Map本身就是一个顶层接口
4.HashMap和HashTable的区别。
都是map接口的实现类
Hashmap:可以存放null值,是线程不安全的类 线程异步 基于hash表
Hashtable:不可以存放null值 是线程安全的类 线程同步
5.List<T>与List的区别?
一个是泛型,一个是Object,后者还可能要类型转换,容易出错。
Java中的泛型是个假泛型,仅仅只是在编译器那边做了语法检查而已,和C#里的泛型不一
样的。
基本上,不管你在List<>里面写什么类型,编译通过了以后运行时全部都是Object。
Java泛型是通过类型擦除实现的,编译器的语法检查是次要的。
重要的是泛型系统可以为做更多的类型检查,借助编译器在编译期的类型检查可以减少运行
时出现类型错误的几率。
6.列出一些你常见的运行时异常。
{1.nullpoionterexception (空指针异常)
2.numberformatexception (数字格式化异常)
3. indexoutofboundsexception(数组下标越界)
7.String和StringBuffer的区别
String 是长度不可变,一旦内容创建好,不可以更改
Stringbuffer 是长度可变的,内容可变 线程安全 实际采用的字符数组的形式存储的,当长度变了的时候,实际是将它原有的内容复制到一个新的字符数组中,再加上增加的
8.请说明Java为什么能够跨平台
{因为jvm,jre包含jvm,jdk包含jre,java语言是跨平台的而jvm不是跨平台的}
9.请简述Java的垃圾回收机制
垃圾回收由java虚拟机自动执行,不能人为的干预,System在空闲的时候会自动执行垃圾回收机制,可以通过gc方法建议执行垃圾回收,但不能确定什么时候会执行回收}
10.请分别说明public、private、static、final修饰符的含义。
{public可以修饰类、方法以及属性;private可以修饰属性、方法; Static可以修饰方法、属性,被static修饰的属性或方法随着类的加载而加载; Final可以修饰类,属性、方法,被final修饰的类不可被继承,方法不可被重写,属性 只能被赋值一次,为常量
11.请列举Java中继承了List接口的类,并说明它们的不同。
继承了list接口的类:有ArrayList:数组结构,线程不安全,增加删除慢,查询快
Linkedlist: 双向链表结构,线程不安全,增加删除快,查询慢
Vector:数组结构 线程安全 增加删除慢,查询快
12.请说明异常处理中try/catch/finally语句块的作用。并且,请阐述通过ErrorCode返回错误和抛出异常的区别。
try中放可能出现异常的代码块,catch用来异常捕获,finally一般用于一些资源关闭 和释放工作。 返回错误其异常代码下边的代码还可继续执行,而抛出异常后其后的代码不会被执行 }
13.请解释何为继承,并通过一小段代码说明继承的意义。
Public class Pet {
public String name;
public Int age;
public String toString() {
return "Pet [name=" + name + ", age=" + age + "]"; }}
Public class
Dog extends Pet {}
Public class Test {
Public static void main(String[] args) {
Dog dog = new Dog();
dog.age = 10; dog.name = "狗蛋儿";
System.out.println(dog.toString());}}
14.请简述接口和抽象类的区别,并说明接口在实际开发项目中的意义。
接口中只能有抽象方法,抽象类中可以有普通方法
2.接口中只能有静态常量,抽象类中可以有变量和常量
3. 类与类:单继承 类与接口:多实现 接口与接口:多继承
4.接口“like a” 抽象类“is a”
15. 请简述对面向过程、面向对象、面向函数的理解。
{面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,
使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成,一个步
骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。}
16.请说明synchronized关键字的作用,在什么情况下使用它?
{线程同步的时候使用,可以解决安全问题 修饰同步代码块或同步方法,保证安全性}
17.类的加载过程?
{1、首先加载要创建对象的类及其直接与间接父类。
2、在类被加载的同时会将静态成员进行加载,主要包括静态成员变量的初始化,静态
语句块的执行,在加载时按代码的先后顺序进行。
3、需要的类加载完成后,开始创建对象,首先会加载非静态的成员,主要包括非静态
成员变量的初始化,非静态语句块的执行,在加载时按代码的先后顺序进行。
4、最后执行构造器,构造器执行完毕,对象生成。}
18.简单介绍你所了解的Java,它的特点和优势是什么,分几个体系?
{开源、面向对象、分布式处理、可移植性、安全性、高性能、健壮性、跨平台性
1.javase 2.javaee 3.javame}
19.你所知道的集合类有哪些,主要方法是什么?
{最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 、 Vector、
Linkedlist,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素
列表。ArrayList 、 Vector适用于按数值索引访问元素的情形,LinkedList适用于增
删元素。 ArrayList、LinkedList线程异步,不安全,效率高,Vector线程同步,安全,
效率低。
Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作”
键”和”值”),其中每个键映射到一个值。}
20.sleep()和wait()有什么区别?
{sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行
机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu
的执行时间。
因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块
中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依
然无法访问这个对象。
wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象
相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,
notifyAll方法来唤醒等待的线程
21.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
java虚拟机是执行字节码文件(.class)的虚拟机进程。 因为不同的平台装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码。正是因为有JVM的存在,java被称为平台无关的编程语言。
22.JDK和JRE的区别是什么?
jdK 是Java工具包
Jre 是Java 运行环境
JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。 JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。 如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。 JRE根据不同操作系统(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本,最常用的是Oracle公司收购SUN公司的JRE版本。如果你想查看更官方的解释,可以前往Oracle官网。
23.String、StringBuffer、StringBuilder之间区别。
String 是长度不可变的 内容一旦创建 不可以更改
Stringbuilder是长度可变的 内容可变的 线程不安全的
Stringbuffe是长度可变的 内容可变的 线程安全的 实际是以字符数组的形式存储的,更改的时候 是创建一个新的数组 将原来的内容复制到新的数组中
简要的说,String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
以上是关于常见面试题(javase)的主要内容,如果未能解决你的问题,请参考以下文章