- 这些面试点是在 java后端进阶的文章里拷贝的。但我要把答案整理出来,有什么问题还希望大家指正。
-
1、Java基础面试知识点
Java中==和equals和hashCode的区别
-
== 运算符用来比较两个变量的值是否相等。
-
如果是基本数据类型(byte,short,int char long float double boolean)就是直接比较两个变量的大小
-
但如果是引用类型(类,接口,数组)的比较,是比较内存中的存放地址。
-
-
equals 该方法主要用于判断对象的内存地址引用是否是同一个地址
-
但是不同的子类,对equals进行了重写,String中先比较地址,相同就相等,如果不同就比较字符串内容。
-
-
==比较的是栈中的值,equals比较的是堆中对象内容。
-
==默认比较对象在JVM中的地址。
-
hashCode 默认返回对象在JVM中的存储地址。
-
equal比较对象,默认也是比较对象在JVM中的地址,同==
-
-
int、char、long各占多少字节数
-
int 4字节
-
char 2字节
-
long 8 字节
-
-
int与integer的区别
-
Integer是int的包装类;int是基本数据类型;
-
Integer变量必须实例化后才能使用;int变量不需要;
-
Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
-
Integer的默认值是null;int的默认值是0。
-
-
- 面向对象的三大基本特征是:封装,继承,多态
- 多态性是面向对象程序设计的重要部分。通常使用方法的重写和重载来实现类的多态性。
- String、StringBuffer、StringBuilder区别
- String 是字符串常量
- StringBuffer:字符串变量 线程安全
- StringBuilder:字符串变量 线程不安全 速度最快
- 什么是内部类?内部类的作用
- 将一个类定义到另一个类的内部,叫做内部类。内部类分为四种:静态内部类,成员内部类、局部内部类、匿名内部类
- 静态内部类是指被声明为static的内部类,他可以不依赖内部类而实例,而通常的内部类需要实例化外部类,从而实例化。静态内部类不可以有与外部类有相同的类名。不能访问外部类的普通成员变量,但是可以访问静态成员变量和静态方法(包括私有类型)
- 一个 静态内部类去掉static 就是成员内部类,他可以自由的引用外部类的属性和方法,无论是静态还是非静态。但是不可以有静态属性和方法、
- 局部内部类 就是定义在一个代码块的内类,他的作用范围是所在代码块,是内部类中最少使用的一类型。局部内部类跟局部变量一样,不能被public ,protected,private以及static修饰,只能访问方法中定义final类型的局部变量。
- 匿名内部类是一种没有类名的内部类,不使用class,extends,implements,没有构造函数,他必须继承其他类或实现其他接口。匿名内部类的好处是使代码更加简洁,紧凑,但是带来的问题是易读性下降。他一般应用于GUI编程来实现时间处理等 。
- 在使用匿名内部类时,需要牢记以下几个原则。
-
1》内部类没有构造方法
2》匿名内部类不能定义静态成员,方法和类
3》匿名内部类不能是public protected private static
4》只能创建匿名内部类的一个实例
5》一个匿名内部类可以在new后面,这个匿名类必须继承一个父类或实现接口
6》因为匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效 --------------------- 本文来自 LianXu3344 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/lianxu3344/article/details/79473607?utm_source=copy
-
- 抽象类和接口区别
-
参数 抽象类 接口 默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现 实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现 构造器 抽象类可以有构造器 接口不能有构造器 与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型 访问修饰符 抽象方法可以有public、protected和default这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。 main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。 多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口 速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。 添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。
-
- 抽象类的意义
- 抽象类是用来捕捉子类的通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板
- 抽象类与接口的应用场景
- 如果你拥有一些方法并且想让它们中的一些有默认实现,那么使用抽象类吧。
- 如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
- 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
- 抽象类是否可以没有方法和属性?
- ???
- 接口的意义
- 接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情
- 泛型中extends和super的区别
- <? extends T> 只能用于方法返回,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,但是入参类型无法确定,只能接受null的传入
- <? super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接收
- 父类的静态方法能否被子类重写
- 不能。父类的静态方法不能被子类继承,更谈不上重写,就算是子类中有一个和父类一模一样的静态方法,那也是子类本身的,和父类的那个静态方法不是一回事。方法加静态后就属于类不属于对象了
- 进程和线程的区别
- https://www.cnblogs.com/lgk8023/p/6430592.html
- 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
- final,finally,finalize的区别
- final修饰符出现主要作用是为了使相应的变量,对象或者方法一旦创建后,就不在发生任何改变
- finally关键字一般也用在处理try{}catch{}finally{}的异常中,finally里面的内容一定会执行。
-
finalize在垃圾回收中会使用。finalize是Object类中的方法。在垃圾回收器执行的时候会调用被回收对象的此方法。
用户可以重写此方法,已完成对其它资源的回收。如关闭文件等。
- 序列化的方式
- https://blog.csdn.net/pistolove/article/details/60321123
- Java原生以流的方法进行的序列化、Json序列化、FastJson序列化、Protobuff序列化。
- Java原生序列化方法即通过Java原生流(InputStream和OutputStream之间的转化)的方式进行转化。需要注意的是JavaBean实体类必须实现Serializable接口,否则无法序列化。
- Json序列化一般会使用jackson包,通过ObjectMapper类来进行一些操作,比如将对象转化为byte数组或者将json串转化为对象。现在的大多数公司都将json作为服务器端返回的数据格式。比如调用一个服务器接口,通常的请求为xxx.json?a=xxx&b=xxx的形式。
- fastjson 是由阿里巴巴开发的一个性能很好的Java 语言实现的 Json解析器和生成器。特点:速度快,测试表明fastjson具有极快的性能,超越任其他的java json parser。功能强大,完全支持java bean、集合、Map、日期、Enum,支持范型和自省。无依赖,能够直接运行在Java SE 5.0以上版本。支持Android。使用时候需引入FastJson第三方jar包
- ProtoBuff序列化对象可以很大程度上将其压缩,可以大大减少数据传输大小,提高系统性能。对于大量数据的缓存,也可以提高缓存中数据存储量。原始的ProtoBuff需要自己写.proto文件,通过编译器将其转换为java文件,显得比较繁琐。百度研发的jprotobuf框架将Google原始的protobuf进行了封装,对其进行简化,仅提供序列化和反序列化方法。其实用上也比较简洁,通过对JavaBean中的字段进行注解就行,不需要撰写.proto文件和实用编译器将其生成.java文件,百度的jprotobuf都替我们做了这些事情了。
- Serializable 和Parcelable 的区别
- 静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?
- 静态内部类的设计意图
- 成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用
- 谈谈对kotlin的理解
- 闭包和局部内部类的区别