java 常见基础题

Java中==和equals和hashCode的区别

基本数据类型的==比较的值相等.

类的==比较的内存的地址,即是否是同一个对象,在不覆盖equals的情况下,同比较内存地址,原实现也为== ,如String等重写了equals方法.

hashCode也是Object类的一个方法。返回一个离散的int型整数。在集合类操作中使用,为了提高查询速度。(HashMap,HashSet等比较是否为同一个)

如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。

如果两个对象不equals,他们的hashcode有可能相等。

如果两个对象hashcode相等,他们不一定equals

如果两个对象hashcode不相等,他们一定不equals

int与integer的区别

int
基本类型

integer
对象int的封装类

String、StringBuffer、StringBuilder区别

String:
字符串常量 不适用于经常要改变值得情况,每次改变相当于生成一个新的对象

StringBuffer:
字符串变量 (线程安全)

StringBuilder:
字符串变量(线程不安全) 确保单线程下可用,效率略高于StringBuffer

什么是内部类?内部类的作用

内部类可直接访问外部类的属性

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

进程和线程的区别

进程cpu资源分配的最小单位,
线程cpu调度的最小单位。

进程之间不能共享资源,而线程共享所在进程的地址空间和其它资源。

一个进程内可拥有多个线程,进程可开启进程,也可开启线程。

一个线程只能属于一个进程,线程可直接使用同进程的资源,线程依赖于进程而存在。

final,finally,finalize的区别

final:
修饰类、成员变量和成员方法,类不可被继承,成员变量不可变,成员方法不可重写

finally:
try...catch...共同使用,确保无论是否出现异常都能被调用到

finalize:
类的方法,垃圾回收之前会调用此方法,子类可以重写finalize()方法实现对资源的回收。

Serializable 和Parcelable 的区别

Serializable
Java序列化接口 在硬盘上读写 读写过程中有大量临时变量的生成,内部执行大量的i/o操作,效率很低。

Parcelable
Android序列化接口 效率高 使用麻烦 在内存中读写(AS有相关插件 一键生成所需方法) ,对象不能保存到磁盘中。

静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?

可继承 不可重写 而是被隐藏

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

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

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

使用内部类最吸引人的原因是:
每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。

因为Java不支持多继承,支持实现多个接口。但有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。

哪些情况下的对象会被垃圾回收机制处理掉?

  1. 所有实例都没有活动线程访问。

  2. 没有被其他任何实例访问的循环引用实例。

  3. Java 中有不同的引用类型。判断实例是否符合垃圾收集的条件都依赖于它的引用类型。

要判断怎样的对象是没用的对象。这里有2种方法:

  1. 采用标记计数的方法:

给内存中的对象给打上标记,对象被引用一次,计数就加1,引用被释放了,计数就减一,当这个计数为0的时候,这个对象就可以被回收了。当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的。所以就有了第二种方法:

  1. 采用根搜索算法:

从一个根出发,搜索所有的可达对象,这样剩下的那些对象就是需要被回收的。

静态代理和动态代理的区别,什么场景使用?

静态代理类:
由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

动态代理类:
在程序运行时,运用反射机制动态创建而成。

Java中实现多态的机制是什么?

方法的重写Overriding和重载OverloadingJava多态性的不同表现

重写
Overriding是父类与子类之间多态性的一种表现

重载
Overloading是一个类中多态性的一种表现.

HashMap和HashTable的区别

HashMap
不是线程安全的,效率高一点、方法不是Synchronize的要提供外同步,有containsvaluecontainsKey方法。

hashtable
是线程安全,不允许有null的键和值,效率稍低,方法是是Synchronize的。有contains方法方法。Hashtable继承于Dictionary 类。

HashMap与HashSet的区别

hashMap:
HashMap实现了Map接口,HashMap储存键值对,使用put()方法将元素放入map中,HashMap中使用键对象来计算hashcode值,HashMap比较快,因为是使用唯一的键来获取对象。

HashSet
实现了Set接口,HashSet仅仅存储对象,使用add()方法将元素放入set中,HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回falseHashSetHashMap来说比较慢。

猜你喜欢

转载自blog.csdn.net/houxian1103/article/details/109484491