Java基础面试题

Java基础面试题

1. 简述static 和 final的用法?

static:修饰属性、方法、跟代码块

修饰的属性也叫类变量时随着类的加载而加载,是属于类的不是属于对象,可以通过类名.来访问

修饰的方法都是静态方法,静态只能调用静态,非静态可以随意调用

修饰的代码块会随着类的加载而加载一般用于项目的初始化

final:修饰变量、方法、类

修饰的变量都是常量一旦被赋值不能发生改变

修饰的方法不能被重写

修饰的类不能被继承

2. 写出冒泡排序算法

public static void main(String[] args){
    int[] arr = {50,30,70,20,25}
    int t = 0;
    for(int i =0;i<arr.lenth-1;i++){//控制轮数
    	for(int j=0;j<arr.lenth-1-i;j++){//控制每一轮的次数
           if(arr[j] <  arr[j+1]){//每次都是和它下一个元素比
            t = arr[j];
           arr[j] = arr[j+1];
           arr[j+1] = t;
         }
       }
	}
  System.out.println(Arrays.toString(arr))
}

3. 抽象类和接口的区别

抽象类和接口都不能被实例化

抽象类中有构造方法,接口中没有构造方法

抽象类中有变量,接口中的变量都是常量

抽象类中的方法访问修饰符可以随便定义,接口中的方法访问修饰符都是public的

抽象类中可以有普通方法,接口中都是抽象方法

抽象类和类是继承关系只能单继承,接口和类是实现关系可以多继承多实现

抽象类中的抽象方法不能省略修饰符,接口中的方法可以省略不写默认都是public

4. 类有哪三个特性?各特性的优点?

类具有三个特性:封装性、继承性、多态性

封装性:隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式,可以提高代码的安全性,和复用性

继承性:是从已有类中派生出新的类,新的类可以使用父类中的所有方法,还可以进行功能的扩展,提高代码的可扩展性和重用性

多态性:是指一个实体类可以同时有多种形态,可以把子类对象当成父类来看,屏蔽不同子类对象之间的差异,统一调用标准、写出通用的代码

5. Error和Exception的区别?列出五个Exception并简要说明

Error:是程序不能处理的错处

Exception:是程序可以处理的异常,可以进行捕获或者抛出

常见的异常有:

NullPointerException:当操作一个空引用时会出现此异常

NumBerFormatException:数据格式转换异常出现问题时会出现此异常

ClassCastException:强制类型转换类型不匹配异常

ArratIndexOutOfBoundsException:数组下标越界异常,使用不存在数组下标会出现此异常

6. Java中存在内存泄露吗?

内存泄露是指内存中存在无用的内存,有时会造成内存不足或系统崩溃

Java中的内存泄露是指系统中存在垃圾回收器无法回收的对象,即使有内存泄露问题也不一定会表现出来,在实现堆栈数据结构时有时会出现内存泄露

7. 多线程有几种实现方式?同步有几种实现方法?

继承Thread类或者实现Runnable接口

实现同步也有两种方法:一种是同步方法、另一种是同步代码块

同步方法是再方法返回类型前面加上synchronized关键字

同步代码块是synchronized包裹的代码

8. sleep()和wait()的区别

sleep是Thread类的方法,释放没有释放锁

wait是Object的方法,释放了锁,使得其他线程可以使用同步代码块和同步方法

wait只能再同步控制块或者同步方法中使用

sleep必须捕获异常,wait不需要

9. 谈谈对面向对象的理解?

面向对象一种编程思想,通过这种思想可以把生活中复杂的问题变得简单化,可以从原来的执行者变为指挥者,面向对象是基于面向过程而言的

10. Java的跨平台原理

只需要在运行Java程序的操作系统上安装一个Java虚拟机(Jvm)由JVM来负责程序的运行,因为JVM是跨平台的就实现了Java的跨平台性

11. 有了基本数据类型为什么还要包装类型?

因为基本数据类型不具有对象的性质,为了让基本类型具有对象的性质,就出现了包装类型,包装类型就是把基本类型包装起来,使得它具有对象的性质,并为其添加方法和属性,丰富了基本类型的操作

