java基础面试题

java基础面试题

java基础

java语言的特性----封装,继承,多态,抽象

封装:把描述对象的属性和方法封装在一个模块中,私有属性,共有方法

继承:子类继承父类,可以拥有自己的方法。提高软件的可重用性和可扩展性
----只能单继承,为了提高代码的复用性,子类可以使用super调用父类方法,super()调用父类构造方法,在继承中代码执行的先后顺序—先静态再非静态,先父类再子类,先方法再属性,先普通再构造。(this调用本类的普通方法,this()调用本类构造方法,静态方法直接调用)
----两小一大原则:子类返回值类型要小,异常类型要小,访问权限要大

多态:同一种事务的不同表现形式----重载(静态多分配)/重写(动态单分配)

抽象:就是忽略与主题不相关的部分,以便更好的关注与主题相关的部分
----抽象类必须被abstract关键字修饰,不能被实例化,可以被继承,但要实现父类的所有抽象方法,除非子类也是抽象类,可以有普通方法,抽象方法不能是私有的,没有方法体且不能被重写。

String,StringBuffer,StringBuilder的区别

String:是final类,不能重写与继承,长度不可变,线程安全
常量池概念-----String str1=new String(“qwe”);
--------------------在栈中形成一个特殊的变量,该变量的值等于堆中创建对象的地址,可以通过访问这个特殊的引用变量访问堆中的对象。

StringBuffer:长度可变,底层是一个数组,是线程安全的
StringBuilder:非线程同步的,不安全的

静态变量与实例变量的区别

  1. 是否有static关键字标识
  2. 静态变量属于类,在类被加载的时候进行创建,实例变量属于某一个对象,只有该对象别创建的时候才能进行调用。

接口

  1. 特殊的抽象类
  2. 对与类只能实现不能继承
  3. 对于接口可以多继承,但只能是接口
  4. 接口中的属性默认都是public static final的
  5. 接口中的方法默认是 public abstract的,没有静态方法

集合

collection接口-----Set接口和List接口

List

ArrayList-------底层是一个动态数组,地址连续,方便查询(Vector—线程安全,效率低,如果定义为Object类型,可以保存任意类型的数据)
LinkedList-----底层是一个双向链表,便于增删改

Set

HashSet------底层是hashmap,无序,唯一,可以为null,值存储在key中
TreeSet------底层是二叉树,有序唯一,输入的元素是可排序的且不能为null
set怎么确定它的唯一性:通过set机制-------在存入一个对象的时候,通过hashcode方法获取hashcode值,决定该对象在hashset的位置(索引),即使equals返回为true

map

HashMap:是HashTable的轻量级实现,非线程安全的,底层由数组加链表实现,对于每一个key都通过唯一的hashcode值来决定值的位置进行排序
TreeMap:底层是二叉树

java的反射机制

在运行状态中,对于任意一个对象,都可以调用它的任意一个方法和属性,对于任意有一个类,都可以知道该类的所有方法和属性;这种可以动态获取信息和动态调用对象的方法的功能成为反射

线程

线程的周期:创建,就绪,执行,阻塞,死亡

守护线程:isDaemon()判断一个线程是否为守护线程;setDaemon设置一个线程为守护线程;其不能单独存在,必须依赖某一个线程,当程序中只剩下守护线程时,JVM虚拟机自动退出

线程结束的方法:stop,打断interrupt,设置标记位

线程同步:synchronized关键字修饰

线程池的作用:减少线程创建和销毁的次数,便于多次使用。

sleep与wait的区别:sleep属于Thread的方法,休眠的线程一直处于监听的状态下,不会释放对象锁;wait属于Object的方法,会释放对象锁,必须发出notify方法,才会进入锁定池,准备获得对象锁进入运行状态

JVM

什么是java虚拟机

一个可以将java源程序进行编译,并解释为当前平台或系统所识别的机器码的软件,以此来实现java的跨平台性;由程序计数器(一个较小的内存区域,用来指示当前的线程执行的字节码到了第几行),方法区(用来存储JVM加载的类信息,常量,静态变量),虚拟机栈(描述java方法执行的内存模型,用于存储局部变量,方法信息等),本地栈,编译器(编译为字节码文件),解释器(将字节码文件编译为特定的机器码)构成;
------大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack ( 本地方法栈 ),其中Method Area 和 Heap 是线程共享的 ,VM Stack,Native Method Stack 和Program Counter Register 是非线程共享的

JVM的运行机制

每个java源程序都会运行在自己的 JVM上,并告知JVM程序的入口,然后将指定的java源文件通过编译器编译为字节码文件(即.class文件),再通过java虚拟机的解释器,按照字节码指令集编译成特定机器识别的机器码,在JVM初始化的时候就会分配好方法区和堆,每遇到一个线程就分配一个程序计数器,虚拟机栈和本地方法栈,线程结束后释放空间,java程序结束后释放方法区与堆的内存;只要根据JVM规格描述,将解释器移植到特定的计算机上,就能保证经过编译的任何java代码能够在该系统上运行

JVM加载class文件的原理机制(类的加载)

创建一个字节数组读入class文件,然后产生与加载类对应的class对象,类被加载后进行验证,准备,解析,为静态变量分配内存并设置初始值,将符号引用替换为直接引用,最后进行初始化。

GC(系统垃圾回收)

只发生在线程共享区—大部分发生在堆中,整个java的垃圾回收是年轻带与年老带的协作,称为分代回收。一般发生在java程序结束的时候,也可以主动执行特定的方法进行回收

java把堆内存分为持久带(用于存放静态资源,如类,方法等),年轻带(存放对象或数组),老年带;在年轻带中经过多次回收仍然存活的对象会复制到年老带;
年轻带的垃圾回收称为youngGC----采用复制算法(一个区域分为A和B,初始对象在A,长期存活的对象复制到B)
老年带的垃圾回收称为Full GC------采用标记整理算法(在一个区域内,标记可达对象,回收不可达对象,会出现碎片并整理,以存放更大的对象)
CMS-------标记清理算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值