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
不支持多继承,支持实现多个接口。但有时候会存在一些使用接口很难解决的问题,这个时候我们可以利用内部类提供的、可以继承多个具体的或者抽象的类的能力来解决这些程序设计问题。可以这样说,接口只是解决了部分问题,而内部类使得多重继承的解决方案变得更加完整。
哪些情况下的对象会被垃圾回收机制处理掉?
- 所有实例都没有活动线程访问。
- 没有被其他任何实例访问的循环引用实例。
-
Java
中有不同的引用类型。判断实例是否符合垃圾收集的条件都依赖于它的引用类型。
要判断怎样的对象是没用的对象。这里有2
种方法:
- 采用标记计数的方法:
给内存中的对象给打上标记,对象被引用一次,计数就加1
,引用被释放了,计数就减一,当这个计数为0
的时候,这个对象就可以被回收了。当然,这也就引发了一个问题:循环引用的对象是无法被识别出来并且被回收的。所以就有了第二种方法:
- 采用根搜索算法:
从一个根出发,搜索所有的可达对象,这样剩下的那些对象就是需要被回收的。
静态代理和动态代理的区别,什么场景使用?
静态代理类:
由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
动态代理类:
在程序运行时,运用反射机制动态创建而成。
Java中实现多态的机制是什么?
方法的重写Overriding
和重载Overloading
是Java
多态性的不同表现
重写
Overriding
是父类与子类之间多态性的一种表现
重载
Overloading
是一个类中多态性的一种表现.
HashMap和HashTable的区别
HashMap
不是线程安全的,效率高一点、方法不是Synchronize
的要提供外同步,有containsvalue
和containsKey
方法。
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()
方法用来判断对象的相等性,如果两个对象不同的话,那么返回false
。HashSet
较HashMap
来说比较慢。