12. == 和 equals的区别

==是比较两个变量的值是否相等

equals比较两个对象的内容是否相同

13. Java中的集合

Java中的集合分为List、Set、Map

List集合:元素有序、元素都有下标、元素可以重复

Set集合:元素无序、元素没有下标、元素不能重复

Map集合:是存储具有映射关系的数据,以键值对的方式进行存储,其中键不能重复

14. ArrayList和LinkedList的区别

ArrayList是实现了基于动态数组的结构

LinkedList是基于双向链表结构

ArrayList适合查询,因为数组是一段连续的内存空间,所以定位快

LinkedList适合增删,因为ArrayList要移动数据

15. HashMap和HashTable的区别

在Java2以前,是使用HashTable来存储键值对的,

为了使用Java的集合框架,之后对HashTable进行了重新设计保留了所以的方法

HashTable实现了Map接口,除了具有同步方法之外跟HashMap用法是相同的

16. 集合类中List、Map、Set的区别

List和Set都继承了Collertion接口,而Map不是

List存放的元素都是有序的可以重复

Set存放的元素都是无序的元素不可以重复

Map中是存放键值对的,键不能重复

17. Collection 和 Collections的区别

Collection是各种集合的父接口,List和Set继承了它

Collections是一个工具类提供了一系列的静态方法对各种集合进行、搜索、排序、线程安全化等操作

18. String、StringBuffer和StringBuilder区别

运行速度:StirngBuilder > StringBuffer > Stirng

StirngBuilder 线程不安全,StringBuffer 线程安全

String : 适合少量的字符串拼接

StirngBuilder : 适合在单线程下在字符缓冲区进行大量操作

StringBuffer : 适合在多线程下在字符缓冲区进行大量操作

19. 线程的实现方式?

继承Thread类、实现Runnable接口、实现Callable接口

继承Thread类:该子类应该重写run()方法,在run()方法中写相应的业务逻辑,扩展性低,因为继承之后不能再继承其他的类了

实现Runnable接口:编写run方法好处是,扩展性强,还可以继承其他的类更加灵活

实现Callable接口:如果想要在线程执行完后得到带有返回值的线程实现这个接口

20. Runnable和Callable的区别是

Callable规定的方法是call(),Runnable规定的是run()

Callable的任务执行完后有返回值,Callable的任务执行完后没有返回值

call方法可以抛出异常,run方法不可以

运行Callable任务可以拿到一个Future对象,表示异步计算的结果

21. 有没有使用过线程池

线程池解决了,经常创建和销毁、使用特别大的资源,比如在并发情况下,对性能影响很大,线程池就是提前创建好多个线程,放入到线程池种,使用时直接取,用完再放回去,可以提高代码的响应速度、降低资源的消耗

22. 静态变量和实例变量的区别

静态变量要加static修饰,实例变量不用

静态变量也叫类变量也可以说是全局变量,是随着类的加载而加载只会被加载一次存在方法区的静态区中,多个对象可以共享

实例变量是属于某个对象的属性,是对象私有的,对象创建以后才会被分配空间

23. try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后

会执行因为try{}中的return执行后再没有返回数据时先去执行finnally{}中的代码

然后再返回

24. 同步和异步的区别?

25. java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承, 请说出他们分别是哪些类

Java中的流分为两种:字节流、字符流

分别用四个抽象类来表示没有流包括输入和输出两种一共四个

InputStrea,OutputStream,Reader,Writer

26. &和&&的区别?

一个&没有短路功能不管第一个表达式是不是true都会向后执行

二个&&具有短路功能当第一个表达式为true时才会往后执行,不是true就不会执行

27. 数组中有没有length()这个方法?String中有没有length()这个方法?

数组中没有length()这个方法,但是有length这个属性代表数组的长度

String中有length()这个方法,用来获取字符串的长度

28 构造器Constructor是否可被Oberride?

构造器不能被继承,因此不能被重写,但是可以重载

29. 构造器是如何工作的?

1、分配对象内存空间,并将对象的变量初始化为0或者空

因为Java不允许操纵一个不定值的对象

2、执行属性的显式初始化

