- 49.58 KB
- 2021-05-17 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
java基础面试知识点
1.java中==和equals和hashCode的区别
2.int、char、long各占多少字节数
byte 1字节 最小值是 -128(-2^7); 最大值是 127(2^7-1);
boolean 至少1字节 这种类型只作为一种标志来记录 true/false 情况;
short 2字节 最小值是 -32768(-2^15); 最大值是 32767(2^15 - 1);
char 2字节 最小值是 u0000(即为0);最大值是 uffff(即为65,535);
int 4字节 最小值是 -2,147,483,648(-2^31); 最大值是 2,147,483,647(2^31 - 1);
float 4字节 单精度浮点数字长32位,尾数长度23,指数长度8,指数偏移量127;
long 8字节 最小值是 -9,223,372,036,854,775,808(-2^63);
最大值是 9,223,372,036,854,775,807(2^63 -1);
double 8字节 双精度浮点数字长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
3.int与integer的区别
1. Ingeter是int的包装类,int的初值为0,Ingeter的初值为null;
2.初始化的时候,int i =1;Integer i= new Integer(1);(要把integer 当做一个类看);但由于有了自动装箱和拆箱使得对Integer类也可使用:Integer i= 1;
3.int 是基本数据类型(面向过程留下的痕迹,不过是对java的
有益补充),Integer 是一个类,是int的扩展,定义了很多的转换方法
4.Integer是对象,用一个引用指向这个对象,而int是基本类型,直接存储数值。
4.对java多态的理解
多态:继承父类的子类重写父类的某个方法,不同的子类调运同一个方法可以,产生不同的结果。
多态的三个必要条件:
1.继承父类
2.重写父类的方法
3.父类的引用指向子类对象
面向对象的三大特性封装、继承、多态。从某种程度来看,封装、继承就是为了多态准备的,也是最重要的知识点。
实现多态的技术:动态绑定,是指在执行期间,根据引用对象实际指向的对象,来执行对应的方法。
多态的作用:消除类型之间的耦合关系。
多态的好处:
1.可替换行:多态对已存在的代码有可替换性(重写);
2.扩展性:多态对代码具有扩展性;
3.接口性:多态是父类通过方法签名,为子类提供的共同接口,由子类去完善或覆盖;
4.灵活性:它在应用中体现了灵活多样的操作,提高了使用效率;
5.简化性。Java中多态的实现方式:实现接口,继承父类进行方法重写,同一个类中进行方法的重载。
什么是内部类?内部类的作用
定义: 将一个类定义在一个类或者一个方法里面,这样的类称着内部类
内部类的种类有4种:
1、成员内部类
2、静态内部类静态内部类就是在成员内部类多加了一个 static 关键字。
3、匿名内部类
4、局部内部类
内部类的作用
1、内部类可以很好的实现隐藏。
非内部类是不可以使用 private和 protected修饰的,但是内部类却可以,从而达到隐藏的作用。同时也可以将一定逻辑关系的类组织在一起,增强可读性。
2、间接的实现多继承。
每个内部类都能独立地继承自一个(接口的)实现,所以无论外部类是否已经继承了某个(接口的)实现,对于内部类都没有影响。如果没有内部类提供的可以继承多个具体的或抽象的类的能力,一些设计与编程问题就很难解决。所以说内部类间接的实现了多继承。
抽象类和接口区别?
抽象类:
1:有abstract修饰的class,绝对就是抽象类。
2:抽象类中可以有抽象方法,也可以没有抽象方法,但是有抽象方法的class,就一定会是抽象类。
3:抽象类是不能创建实例对象的。
4:如果有子类继承这个抽象类,则必须要实现父类中的抽象方法,如果不实现的话,则这个字类也必须定义为抽象类。
接口:
1:接口只能实现不能够继承,比如,一个类可以实现多个接口,但是只能继承一个父类,也可以这样理解,一个类可以有多个干爹(实现接口),但是只能有一个亲爹(继承父类)。
2:如果要实现这个接口,则该接口中的方法必须要实现。因为我们定义接口中的方法时,系统是默认这些方法是抽象的方法,也就是说这些方法是有public abstract这个来修饰的。
3:在接口中定义的变量必须是全局变量的,也就是说有public static final修饰的
抽象类的意义
抽象类与接口的应用场景
抽象类是否可以没有方法和属性?
泛型中extends和super的区别?
和是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。
:是指 “上界通配符(Upper Bounds Wildcards)”
:是指 “下界通配符(Lower Bounds Wildcards)”
父类的静态方法能否被子类重写?
先给一个答案,不能,父类的静态方法能够被子类继承,但是不能够被子类重写,即使子类中的静态方法与父类中的静态方法完全一样,也是两个完全不同的方法。
重写指的是根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型。
对于静态方法和静态变量来说,虽然在上述代码中使用对象来进行调用,但是底层上还是使用父类来调用的,静态变量和静态方法在编译的时候就将其与类绑定在一起。既然它们在编译的时候就决定了调用的方法、变量,那就和重写没有关系了。
静态属性和静态方法是否可以被继承
可以被继承,如果子类中有相同的静态方法和静态变量,那么父类的方法以及变量就会被覆盖。要想调用就就必须使用父类来调用。
从上述代码可以看出,子类中覆盖了父类的静态方法的话,调用的是子类的方法,这个时候要是还想调用父类的静态方法,应该是用父类直接调用。如果子类没有覆盖,则调用的是父类的方法。静态变量与此相似。
进程和线程的区别?
进程
是系统进行资源分配的独立单元
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对象序列化到文件里?
将对象序列化到文件
1.对象需要实现Seralizable接口
2.通过ObjectOutputStream的writeObject()方法写入和ObjectInputStream的readObject()方法来进行读取
//存进去
Java反射的理解
简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息。如果知道一个类的名称或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符,类型,方法参数等等所有信息)找出来。如果明确知道这个类里的某个方法名+参数个数 类型,还能通过传递参数来运行那个类里的那个方法,这就是反射。
Java注解的理解
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
元注解:
元注解的作用就是负责注解其他注解。Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明。Java5.0定义的元注解:
1.@Target,
2.@Retention,
3.@Documented,
4.@Inherited
说说你对依赖注入的理解
这也就说明了为啥要依赖注入,因为可以解耦
依赖注入主要作用: 依赖注入能够让相互协作的软件组件保持松散耦合
泛型原理,并举例说明
Java的泛型是伪泛型。在编译期间,所有的泛型信息都会被擦除掉。
Java中的泛型基本上都是在编译器这个层次来实现的。在生成的Java字节码中是不包含泛型中的类型信息的。使用泛型的时候加上的类型参数,会在编译器在编译的时候去掉。这个过程就称为类型擦除。
Java中String的了解
一、String是不可变对象
java.lang.String类使用了final修饰,不能被继承。Java程序中的所有字面值,即双引号括起的字符串,如"abc",都是作为String类的实例实现的。String是常量,其对象一旦构造就不能再被改变。换句话说,String对象是不可变的,每一个看起来会修改
String值的方法,实际上都是创造了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象则丝毫未动。String对象具有只读特性,指向它的任何引用都不可能改变它的值,因此,也不会对其他的引用有什么影响。
二、String常量池
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。Java为了提高性能,静态字符串(字面量/常量/常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串。对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果常量池中存在即返回该对象。
三、String、StringBuffer和StringBuilder的区别
1.对象的可变与不可变
String类中使用字符数组来保存数据,因为有“final”修饰符,所以string对象是不可变的。如下:
private final char value[];
StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存数据,这两种对象都是可变的。如下:
char[] value;
2.是否是线程安全
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 对象的引用。