欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java面试基础总结

程序员文章站 2022-06-21 12:29:40
...

1、java中==和equals和hashCode的区别

== 运算符    
a:对于基本数据类型   ==比较的是基本数据类型的值
b:对于引用数据类型   ==比较的是引用类型的地址值
equals()和hashCode()都是Object类的一个方法;
equals()只能比较引用类型,默认比较地址值。 equals()用于比较两个对象是否相等,其实内部比较的就是两个对象地址,和 ==  结果是一样的;

hashCode() 返回的是该对象的哈希码值,是一个离散的int型整数。在集合类操作中经常使用,提高查询速度;当元素的hashCode值相同时,才继续判断元素的equals是否为true。如果equals为true,那么视为相同元素。如果为false,那么不相同。如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。

hashCode值相同,equals值不一定相同; equals值相同,hashCode值一定相同

2、int、char、long各占多少字节数

1. byte 1个字节
2. short 2个字节
3. char 2个字节 
4. int 4个字节
5. long 8个字节
6. float 4个字节
7. double 8个字节
8. boolean 1/8个字节


3.int与integer的区别

int 是基本类型

integer 是对象 是int的封装类

4.java多态的理解

 对象在不同时刻表现出来的多种状态。是一种编译时期状态和运行时期状态不一致的现象。

前提1.必须要有关系:类与类之间要有继承关系 或者 实现

                  2.要有方法的重写。父类引用或者接口的引用指向子类对象。

好处提高了程序的可维护性(前提要有继承保证),和扩展性。

弊端当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法。(即访问局限性)

多态在子父类中的成员上的体现的特点:

1.成员变量: 编译看左边,运行看左边

2.成员函数 : 编译看左边,运行看右边

3,静态函数 : 编译看左边,运行看左边

5.String、StringBuffer、StringBuilder区别

String:属于字符串常量,字符长度是固定的,每次改变都会生成一个新的对象;而StringBuffer/StringBuilder属于字符串变量,字符长度是可变的。

StringBuffer是线程安全的,但效率较低一些。

StringBuilder是线程不安全的,但效率较高一些。适用于单线程

StringBuffer和StringBuilder可兼容。

6.内部类?内部类的作用

在类的内部定义的类叫做内部类,内部类可以直接访问外部类的属性;
分为:成员内部类局部内部类匿名内部类
作用:

1.内部类可以有多个实体,每个实体都有自己的状态信息,和在外部实体类对象是相互独立的
2.在单个外部类中可
以以不同的形式创建多个内部类,继承同一个类或者是实现同一个接口
3.内部类是一个独立的实体类
4.内部类提供了更好的封装,只能当前外部类访问

7.抽象类和接口区别

参数 抽象类 接口
方法实现 有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 有构造器 不能有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

8.抽象类的意义

抽象类将事物的共性的东西提取出来,抽象成一个高层的类。子类由其继承时,也拥有了这个超类的属性和方法。---也就实现了代码的复用了。
子类中也可加上自己所特有的属性和方法。----也就实现了多态

9.抽象类与接口的应用场景

  • 有一些方法并且想让它们中的一些有默认实现,就可以使用抽象类。
  • 想实现多重继承,就必须使用接口。因为Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。

10.抽象类是否可以没有方法和属性

有抽象属性或者抽象方法的必须为抽象类,但是抽象类不一定有抽象方法;

11.泛型中extends和super的区别

  1. <? extends T> 只能用于方法返回,告诉编译器此返参的类型的最小继承边界为T,T和T的父类都能接收,但是入参类型无法确定,只能接受null的传入
  2. <? super T>只能用于限定方法入参,告诉编译器入参只能是T或其子类型,而返参只能用Object类接收
  3. ? 既不能用于入参也不能用于返参

12.父类的静态方法能否被子类重写

  • 可继承 不可重写,而是被隐藏了。
  • 如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成。

13.进程和线程的区别

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。

 


14.final,finally,finalize区别

final:修饰类、成员变量和成员方法,类不可被继承,成员变量不可变,成员方法不可重写
finally:与try...catch...共同使用,确保无论是否出现异常都能被调用到
finalize:类的方法,垃圾回收之前会调用此方法,子类可以重写finalize()方法实现对资源的回收

15.序列化的方式

 a.实现了序列化接口Serializable,主要作用就是标识这个对象时可序列化的,jre对象在传输对象的时候会进行相关的封装。
b.实现序列化的第二种方式为实现接口Externalizable

16.Serializable 和Parcelable 的区别

Serializable Java 序列化接口 在硬盘上读写 读写过程中有大量临时变量的生成,内部执行大量的i/o操作,效率很低。
Parcelable   Android 序列化接口 效率高 使用麻烦 在内存中读写(AS有相关插件 一键生成所需方法) ,对象不能保存到磁盘中

17.成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用

java中内部类主要分为成员内部类局部内部类(嵌套在方法和作用域内)、匿名内部类(没构造方法)、静态内部类(static修饰的类,不能使用任何外围类的非static成员变量和方法, 不依赖外围类)

使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。
因为Java不支持多继承,支持实现多个接口。但有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。

18.谈谈对kotlin 理解

优点:null安全监测;属性访问,unchecked exceptions, publication有更详细的介绍。

缺点:编译速度慢,没有命名空间,没有静态修饰语 增加方法数量 

19.闭包和局部内部类的区别

闭包就是把函数以及变量包起来,使得变量的生存周期延长。

局部内部类是嵌套在方法和作用域内的,对于这个类的使用主要是应用与解决比较复杂的问题,想创建一个类来辅助我们的解决方案,到那时又不希望这个类是公共可用的,所以就产生了局部内部类,局部内部类和成员内部类一样被编译,只是它的作用域发生了改变,它只能在该方法和属性中被使用,出了该方法和属性就会失效。

20.string 转换成 integer的方式及原理

String 转integer   Intrger.parseInt(string);

Integer转string    Integer.toString();



相关标签: java基础