3、执行构造器

4、将变量关联到堆中的对象上

30. Super与this的区别

Super代表父类对象的引用

this代表本类对象的引用

31. GC是什么?为什么要有GC

GC是垃圾收集器,因为系统内存中会存在无用的内存,垃圾回收可以有效的防止内存泄露问题

32. 接口是否可以继承接口?抽象类是否可以实现接口?抽象类可以继承实体类吗?

接口可以继承接口因为接口可以多继承多实现,抽象类可以实现接口,抽象类可以继承实体类必须要有明确的构造函数

33. 内部类可以引用他包含类的成员吗?有没有什么限制?

完全可以,如果不是静态内部类,没什么限制

如果把静态嵌套类当作内部类的一种特例,在这种情况下不可以访问外部类的普通成员变量只能访问外部类中的静态成员

34. Java中有没有goto

goto是Java中的保留字,在目前版本的Java中没有被使用

35. 解释内存中的栈、堆、和静态区的用法

基本类型的变量,一个对象的引用,都保存在栈中

而通过new关键字和构造器创建的对象放在堆中

静态区是存储常量的和静态变量的

36. Java中如何跳出多层嵌套循环?

在最外层加一个break关键字

37. 两个对象值相同,但却有不同的hash code,这句话对不对

如果两个对象相同equals方法返回true,那么他们的hashCode值一定要相同

如果两个对象的hashCode相同,他们并不一定相同

38. char类型变量可以存储一个中文汉字吗,为什么?

char可以存储中文汉字,因为Java中使用的编码是Unicode码表,一个char类型占

2个字节所有存一个汉字是没问题的

39. 匿名内部类是否可以继承其他类?是否可以继承接口?

可以继承其他类或实现其他接口。

40. 内部类可以引用它的包含类的成员吗?有没有什么限制?

一个内部类对象可以访问创建它的外部类独享的成员,包含私有成员

41. 简述finnal、finally、finnalize的区别?

finnal:可以修饰变量、方法、类,修饰的变量都是常量、修饰的方法不能被重写、修饰的类不能不被继承

finnally: 通常放在try…cache…的后面构造总是执行代码块,不管发生异常还是正常运行都会被执行

finnalize: Object类中定义的方法,这个方法是由垃圾收集器在销毁对象之前调用

42. 简述ArrayList、Vector、LinkedList的存储性能和特性

ArrayList和Vector都是使用动态数组的方式来存储数据,但是插入要涉及数组元素移动等内存操作,所以索引数据块而插入数据慢

Vector中的方法由于添加了synchronized修饰,因此Vector是线程安全的容器

但是性能差

LinkedList使用的是双向链表实现存储,按序号索引数据需要进行前向和后向遍历,但是插入数据时只需要记录本想的前后项即可所以插入数据较快

43. Lsit、Map、Set三个接口存储数据时,各有什么优点?

List以特定索引来存储元素,可以有重复的元素

Set不能存放重复的元素(用对象的equals方法来区分元素是否已经重复)

Map保存键值对映射,映射关系可以是一对一,或多对一。

Set和Map容器都有基于haxi存储和排序树的两种实现版本

44. 当一个线程进入一个对象的synchronized方法A之后,其它线程是否可以进入此对象的同步方法

不能,其它线程只能访问该对象的非同步方法,同步方法则不能进入。因为非静态方法上的synchronized修饰符要求执行方法时要获取对象的锁。

45. 说出线程同步以及线程调度的相关方法

wait():使一个线程处于等待阻塞状态,并且释放所有持有的对象的锁

sleep():是一个正在进行的线程处于睡眠状态,是一个静态方法,调用此此方法需要捕获异常

notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,由JVM确定唤醒哪一个线程

notityAll(): 唤醒所有等待状态的线程

46. Java中如何实现序列化,有什么意义?

序列化就是一种处理对象流的机制,所谓对象流就是将对象的内容进行流化。

可以对流化后的独享进行读写操作。

需要实现Serializable接口

47. 如何通过反射来创建对象?

通过类对象调用newInstance()方法

通过类对象的getConstrytor()获取构造器

48. 谈谈JVM的内存结构和内存分配?

