语言基础 | ||
---|---|---|
堆/栈区别 | - 栈是系统编译器启动管理,不需要程序员手动管理 - 堆的释放由程序员手动管理,不及时回收容易产生内存泄露 - 栈有两种分配方式:静态分配和动态分配 - 堆是动态分配和回收内存的,没有静态分配的堆 - 栈是向低地址扩展的数据结构,是一块连续的内存区域 - 堆是向高地址扩展的数据结构,是不连续的内存区域 |
|
多态与重载的区别 | 多态也叫polymorphism, |
它是指某一抽象的类可以有多种实装类的结构.
重载OVERLOADING则是另外一种关系啦, 它是指类在不断细分的过程中(所谓继承关系), 子类对父类的方法可以改造的关系, |
| | Java基础几大特点,多态,抽象。抽象是怎么一回事,为了解决什么问题 | 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类不能实例化对象
** |
| | Object类有哪些方法? | toString()、notify()、notifyAll()、wait()、hashCode()、equals()。 |
| | final/finally/finalize的区别 | final 用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.
finally是异常处理语句结构的一部分,表示总是执行.
finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等 |
| | HashMap和HashTable的区别
哪个线程安全? | HashMap 类没有分类或者排序。它允许一个 null
键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
HashMap非线程安全 HashTable是线程安全的
如果要HashMap线程安全 自己手动加上synchronization实现同步 |
| | sleep()和wait()的区别 | sleep()方法正在执行的线程主动让出CPU
wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行 |
| | 什么是序列化?序列化的作用? | 序列化和反序列化用于将一个对象保存到文件,和从文件读取
简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。 |
| | 一个序列化的类,如果增加了一个字段,而反序列化一端没有增加这个字段,会产生什么样的后果? | |
| | JDK1.5提供了哪些新特性? | 泛型、注解、for…each…循环、AutoBoxing、可变长度的参数、System.printf()方法、静态import |
| 数据结构 | | |
| | 什么情况下比较适合使用数组,什么情况下比较适合使用链表 | 访问操作多的时候使用数组比较合适,插入删除操作比较多的时候比较适合使用链表 |
| | 有向图/无向图的区别 | 每条边都是有方向的
每条边都是没有方向的 |
| | 如何计算一个满二叉树的叶子节点数量?如何计算一个满二叉树的节点数量? | |
| | 什么是平衡二叉树?如何调整一个二叉树为一个平衡二叉树? | |
| SQL | | |
| | 请说明一下DISTINCT有什么作用? | 关键词 DISTINCT 用于返回唯一不同的值 |
| | GROUP BY语句有什么作用? | |
| | 简述having语句就和where语句的功能区别? | having必须跟分组函数。而where无限制。
sql语句的Group by 后只能跟Having条件语句 |
| 基础算法 | | |
| | 请简述堆排序的步骤 | 步骤一 构造初始堆。将给定无序序列构造成一个大顶堆
步骤二 将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换 |
| | 希尔排序、归并排序 | |
| | 象棋中将和帅是不能对面的,假设现在棋盘上只有将和帅2个棋子,在只允许开辟一个变量的情况下,输出将和帅在棋盘上所有允许出现的情况。 | 开辟一个变量,这个变量分字节用,一个字节还能有8位 |
| | 有2个数组,请使用一次循环找出这2个数组中甲数组有乙数组没的,甲数组没的乙数组有的和甲乙数组都有的数据。 | 先对2个数组进行排序,然后找2个指针分别指向两个数组的头部,然后将数组中的两个数据进行比较,若甲数组值和乙数组值相等,则说明甲乙数组中都有,指针同时都往后移一个,如果甲数组值大于乙数组值,则说明乙有甲没有,指向乙数组的指针往后移一个,然后继续比较,如果甲数组值比乙数组值小,则说明甲数组有乙数组没。以此类推,2个指针都到达数组尾部的时候,比较结束。 |
| 操作系统 | | |
| | ACID | ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction
processing)当中无法保证数据的正确性,交易过程极可能达不到交易方的要求。 |
| | 线程/进程的区别 | 线程是指进程内的一个执行单元,也是进程内的可调度实体.
与进程的区别:
(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;
(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
(3)线程是处理器调度的基本单位,但进程不是. |
| Linux命令 | 你常用的三个linux 命令 | 临场发挥 |
| | 有一个文本文件,请使用一条Linux命令统计这个文件中某个单词出现的次数。 | grep -c $$$ |
| 网络基础 | | |
| | OSI七层模型 |
|
| | TCP/UDP区别,哪个安全 | TCP提供的是面向连接的、可靠的数据流传输,而UDP提供的是非面向连接的、不可靠的数据流传输。
简单的说,TCP注重数据安全,而UDP数据传输快点,但安全性一般 |
| | 信号驱动IO/多路复用IO的区别 | select()你必须阻塞知道事件发生,而信号驱动I/O不用,你可以干你的事,等事件发生了通知你 |
| | HTTP协议与SMTP协议有哪些区别 | HTTP协议用在网页。POP3和SMTP用在邮件收发 |
Core Java | ||
---|---|---|
问题领域 | 问题 | 参考答案 |
异常处理 | Catched |
Exception/RuntimeException的区别 | 前者是代码中可捕获的预期的异常,后者是不可预期的运行时异常,比如OutOfMemoryException、NullPointException |
| | try代码块中有return的话finally代码块中还会执行吗? | 会执行 |
| Object类 | Object类有哪些方法? | toString()、notify()、notifyAll()、wait()、hashCode()、equals()。 |
| | hashCode()方法的原始实现是怎么做的? | 答到根据对象所存储内存地址计算即可。 |
| | 重写了equals()后还需要重写什么方法?为什么? | 还需要重写hashCode()方法。因为在往HashSet这样的类中add元素的时候,如果不重写hashCode()方法,会导致两个对象equals()比较时返回为true时,两个对象都能被add进去,而事实上HashSet是不能add两个相同的对象的。 |
| 面向对象 | abstract class和interface的区别 | |
| | 重写(overwrite)、重载(overload)和覆盖(override)三者之间的区别 | 重载:子类继承了父类的同名有参函数。当子类继承了父类的一个同名方法,且方法参数不同,称为重载。通过方法的重载,子类可以重新实现父类的某些方法,使其具有自己的特征。
重写:当前类的同名方法。通过方法的重写,一个类可以有多个具有相同名字的方法,由传递给它们不同的个数和类型的参数来决定使用哪种方法。因此,重写的名称是当前类中的同名函数,不是父类中的函数名。
覆盖:子类继承了父类的同名无参函数。当子类从父类继承了一个无参函数,而又定义了一个同样的无参函数,则子类定义的方法覆盖父类的方法,称为覆盖。 |
| | final/finally/finalize的区别 | final:
用于修饰类、成员变量和成员方法。final修饰的类,不能被继承(String、StrngBuilder、StringBuffer、Math,不可变类),其中所有的方法都不能被重写,所有不能同时用abstract和final修饰(abstract修饰的是抽象类,抽象类是用于被子类继承的,和final起相反的作用);final修饰的方法不能被重写,但是子类可以用父类中final修饰的方法;final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象中的内容是允许改变的。
finally:
finally是在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出、捕获都会被执行。try块中的内容是在无异常时执行到结束。catch块中的内容,是在try块内容发生catch所声明的异常时,跳转到catch块中执行。finally块则是无论异常是否发生都会执行finally块的内容,所以在代码逻辑中有需要无论发生什么都必须执行的代码,可以放在finally块中。
finalize:
finalize是方法名,java技术允许使用finalize()方法在垃圾收集器将对象从内存中清楚出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的,它是在Object类中定义的,因此所有的类都继承了它。子类覆盖finalize()方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之前对这个对象调用的。 |
| | 简述public、protected、private和不加修饰符的访问权限 | |
| IO/NIO | | |
| 容器类 | ArrayList和LinkedList的区别 | |
| | Array和Arrays的区别 | |
| | List和Vector的区别 | |
| | List和Set的区别 | |
| | ArrayList的实现原理 | |
| | HashMap和HashTable的区别 | |
| | HashMap是如何处理Hash碰撞的 | |
| | HashMap的实现原理 | |
| 多线程 | 实现多线程有哪几种方法? | |
| | 启动一个线程是使用start()方法还是run()方法? | |
| | sleep()和wait()的区别 | |
| | notify()和notifyAll()的区别 | notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
notify他只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁,此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。 |
| | 一个类中有2个同步方法,两个不同的线程是否可以并发的分别访问这个类的同一个实例的这2个不同的同步方法? | 不可以,因为当一个线程进入其中一个同步方法的时候它就获得了这个对象的锁,另个线程尽管是访问这个对象的另一个同步方法,但它也必须等待这个对象的对象锁释放后才能访问。 |
| | 一个主线程开启10个子线程,10个子线程执行完毕后主线程继续,如何实现这样一个线程同步? | |
| | ThreadLocal的作用 | |
| | volatile关键字的意义和使用场景 | |
| 序列化 | 什么是序列化?序列化的作用? | |
| | 一个序列化的类,如果增加了一个字段,而反序列化一端没有增加这个字段,会产生什么样的后果? | |
| 反射 | | |
| 新特性 | JDK1.5提供了哪些新特性? | 泛型、注解、for…each…循环、AutoBoxing、可变长度的参数、System.printf()方法、静态import |
| | List