首页 > 编程语言 >Java面试题2

Java面试题2

时间:2023-11-02 18:35:38浏览次数:37  
标签:面试题 遍历 Java 对象 子类 接口 hashCode 抽象类

Java面试题(第二天)

1.重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,发生在编译时期

重写:发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类,如果父类访问修饰符为private则子类就不能重写该方法。

2.接口和抽象类的区别

  • 抽象类可以存在普通成员函数,而接口只能存在public abstract方法。
  • 抽象类的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的
  • 抽象类只能继承一个,接口可以实现多个。

拓展:

接口的设计目的,是对类的行为进行约束(更准确的说是一种“有”约束,因为接口不能规定类不可以有什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。

而抽象类的设计目的,是代码复用。当不同的类具有某些相同的行为(记为行为集合A),但其中一部分行为的实现方法一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象类。在这个抽象类中实现了B,避免让所有的子类来实现B,这就达到了代码复用的目的。而A减B的部分,留给子类自己实现。正是因为A-B在这里没有实现,所以抽象类不允许实例化出来(否则当调用A-B时,无法执行)。

抽象类是对类本质的抽象,表达的是is a的关系。比如:BMW is a car。抽象类包含并实现子类的通用特性,将子类存在差异化的特性进行抽象,交由子类去实现。

而接口是对行为的抽象,表达的是like a的关系。比如:Bird like a Aircraft(鸟像一个飞行器),但本质上is a Bird 。接口的核心是定义行为,即实现类可以做什么,至于实现类主体是谁、如何实现,接口并不关心

使用场景:当你关注一个事物本质的时候,用抽象类;当你关注一个操作的时候,用接口

抽象类的功能要远超接口,但是,定义抽象类的代价高,因为高级语言来说(从实际设计上来说也是)每个类只能继承一个类。在这个类中,你必须继承或者编写出其所有子类的所有共性。虽然接口在功能上会弱化许多,但是它只是针对一个动作的描述。而且你可以在一个类中同时多个接口。在设计阶段降低难度。

3.List和Set的区别

  • List:有序,按对象进入的顺序保存对象,可重复,允许多个Null元素对象,可以使用Iterator取出所有元素,再逐一遍历,还可以使用get(int index)获取指定下标的元素
  • Set:无序,不可以重复,最多允许有一个Null元素对象,取元素时只能用Iterator接口取得所有元素,再逐一遍历各个元素

4.hashCode与equals

hashCode介绍

hashCode()的作用是获取哈希码,也称之为散列表,它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在JDK的Object.java中,Java中的任何类都包含有hashCode()函数。散列表存储的是键值对(key-value),它的特点是:能根据"键"快速的检索出对应的“值”。这其中就利用了散列码!(可以快速找到所需要的对象)

为什么要有HashCode

以“HashSet如何检查重复”为例子来说明为什么要有HashCode:

对象加入HashSet时,HashSet会先计算对象的HashCode值来判断对象加入的位置,看该位置是否有值,如果没有、HashSet会假设对象没有重复出现,但是如果发现有值,这是会调用equals()来检查两个对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功,就会重新散列到其他位置,这样就大大减少了equals的次数,相应就大大提高了执行速度。

  • 如果两个对象相等,则hashCode的值一定也是相同的
  • 两个对象相等,则两个对象分别调用equals方法都返回true
  • 两个对象有相同的hashCode值,它们也不一定是相等的
  • 因此,equals方法被覆盖过,则hashCode也必须被覆盖
  • hashCode()默认行为是对堆上的对象产生独特值。如果没有重写hashCode()则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)

5.ArrayList和LinkedList区别

ArrayList:基于动态数组,连续内存存储,适合下标访问,(随机访问)。扩容机制:因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据进行拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入新元素),使用尾插法并指定出事容量可以极大提升性能,甚至超过linkedList(需要创建大量的node对象)

ArrayList源码分析 - 喜欢七岁就很浪 - 博客园 (cnblogs.com)

