
1、Java中的重载与重写有什么区别
重载(Overload)是让类以统一的方式处理不同类型数据的一种手段,实质表现就是多个具有不同的参数个数或者类型的同名函数(返回值类型可随意,不能以返回类型作为重载函数的区分标准)同时存在于同一个类中,是一个类中多态性的一种表现(调用方法时通过传递不同参数个数和参数类型来决定具体使用哪个方法的多态性)。
重写(Override)是父类与子类之间的多态性,实质是对父类的函数进行重新定义,如果在子类中定义某方法与其父类有相同的名称和参数则该方法被重写,不过子类函数的访问修饰权限不能小于父类的;若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法,如需父类中原有的方法则可使用 super 关键字。
重载:
必须具有不同的参数列表;
可以有不同的返回类型;
可以有不同的访问修饰符;
可以抛出不同的异常。
重写:
参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载;
返回类型必须一直与被重写的方法相同,否则不能称其为重写而是重载;
访问修饰符的限制一定要大于等于被重写方法的访问修饰符;
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。
重载与重写是 Java 多态性的不同表现,重写是父类与子类之间多态性的表现,在运行时起作用(动态多态性,譬如实现动态绑定),而重载是一个类中多态性的表现,在编译时起作用(静态多态性,譬如实现静态绑定)。
2、 Java 中 final、finally、finalize 的区别
使用 final 关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。多态的override:基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象,如果指向子类的实例对象,其调用的方法应该是正在运行的那个对象的方法。答:靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。
2 进入优化设计器,执行优化设计分析过程,包括指定分析文件、声明优化变量、选择优化工具或优化方法、指定优化循环控制方法、进行优化分析等步骤。有些类型是在编译过程中推断出来的,比如:最初声明为string类型的字符串变量被分配给不同的变量,不需要隐式地声明类型,新变量的数据类型将由编译器本身推断出来。不支持多态,如果父类声明一个对象,子类实现这边变量,那么调用static修饰的时候会调用父类的,而不是子类的.。
finally 用来在异常处理时提供块来执行任何清除操作,如果抛出一个异常,则相匹配的 catch 子句就会执行,然后控制就会进入 finally 块。
finalize 是一个方法名,Java 允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作,这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,它是在 Object 类中定义的,因此所有的类都继承了它,子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作,finalize() 方法在垃圾收集器删除对象之前对这个对象调用的。
参考:
你以为你真的了解final吗?
Java final关键字
3、Java 中 hashCode() 的作用
hashCode() 的作用是为了提高在散列结构存储中查找的效率,性表中没有作用;
只有每个对象的 hash 码尽可能不同才能保证散列的存取性能,事实上 Object 类提供的默认实现确实保证每个对象的 hash 码不同(在对象的内存地址基础上经过特定算法返回一个 hash 码)。
在 Java 有些集合类(HashSet)中要想保证元素不重复可以在每增加一个元素就通过对象的 equals 方法比较一次,那么当元素很多时后添加到集合中的元素比较的次数就非常多了,会大大降低效率。
于是 Java 采用了哈希表的原理,这样当集合要添加新的元素时会先调用这个元素的 hashCode 方法就一下子能定位到它应该放置的物理位置上(实际可能并不是),如果这个位置上没有元素则它就可以直接存储在这个位置上而不用再进行任何比较了,如果这个位置上已经有元素了则就调用它的 equals 方法与新元素进行比较,相同的话就不存,不相同就散列其它的地址,这样一来实际调用 equals 方法的次数就大大降低了,几乎只需要一两次,而 hashCode 的值对于每个对象实例来说是一个固定值。
参考:
详解equals()方法和hashCode()方法
浅谈Java中的hashcode方法

