JAVA面试题

本文探讨了Java中String、StringBuffer与StringBuilder的区别,ArrayList与LinkedList的性能对比,equals方法与'=='运算符的不同,以及ArrayList、Vector和LinkedList的存储特性和性能。还涉及HashMap与Hashtable、abstract class与interface的区别,Collection与Collections接口的功能差异,接口和抽象类的异同,以及重写和重载的概念。
摘要由CSDN通过智能技术生成

1 String、StringBuffer、StringBuilder有什么区别?

String:
String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。在Java中,被final修饰的类是不允许被继承的.

StringBuffer:
StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和add方法,可以将字符串添加到已有序列的末尾或指定位置,它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上了synchronized。但是保证了线程安全是需要性能的代价的。

StringBuilder:
在很多情况下我们的字符串拼接操作不需要线程安全,这时候StringBuilder登场了,StringBuilder是JDK1.5发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。

StringBuffer 和 StringBuilder 二者都继承了 AbstractStringBuilder ,底层都是利用可修改的char数组(JDK 9 以后是 byte数组)。

总结:

    1. 在字符串不经常发生变化的业务场景优先使用String(代码更清晰简洁)。如常量的声明,少量的字符串操作(拼接,删除等)。
    1. 在单线程情况下,如有大量的字符串操作情况,应该使用StringBuilder来操作字符串。不能使用String"+"来拼接而是使用,避免产生大量无用的中间对象,耗费空间且执行效率低下(新建对象、回收对象花费大量时间)。如JSON的封装等。
    1. 在多线程情况下,如有大量的字符串操作情况,应该使用StringBuffer。如HTTP参数解析和封装等。

2 ArrayList、LinkedList区别

引用至:https://pengcqu.iteye.com/blog/502676
一般大家都知道ArrayList和LinkedList的大致区别:

  •  1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 
    
  • 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 
    
  • 3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 
    
总结

ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:

  • 1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。

  • 2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。

  • 3.LinkedList不支持高效的随机元素访问。

  • 4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

3 equals方法和“==”的区别

对象比较的区别

来说比较两个对象时,实质上是检查对象的内存地址是否相等

String的比较

==比较的是两个对象的地址

equals比较的是两个对象的内容
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:

     boolean equals(Object  obj){
     return  this==obj;
}

4 ArrayList,Vector,LinkeList的存储性能和特性

  • ArrayList 和Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增
    加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存
    操作,所以索引数据快而插入数据慢,
  • Vector 由于使用了synchronized 方法(线程安全)
    通常性能上较ArrayList 差,而LinkedList 使用双向链表实现存储,按序号索引数据需要进
    行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

总结:

  • 1.arraylist:底层用数组实现的list 特点:查询效率高,增删效率低 轻量级 线程不安全
  • 2.vector: 底层用数组实现list接口的另一个类 特点:重量级,占据更多的系统开销 线程安全
  • 3.linkedlist:底层用双向循环链表 实现的list 特点:查询效率低,增删效率高

5 HashMap和Hashtable的区别在这里插入图片描述

6 abstract class 和interface的区别

1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。

7 Collection和Collections的区别

Collection

1、java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set

Collections

2、Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。

8 接口和抽象类的区别

引用至: https://blog.csdn.net/nobody_1/article/details/88255925
在这里插入图片描述

9 重写和重载的区别

引用至: https://blog.csdn.net/nobody_1/article/details/88255925
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值