LinkedList:基于链表,可以储存在分散的内存中,适合做数据插入及删除操作,不适合查询:需要逐一遍历遍历LinkedList必须使用iterator不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时都需要对list重新进行遍历,性能消耗极大。

另外不要试图使用indexOf等返回元素索引,并利用其进行遍历,使用indexOf对list进行遍历,当结果为空时会遍历整个列表。

LinkedList源码分析 - 喜欢七岁就很浪 - 博客园 (cnblogs.com)

标签:面试题,遍历,Java,对象,子类,接口,hashCode,抽象类
From: https://www.cnblogs.com/qisui/p/17806002.html

相关文章

  • Java面试题3
    Java面试题(第三天)1.HashMap和HashTable的区别?a.区别多线程环境下,HashTable比HashMap更安全,因为HashTable都加了一个synchronized修饰HashMap允许key和value为null,而HashTable不允许b.HashMap底层实现数组+链表jdk8开始链表高度到8,数组长度超过64,链表转变为红黑树,元素以......
  • Java面试题4
    Java面试题(第四天)1.双亲委派机制双亲委派机制是指当一个类加载器收到一个类加载请求时,该类加载器首先会把请求委派给父类加载器。每个类加载器都是如此,只有在父类加载器在自己的搜索范围内找不到指定类时,子类加载器才会尝试自己去加载。1.当ApplicationClassLoader收到一......
  • Java面试题5
    Java面试题(第五天)1.对线程安全的理解不是线程安全,应该是内存安全,堆是共享内存,可以被所有线程访问当多个线程访问一个对象时,如果不用进行额外的同步控制或其他协调操作,调用这个对象的行为都可以获得正确的结果,我们就说这个对象时线程安全的堆是进程和线程共有的空间,分全局......
  • Java面试题1
    Java面试题(第一天)1.JDK、JRE、JVM三者区别和联系区别:JDK:JavaDevelopmentKit(Java开发环境)JRE:JavaRuntimeEnvironment(Java运行环境)JVM:JavaVirtualMachine(Java虚拟机)联系:.java文件被javac编译成.class文件然后被jvm使用lib类库编译为机器码然后通过jvm映射到操......
  • Java-并发编程-进阶篇
    在上一篇幅中对并发编程进行了简单介绍:并发与并行,进程与线程,以及并发编程的简单代码但是在企业中往往并不能解决实际问题,例如:1.synchronized关键字在企业开发中会大大降低系统的性能2.当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。线程对象......
  • Java数组_03数组执行原理
    1、运行主要用到的三个区: 2、执行原理: ......
  • 学习:javaweb-servlet
    1.在Idea中配置maven仓库,需要在idea中的setting设置maven的路径参数,包括maven的setting.xml和本地仓库的路径2.新建一个maven模板的javaweb项目,查看maven的配置setting.xml是否配置成功,成功的话可以下载模板所需要的一依赖包。3.查看projectStructure中的Modules项目中是否生成......
  • React面试题: 我是否可以在项目中不断使用React.Component来优化项目
    React.PureComponent是React的一个组件,主要用于性能优化,可以避免不必要的渲染。它的主要特点是:如果组件的props和state没有发生变化,则不会重新渲染(此处原理类似React.memo)。可以自动检查对象和数组,判断其是否需要重新渲染(是浅比较)。但是,React.PureComponent的缺点......
  • java笔记_14_邮箱发送
    JavaMailSender:默认使用配置文件中的发送人邮箱密码等JavaMailSenderImpl:方法中使用Impl对象,可手动设置发送账户密码application.ymlspring:#spring集成配置(省略创建session过程)mail:host:#邮件服务器地址port:#邮件服务器端口proto......
  • 面试题: 前端处理滚动穿透这个顽疾
    诚如你所知:滚动穿透是指在移动端滑动页面的过程中,页面滚动受到了触摸事件的干扰,导致无法流畅地滚动,这主要是由于事件冒泡造成的。解决方法如下:监听touchmove事件,阻止默认行为监听touchmove事件,阻止事件的默认行为,防止事件冒泡到父元素上。禁止滚动可以通过over......