4、抽象类(abstract class)和接口(interface)有什么区别
定义好了student类,就可以根据student类创建student的实例,创建实例是通过类名+()实现的:。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
abstract class 类中定义的抽象方法必须在具体的子类中实现,所以不能有抽象构造方法或抽象静态方法,如类没有实现抽象父类中的所有抽象方法则子类也必须定义为 abstract 类型。
从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型java面试题及答案,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。在vc6.0里,用修饰符申明的变量可以不现式的写出变量类型,默认类型为int。并且这些成员的变量可以直接使用,并被默认初始化为第一个成员为0,后一个成员的值为前一个成员自动增1,也可以用等号“=”对成员变量进行初始化赋值。
具体的区别如下:
参考:
深入理解Java的接口和抽象类
Java 内部类详解
详解匿名内部类
5、为什么 ArrayList 的增加或删除操作相对来说效率比较低
硬盘分区魔术师是一套磁盘管理软件,是目前为止最好用的磁盘管理工具之一java面试题及答案,能够优化磁盘使应用程序和系统速度变得更快,不损失磁盘数据下调整分区大小,对磁盘进行分区,并可以在不同的分区以及分区之间进行大小调整、移动、隐藏、合并、删除、格式化、搬移分区等操作,可复制整个硬盘资料到分区,恢复丢失或者删除的分区和数据,无需恢复受到破坏的系统就可磁盘数据恢复或拷贝到其他磁盘。三、功能介绍1、记录服务器共享文件夹或共享文件的访问情况,包括读取、拷贝、修改、删除、重命名、打印等情况,可以记录访问者采用的登录账户、ip地址、mac地址、时间、访问时长、具体操作情况等。例如,对于一个文件系统的权限来说,用户a和b只具有查看和拷贝该文件系统下某些文件的权限,而用户c和d不仅有查看和拷贝文件的权限,也具有修改和删除文件的权限,这些权限的划分和授权需要事先通过专门管理员进行操作。
因为 ArrayList 中增加(扩容)或者是删除元素要调用 System.arrayCopy 这种效率很低的方法进行处理,所以如果遇到了数据量略大且需要频繁插入或删除的操作效率就比较低了,具体可查看 ArrayList 的 add 和 remove 方法实现,但是 ArrayList 频繁访问元素的效率是非常高的,因此遇到类似场景我们应该尽可能使用 LinkedList 进行替代效率会高一些。
参考:
Java集合系列[1]ArrayList源码分析
ArrayList和LinkedList的区别
6、 LinkedList 工作原理和实现
LinkedList 是以双向链表实现,链表无容量限制(但是双向链表本身需要消耗额外的链表指针空间来操作),其内部主要成员为 first 和 last 两个 Node 节点,在每次修改列表时用来指引当前双向链表的首尾部位。
所以 LinkedList 不仅仅实现了 List 接口,还实现了 Deque 双端队列接口(该接口是 Queue 队列的子接口),故 LinkedList 自动具备双端队列的特性,当我们使用下标方式调用列表的 get(index)、set(index, e) 方法时需要遍历链表将指针移动到位进行访问(会判断 index 是否大于链表长度的一半决定是首部遍历还是尾部遍历,访问的复杂度为 O(N/2)),无法像 ArrayList 那样进行随机访问。
使用三个指针表示前驱,当前和后继节点,每次将当前节点的next指向前驱节点,然后向后遍历直到链表末尾。如果链表不为空表,则执行9~13行的循环,遍历链表的各节点,直到找到链表的末尾。链表的中间插入需要对静态链表进行遍历,在遍历到指定位置之后进行操作。
参考:
Java集合系列[2]LinkedList源码分析
ArrayList和LinkedList的区别
Java 集合类详解
7、介绍 HashMap 的底层原理
当我们往 HashMap 中 put 元素时,先根据 key 的 hash 值得到这个 Entry 元素在数组中的位置(即下标),然后把这个 Entry 元素放到对应的位置中,如果这个 Entry 元素所在的位子上已经存放有其他元素就在同一个位子上的 Entry 元素以链表的形式存放,新加入的放在链头,从 HashMap 中 get Entry 元素时先计算 key 的 hashcode,找到数组中对应位置的某一 Entry 元素,然后通过 key 的 equals 方法在对应位置的链表中找到需要的 Entry 元素。
所以 HashMap 的数据结构是数组和链表的结合,此外 HashMap 中 key 和 value 都允许为 null,key 为 null 的键值对永远都放在以 table[0] 为头结点的链表中。
之所以 HashMap 这么设计的实质是由于数组存储区间是连续的,占用内存严重,故空间复杂度大,但二分查找时间复杂度小(O(1)),所以寻址容易而插入和删除困难;而链表存储区间离散,占用内存比较宽松,故空间复杂度小,但时间复杂度大(O(N)),所以寻址困难而插入和删除容易;
所以就产生了一种新的数据结构叫做哈希表,哈希表既满足数据的查找方便,同时不占用太多的内容空间,使用也十分方便,哈希表有多种不同的实现方法,HashMap 采用的是链表的数组实现方式。
数组、链表是基础,栈和队列深入一些但也不难,树挺重要的,比较重要的树avl树、红黑树,可以不了解它们的具体实现,但是要知道什么是二叉查找树、什么是平衡树,avl树和红黑树的区别。树形结构:元素之间存在一对多的关系,常见类型有:树(有许多特例:二叉树、平衡二叉树、查找树等)图形结构:元素之间存在多对多的关系,图形结构中每个结点的前驱结点数和后续结点多个数可以任意常用数据结构:数组(静态数组、动态数组)、线性表、链表(单向链表、双向链表、循环链表)、队列、栈、树(二叉树、查找树、平衡树、线索、堆)、图等的定义、存储和操作。b+树更适合更大更精确。
4. 简单的链表结构拥有很好的插入 删除节点性能, 但随机定位(获取链表第n个节点)操作性能不佳, 请你设计一种改进型的链表结构优化随机定位操作的性能, 给出设计思路及其改进后随机定位操作的时间复杂度。对链表进行选择排序的基本思想就是反复从还未排好序的那些节点中,选出键值(就是用它排序的字段,我们取学号num为键值)最小的节点,依次重新组合成一个链表。对链表进行冒泡排序的基本思想就是对当前还未排好序的范围内的全部节点,自上而下对相邻的两个节点依次进行比较和调整,让键值(就是用它排序的字段,我们取学号num为键值)较大的节点往下沉,键值较小的往上冒。

参考:
Java集合系列[3]HashMap源码分析
LinkedHashMap和HashMap的比较使用
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-115503-1.html
美方除了将部署空中巡逻和掩护配合此次行动外
理智爱国
没办法