Java面试常见基础问题

1、equals和==有什么区别?

==比较两个对象在内存里是不是同一个对象,就是说在内存里的存储位置一致。
如:两个String对象存储的值是一样的,但是可能在内存里存储在不同的地方。

equals 是方法
== 是运算符

Equeals本质就是==,只不过String和Integer等重写了equals方法,把它变成了值比较。

总结:
==比较的是引用;如果比较的是基本数据类型,则比较的是数值是否相等;
如果比较的是引用数据类型,则比较的是对象的地址值是否相等。
equals方法比较的是内容。

即:equals比较的是值是否相等,==比较的是值和数据存储位置是否相等;

也就是说equals只比较值是否相等,而比较的是两者是否是同一个东西。

2、两个对象的hashCode()相同,equals()相同吗?

两个对象的hashCode()相同,equals()不一定相同。
因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
两个对象的值相同(x.equals(y)==true),他们的哈希码(hashCode)应当相同。

即:hashCode()相同,equals()不一定相同;

equals()相同,hashCode()一定相同。

3、重载和重写的区别?

都是实现多态的方式

重载:实现的是编译时的多态性
重写:实现的是运行时的多态性

a)重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型、参数个数),视为重载。重载对返回值类型没有特殊要求,不能根据返回值类型进行区分。
b)重写发生在子类与父类中,要求子类与父类方法有相同的参数列表;
有兼容的返回类型,比父类重写方法更好访问,不能比父类重写方法声明更多的一场(里氏代换原则)

解释:重载是子类继承了父类的方法;

重写是自己继承了父类的方法,但觉得不够好,自己又修改了继承的方法。

4、抽象类

抽象类不能使用final修饰,因为抽象类是要被其他类继承的,final修饰的类是不能被继承的。

5、抽象类和接口有什么异同?

相同:
    不能被实例化
    可以将抽象类和接口类型作为引用类型
    一个类如果继承了抽象类或者实现某个接口,都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。
不同:
    抽象类:
       抽象类中可以定义构造器
       可以有抽象方法和具体方法
       接口中的成员全都是公共的(public)
       抽象类中可以定义成员变量
       由抽象方法的类必须被声明为抽象类;而抽象类未必要有抽象方法
       抽象类中可以包含静态方法
       一个类只能继承一个抽象类

    接口:
       接口中不能定义构造器
       方法全都是抽象方法
       抽象类中的成员可以是默认的、public、private、protected
       接口定义的成员变量实际上都是常量
       接口中不能有静态方法
       一个类可以实现多个接口

6、String、StringBuffer、StringBuilder的异同?

a)   可变不可变
String:字符串常量,修改时原来的字符串对象不变,再重新生成新的字符串对象。

StringBuffer:修改时会改变自身对象,每次操作都是对StringBuffer对象本身进行修改,不是生成新的对象。
使用场景:对字符串经常改变情况下,主要方法:append(),insert()等。

StringBuilder: 对象能够被多次的修改
b)  线程是否安全
String:对象定义后不可变,线程安全

StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区大量数据。

StringBuilder:线程不安全,适用于单线程字符串缓冲区大量数据。
c)   共同点
1.StringBuffer、StringBuilder的方法都会调用AbstractStringBuilder 中的公共方法.
如 super.append(...)。

2.只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用StringBuilder 效率高于 StringBuffer。

补充:

  1. ArraryList和Vector
  • 如果不需要线程安全,建议使用ArraryList用来代替Vector
  • Vector:线程安全的数组集合
  1. HashMap和Hashtable
  • 如果不需要线程安全,建议使用HashMap用来代替Hashtable
  • Hashtable:线程安全的Map集合
  1. 但是在线程安全情况下,也不用Vector和Hashtable,一般用一下这几个:
  • Collections.synchronizedList(new ArrayList());
  • Collections.synchronizedMap(new HashMap<K,V>());
  • Collections.synchronizedSet(new HashSet());

7、分布式中的CAP原理

A:可用性         保持服务可用:多节点方式
C:一致性         多节点数据一致
P:分区容忍性      是否可以将数据存到多个地方

一个系统不可能同时满足CAP