Java内存模型

Java虚拟机大致管辖三个逻辑部分:方法区、Java栈、Java堆

方法区是静态分配的,编译器将变量绑定在某个存储位置上,而且这些绑定不会在运行时改变,常量池,常量,String常量和static 变量都保存在方法区

Java栈是一个逻辑概念,特点是先进后出,一个栈的空间可能是连续的,也可能是不连续的

Java堆分配意味着以随意的顺序在运行时及逆行存储空间分配和回收的内存管理模型

Java内存分配

  • 基本数据类型在栈空间分配

  • 方法的形参,直接在栈空间分配,当方法调用完成后从栈空间回收

  • 引用数据类型,需要用new来创建,即在栈空间分配一个地址空间的对象区,当方法调用完成后从栈空间回收

  • 4、方法的引用参数,在栈空间分配一个地址空间,并指向堆空间的对象区,当方法调用完后从栈空间回收;

    5、局部变量 new 出来时,在栈空间和堆空间中分配空间,当局部变量生命周期结束后,栈空间立刻被回收,堆空间区域等待 GC 回收;

    6、方法调用时传入的实际参数,先在栈空间分配,在方法调用完成后从栈空间释放;

    7、字符串常量在 DATA 区域分配 , this 在堆空间分配;

    8、数组既在栈空间分配数组名称, 又在堆空间分配数组实际的大小。

49. 什么是双亲委派机制

如果一个类收到了类的加载请求,他不会自己去加载,而是把这个请求交给父类的加载器去执行,如果父类的加载器还包含父类,就依次递归向上提取,请求最终到达顶层启动类加载器,如果父类加载器完成类的加载任务,就直接返回,如果完不成,子类就会尝试自己加载

50. Instanceof 有什么作用?

Instanceof 的作用是判断一个引用类型的变量所指向的对象是否是一个类的实例

51. 什么是不可变类

不可变类就是,当创建了这个类的实例,在整个生命周期,就不允许修改它的值了

52. 值传递和值引用

值传递就是在方法调用时,实参会把值传给形参,形参就会利用实参的值创建一块临时的存储单元,虽然形参和实参有着相同的值,但是他们却有着不同的存储单元所以改变形参的值实参不会发生改变

值引用就是传递的是对象,实参和形参会被分配在同一块存储单元,因此改变形参的值实参会发生改变

53. 强制类型转换有哪些注意事项?

Java在涉及byte、short、char类型运算时,首先会把这些变量的类型转换为int类型计算得到的结果也是int

54. ++i和i++的区别

++i是加后用,i++是先用后加

55. 字符串的存储机制是什么?

字符串会存储在常量池中,在给字符串赋值的时候,JVM会先去常量池中检查是否有该字符串,如果有则直接引用,如果没有会先创建然后再引用该字符串

56. 开闭原则OCP

开放功能的扩展,关闭源码的修改

他是Java中最基础的设计原则

开闭原则:软件中的对象应该对外扩展是开放的,但是对于修改是封闭的,开闭原则是一种设计模式,随着面向对象程序设计的思想,应运生

开,指的是可以在源码不修改的基础上进行扩展

闭:值不允许对源码进行修改,以免影响其它功能

57. 重载和重写的区别?

重载和重写都是实现多态性的方式

重载是实现编译时的多态性,是指在一个类中可以有多个同名方法,但是却有着不同的参数列表,参数的个数也不同

重写是实现编译时的多态性,重写是发生在父子类之间,子类定义的方法必须跟父类的方法具有相同的名字,相同的参数,相同的返回值

58. 自动装箱和自动拆箱

自动装箱:把基本类型包装成类对象

自动拆箱:把包装对象中,自动取出基本类型

59. BIO、NIO、AIO的区别?

BIO:阻塞IO,它基于流模型实现的,交互方式是同步阻塞方式,在读写完成之前,线程会一直阻塞,缺点是效率和扩展性低

NIO:非阻塞IO,提供了新的抽象,可以构建多路复用的、同步非阻塞IO程序

AIO:异步IO,是NIO升级版本,提供了非异步非阻塞的IO操作方式

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值