java基础面试知识点.docx
《java基础面试知识点.docx》由会员分享,可在线阅读,更多相关《java基础面试知识点.docx(8页珍藏版)》请在冰豆网上搜索。
java基础面试知识点
java基础面试知识点
java中==和equals和hashCode的区别
int、char、long各占多少字节数
byte1字节最小值是-128(-2八7);最大值是127(2八7-1);
boolean至少1字节这种类型只作为一种标志来记录true/false情况;
short2字节最小值是-32768(-2X5);最大值是32767(2X5-1);
char2字节最小值是\u0000(即为0);最大值是?
(即为65,535);
int4字节最小值是-2,147,483,648(-2^31);最大值是
2,147,483,647(2^31-1);
float4字节单精度浮点数字长32位,尾数长度23,指数长度8,指数偏移
量127;
long8字节最小值是-9,223,372,036,854,775,808(-2^63);
最大值是9,223,372,036,854,775,807(2^63-1);
double8字节双精度浮点数字长64位,尾数长度52,指数长度11,指
数偏移量1023;
英文字母字节数:
1;编码GB2312
字节数:
1;编码GBK
字节数:
1;编码ISO-8859-1
字节数:
1;编码UTF-8
中文汉字字节数:
2;编码GB2312
字节数:
2;编码GBK
字节数:
1;编码ISO-8859-1
字节数:
3;编码UTF-8
int与integer的区别
Ingeter是int的包装类,int的初值为0,Ingeter的初值为null;
初始化的时候,inti=1;Integeri=newInteger
(1);(要把integer当做一个
类看);但由于有了自动装箱和拆箱使得对Integer类也可使用Integeri=1;
int是基本数据类型(面向过程留下的痕迹,不过是对java的有益补充),Integer是一个类,是int的扩展,定义了很多的转换方法
Integer是对象,用一个引用指向这个对象,而int是基本类型,直接存储数值。
对java多态的理解
多态继承父类的子类重写父类的某个方法,不同的子类调运同一个方法可以,产生不同的结果。
多态的三个必要条件:
继承父类
重写父类的方法
父类的引用指向子类对象
面向对象的三大特性封装、继承、多态。
从某种程度来看,封装、继承就是为了多态准备的,也是最重要的知识点。
实现多态的技术动态绑定,是指在执行期间,根据引用对象实际指向的对象,来执行对应的方法。
多态的作用消除类型之间的耦合关系。
多态的好处
可替换行多态对已存在的代码有可替换性(重写);
扩展性多态对代码具有扩展性;
接口性多态是父类通过方法签名,为子类提供的共同接口,由子类去完善或
灵活性它在应用中体现了灵活多样的操作,提高了使用效率
简化性。
Java中多态的实现方式实现接口,继承父类进行方法重写,同一个类中进行方法的重载。
什么是内部类?
内部类的作用
定义将一个类定义在一个类或者一个方法里面,这样的类称着内部类
内部类的种类有4种
1、成员内部类
2、静态内部类静态内部类就是在成员内部类多加了一个static关键字。
3、匿名内部类
4、局部内部类
内部类的作用
1、内部类可以很好的实现隐藏
非内部类是不可以使用private和protected修饰的,但是内部类却可以,从而达到隐藏的作用。
同时也可以将一定逻辑关系的类组织在一起,增强可读性。
2、间接的实现多继承。
每个内部类都能独立地继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。
所以说内部类间接的实现了多继承。
抽象类和接口区别?
抽象类
1:
有abstract修饰的class,绝对就是抽象类。
2:
抽象类中可以有抽象方法,也可以没有抽象方法,但是有抽象方法的class,就一定会是抽象类。
3:
抽象类是不能创建实例对象的。
4:
如果有子类继承这个抽象类,则必须要实现父类中的抽象方法,如果不实现的话,则这个字类也必须定义为抽象类。
接口
1:
接口只能实现不能够继承,比如,一个类可以实现多个接口,但是只能继承一个父类,也可以这样理解,一个类可以有多个干爹(实现接口),但是只能有一个亲爹(继承父类)。
2:
如果要实现这个接口,则该接口中的方法必须要实现。
因为我们定义接口中的方法时,系统是默认这些方法是抽象的方法,也就是说这些方法是有publicabstract这个来修饰的。
3:
在接口中定义的变量必须是全局变量的,也就是说有publicstaticfinal修饰的
抽象类的意义
抽象类与接口的应用场景
抽象类是否可以没有方法和属性?
泛型中extends和super的区别
和是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念
是指“上界通配符(UpperBoundsWildcards)”
是指“下界通配符(LowerBoundsWildcards)”
父类的静态方法能否被子类重写?
先给一个答案,不能,父类的静态方法能够被子类继承,但是不能够被子类重写,即使子类中的静态方法与父类中的静态方法完全一样,也是两个完全不同的方法。
重写指的是根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型。
对于静态方法和静态变量来说,虽然在上述代码中使用对象来进行调用,但是底层上还是使用父类来调用的,静态变量和静态方法在编译的时候就将其与类绑定在一起。
既然它们在编译的时候就决定了调用的方法、变量,那就和重写没有关系了。
静态属性和静态方法是否可以被继承
可以被继承,如果子类中有相同的静态方法和静态变量,那么父类的方法以
及变量就会被覆盖。
要想调用就就必须使用父类来调用。
从上述代码可以看出,子类中覆盖了父类的静态方法的话,调用的是子类的
方法,这个时候要是还想调用父类的静态方法,应该是用父类直接调用。
如果子
类没有覆盖,则调用的是父类的方法。
静态变量与此相似。
进程和线程的区别?
进程
是系统进行资源分配的独立单元
1
设计思想为了允许多个程序同时在内存中运行
特点进程是程序的一次执行过程。
若程序执行两次甚至多次,则需要两个甚
至多个进程。
进程是是正在运行程序的抽象。
它代表运行的CPU,也称进程是对CPU的
抽象。
(虚拟技术的支持,将一个CPU变幻为多个虚拟的CPU)
系统资源(如内存、文件)以进程为单位分配
操作系统为每个进程分配了独立的地址空间
操作系统通过“调度”把控制权交给进程。
线程
cpu调度的基本单元
1
设计思想
在一个进程内也需要并行执行多个程序,实现不同的功能。
进程切换的代价、开销比较大;
在进程内创建、终止线程比创建、终止进程要快。
同一进程内的线程间切换比进程间的切换要快,尤其是用户级线程间的切换。
线程之间相互通信无须通过内核(同一进程内的线程共享内存和文件)
final,finally,finalize的区别
序列化的方式?
Serializable和Parcelable的区别?
哪些情况下的对象会被垃圾回收机制处理掉?
静态代理和动态代理的区别,什么场景使用?
静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。
静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只
有在运行时才知道。
动态代理是实现JDK里的InvocationHandler接口的invoke方法,但
注意的是代理的是接口,也就是你的业务类必须要实现接口,通过Proxy里的
newProxyInstance得到代理对象。
Java的异常体系
Java把异常作为一种类,当做对象来处理。
所有异常类的基类是Throwable类,两大子类分别是Error和Exception。
系统错误由Java虚拟机抛出,用Error类表示。
Error类描述的是内部系统错误,例如Java虚拟机崩溃。
这种情况仅凭程序自身是无法处理的,在程序中也不会对Error异常进行捕捉和抛出。
异常(Exception)又分为RuntimeException(运行时异常)和CheckedException(检查时异常),两者区别如下
RuntimeException程序运行过程中才可能发生的异常。
一般为代码的逻辑错误。
例如类型错误转换,数组下标访问越界,空指针异常、找不到指定类等等。
CheckedException编译期间可以检查到的异常,必须显式的进行处理(捕获或者抛出到上一层)。
例如IOException,FileNotFoundException等等。
谈谈你对解析与分派的认识。
方法在程序真正运行之前就有一个可以确定的调用版本,并且这个方法的调用版本在运行期是不可改变的,即“编译期可知,运行期不可变”,这类目标的方法的调用称为解析(Resolve)。
静态分派
静态分派只会涉及重载(Oveload),而重载是在编译期间确定的,那么静态分派自然是一个静态的过程(因为还没有涉及到Java虚拟机)。
静态分派的最直接的解释是在重载的时候是通过参数的静态类型而不是实际类型作为判断依据的。
因此在编译阶段,Javac编译器会根据参数的静态类型决定使用哪个重载版本。
动态分派
动态分派的一个最直接的例子是重写(Override)。
对于重写,我们已经很熟悉了,那么Java虚拟机是如何在程序运行期间确定方法的执行版本的呢?
Java中实现多态的机制是什么?
靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
如何将一个Java对象序列化到文件里?
将对象序列化到文件
对象需要实现Seralizable接口
通过ObjectOutputStream的writeObject()方法写入和
ObjectInputStream的readObject()方法来进行读取
//存进去
Java反射的理解
简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息。
如果知道一个类的名称或者它的一个实例对象,就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符,类型,方法参数等等所有信息)找出来。
如果明确知道这个类里的某个方法名+参数个数类型,还能通过传递参数来运行那个类里的那个方法,这就是反射。
Java注解的理解
定义注解(Annotation),也叫元数据。
一种代码级别的说明。
它是JDK5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。
它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注
元注解
元注解的作用就是负责注解其他注解。
Java0定义了4个标准的
meta-annotation类型,它们被用来提供对其它annotation类型作说明。
JavaO
定义的元注解
@Target,
@Retention,
@Documented,
@Inherited
说说你对依赖注入的理解
这也就说明了为啥要依赖注入,因为可以解耦
依赖注入主要作用依赖注入能够让相互协作的软件组件保持松散耦合
泛型原理,并举例说明
Java的泛型是伪泛型。
在编译期间,所有的泛型信息都会被擦除掉。
Java中的泛型基本上都是在编译器这个层次来实现的。
在生成的Java字节码中是不包含泛型中的类型信息的。
使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。
这个过程就称为类型擦除。
Java中String的了解
一、String是不可变对象
java.lang.String类使用了final修饰,不能被继承。
Java程序中的所有字面值,即双引号括起的字符串,如如"abc",都是作为String类的实例实现的。
String是常量,其对象一旦构造就不能再被改变。
换句话说,String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创造了一个全新的String对象,以包含修改后的字符串内容。
而最初的String对象则丝毫未动。
String对象具有只读特性,指向它的任何引用都不可能改变它的值,因此,也不会对其他的引用有什么影响。
、String常量池
常量池(constantpool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。
它包括了关于类、方法、接口等中的常量,也包括字符串常量。
Java为了提高性能,静态字符串(字面量/常量/常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串。
对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果常量池中存在即返回该对象。
三、String、StringBuffer和StringBuilder的区别
对象的可变与不可变
String类中使用字符数组来保存数据,因为有“final”修饰符,所以string对象是不可变的。
如下
privatefinalcharvalue[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存数据,这两种对象都是可变的。
如下
char[]value;
是否是线程安全
String中的对象是不可变的,也就可以理解为常量,所以是线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
看如下源码
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
五、String的匹配相等问题
使用String类经常需要对两个字符串进行对比,看是否相等。
有==和equals两种选择,这两者方法区别很大
比对象的内容是否相等使用equals(),比较两个引用是否指向同一个对象时用==;equals()是看内容是否相等,比较好理解。
而==是看是否属于同一个对象。
首先还要明白这个概念常量池在java用于保存在编译期已确定的,已编译的
class文件中的一份数据。
主要看编译期字符串能否确定
String的intern()方法
当调用intern()方法时,如果常量池中已经包含一个等于此String对象的字符串(该对象由equals(Object)方法确定),则返回常量池中的字符串;否则,将此String对象添加到常量池中,并且返回此String对象的引用。