一、多态
多态是什么:多态就是一个类具有多种形态,就是同一个行为具有多个不同表现形式
运行时多态存在的三个必要条件:
1. 继承(包括接口的实现);
2. 重写;
3. 父类引用指向子类对象。好处是 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
多态的实现方式:
1、编译时多态:1. 编译期间决定目标方法
2. 通过重载实现
3. 方法名相同,参数不同
2、运行时多态:1. 运行期间决定目标方法
2. 通过重载和继承实现
3.方法名相同,参数也相同
二、ArrayList 与 LinkedList 的区别
ArrayList:
-
基于动态数组,连续内存存储,适合下标访问(数组中存储的元素类型是一致的,每个元素在内存中所占的长度是一样的,又连续,所以一个元素长度乘以下标位置就可以很快找到元素。)
静态数组:新建时,数组长度已经确定
动态数组:数组长度不确定 扩容机制:因为数组长度是固定的,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组。
节省扩容次数:新建数组时确定大概的数据长度(若初始容量太大,浪费内存;若初始容量太小,需要经常扩容,消耗性能)
- ArrayList插入元素时,如果不是尾插插入数据还会涉及到元素的移动(往后复制一份,插入新元素)
使用尾插法并指定初始容量可以极大的提高性能。使用得当时,ArrayList性能并不比LinkList差。
LinkedList :
基于链表,可以存储在分散的内存中,适合做数据插入及删除操作(插入元素时,断开原结点连接,再新建连接即可)
虽然插入方便,但LinkedList内部维护了一个node内部类,每插入一个节点就会创建一个node对象,若linkedList需要大量数据进行插入的话,就需要创建大量节点,性能消耗在创建node对象上。
LinkedList使用不方便。因为遍历LinkedList必须使用迭代器iterator(这是因为iterator的next(),是顺着链表节点顺序读取数据,所以效率就很高),不能使用for循环。因为for循环体内通过get(i)取得某一元素时都需要对list重新进行遍历,性能消耗极大。
三、抽象类与抽象方法
抽象类
使用abstract去定义的类,在面向对象概念中通过类来描述对象的行为和特性,如果类中没有包含完整的信息去描述对象的行为特征的类就是抽象类。
抽象方法
该类包含一个特别的成员方法,该方法的具体实现由它的子类确定。
Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。
继承抽象方法的子类必须重写该方法。
特性
抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。
四、接口和抽象类的区别
抽象类是模板设计,接口是行为规范
- 抽象类可以存在普通方法,而接口中只能存在abstract抽象方法
- 抽象类只能继承一个,接口可以实现多个
- 抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是public static final 常量型。
- 抽象类设计的目的是代码复用,当不同的类具有某些相同的行为,可以让这些类都派生于一个子类。是用来捕捉子类的通用特性的。接口设计的核心是定义行为,即类可以实现什么。接口是抽象方法的集合。
- 从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范
抽象类不能实例化的原因:因为抽象类中有些方法可能并没有实现,若实例化,那该执行什么方法呢,是不知道的。
三、 JDK,JRE,JVM区别
如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。
1、JRE(JAVA Runtime Environment)java运行时环境,是提供给想运行java程序的用户使用的。包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,。
2、JDK(JAVA Development Kit )java开发工具包,是提供给开发者使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。
3、JVM(java Virtual Machine)java虚拟机,解释class文件,解释成机器码,让操作系统可以执行。
四、List和Set的区别
- List:有序可重复,允许多个Null元素对象
- Set:无序不重复,最多允许有一个Null元素对象
五、hashcode与equals的区别
equals 对比的是对象在栈中的引用地址,就是基本类型的值
hashcode 哈希码,散列码,用于获取哈希码,作用是确定对象在哈希表的索引位置
区别:
- 如果两个对象相等,则hashcode一定也是相同的