AC;放弃分区容忍,物理数据库
AP;可以短暂允许数据不一致,NoSql数据库
CP:放弃可用性,zookeeper

项目用得较多的是AP

8、final在Java中的作用是什么?

final修饰的类叫做最终类,该类不能被继承
final修饰的方法不能被重写
final修饰的变量叫做常量,常量必须初始化,初始化之后值就不能被修改

9、如何开启多线程?

1.继承Thread类,重写run方法
2.实现Runnable接口,重写run方法

10、并行和并发

并行:两个任务同时进行,就是甲任务执行的同时,乙任务也在执行(需要多核)

并发:两个任务都请求运行,而处理器只能接受一个任务,就把这两个任务安排轮流执行。由于时间间隔很短,使人感觉两个任务都在运行

11、启动jvm是单线程的么?

不是,是多线程的。至少会启动垃圾回收线程和主线程

12、sleep和wait的区别?(未完)

sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用。

sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)。

它们都可以被interrupted方法中断。

13、开启多线程的方式

a.继承Thread类,重写run方法。
b.实现Runnable接口,重写run方法。
c.实现Callable接口:如果想要在线程执行完毕之后得到带有返回值的线程则实现Callable接口。

14、Java语言的三大特性?

封装、继承、多态

15、几个方法

notify:唤醒在该对象上等待的某个线程
notifyAll:唤醒在该对象上等待的所有线程
toString:转换成字符串

16、while循环和do…while循环的区别?

while循环是先判断再执行。
do...while循环是先执行一次,再判断下一次要不要执行。

17、&和&&的区别?

例:
a==b&b==c
即使a==b为false,程序还是会继续判断b是否等于c。

a==b&&b==c
如果a==b为false,程序不会继续判断b是否等于c。

判断某对象中的属性是否等于某值,则必须使用&&,否则会出现空指针异常。

18、String str="a"与String str=new String(“a”)一样吗?

不一样,因为分配内存方式不同。
String str="a",是常量池方式。
String str=new String("a"),是堆内存方式。

19、抽象类能使用final修饰吗?

不能,定义抽象类就是要让其他方法继承的,final就是最终的,不能被继承。

20、重载与重写的区别?重载的方法能否根据返回类型进行区分?

重载与重写都是实现多态的方式。

重载:编译时的多态性。
重写:运行时的多态性。

重载:发生在一个类中,同名的方法,参数类型不同、参数个数不同、或者类型和个数都不同。
重写:发生在子类与父类之间,要求同名的被重写的方法有相同的参数列表(参数类型、参数个数),有兼容的返回类型。

重载对返回类型没有特殊要求,不能根据返回类型进行区分。

21、什么是序列化和反序列化?

序列化:将对象转为字节序列的过程
反序列化:将字节序列转为目标对象的过程。

22、什么时候需要序列化?

当Java对象需要在网络上传输或者持久化存储到文件中时。

23、序列化怎么实现?

让类实现Serializable接口,注入该类对象是可被序列。

24、某些数据不想序列化,如何处理?

在字段前面加上transient关键字。
例:transien privat String name;

25、List、Set、Map是否继承自Collection接口?

List:是一个有序集合,可包含重复元素。List的长度可动态变换。
Set:元素不可重复的集合,无序。
Map:有key和value,Map是一个将key映射到value的对象。一个Map不能包含重复的key,每个key只能映射一个value。

List、Set继承自Collection接口。
Map是键值对映射容器,不是继承自Collection接口。

26、HashMap和HashTable的区别是什么?

1.HashMap允许key和value为空,HashTable不允许。
2.HashTable是同步的,而HashMap不是。HashMap适合单线程环境,HashTable适合多线程环境。
3.在Java1.4之后引入了LinkedHashMap,HashMap的一个子类。
	假如想要遍历顺序,很容易从HashMap转向LinkedHashMap,但是HashTable不是这样的,它的顺序是不可预知的。
4.HashMap提供对key的Set进行遍历,因此它是fail-fast的,但HashTable提供对Enumeration进行遍历,它不支持fail-fast。
5.HashTable被认为是个遗留的类,如果你寻求在迭代的时候修改Map,你应该使用CocurrenHashMAP。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值