java面试基础总结

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的区别

i nt 是基本类型

integer 是对象 是int的封装类

4.java多态的理解

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

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

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

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

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

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

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

扫描二维码关注公众号,回复: 1136335 查看本文章

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();



猜你喜欢

转载自blog.csdn.net/shanshan_1117/article/details/79992016