1.关于抽象类:

抽象类不能使用final关键字声明,因为使用final关键字声明的类不能被子类所继承

抽象方法不要使用private声明,因为使用private声明了就不能被子类覆写

2.接口:

Java接口可以理解为一种特殊的类,是由全局常量公共的抽象方法所组成,定义在接口中的方法默认是public

接口如果不写public,则也是public访问权限,不是default

与抽象类一样,接口若要使用也必须通过子类,子类通过implements关键字实现接口。

一个子类可以同时实现多个接口,摆脱了Java的单继承局限

3.transient关键字:

将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化。

4.接口可以用extends关键字继承。

5.static代码块:

static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

6.final关键字:

修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。

7.throw和throws的区别:

(1)throws出现在方法函数头;而throw出现在函数体。
(2)throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。
(3)两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。 

8.Class.forName()相关总结:

newInstance(): 弱类型,低效率,只能调用无参构造。
new: 强类型,相对高效,能调用任何public构造。
Class.forName(“”)返回的是类。
Class.forName(“”).newInstance()返回的是object 。

9.doGet和doPost的区别:

生成方式:

get方式有四种:1)直接在URL地址栏中输入URL。2)网页中的超链接。3)form中method为get。4)form中method为空时,默认是get提交。
post只知道有一种:form中method属性为post。
总结:在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式。
其他见:https://www.cnblogs.com/alsf/p/9133951.html
10.jsp相关:
JSP = HTML + Java片段(各种标签本质上还是Java片段)
11.JDK与JRE区别:

JDK:Java开发工具包(Java Development Kit),提供了Java的开发环境和运行环境。

JRE:Java运行环境(Java Runtime Environment),提供了Java运行所需的环境。

JDK包含了JRE。如果只运行Java程序,安装JRE即可。要编写Java程序需安装JDK.

12.为什么java语言不支持多重继承:

为了程序的结构能够更加清晰从而便于维护。假设Java语言支持多重继承,类C继承自类A和类B,如果类A和B都有自定义的成员方法f(),那么当代码中调用类C的f()会产生二义性。Java语言通过实现多个接口间接支持多重继承,接口由于只包含方法定义,不能有方法的实现,类C继承接口A与接口B时即使它们都有方法f(),也不能直接调用方法,需实现具体的f()方法才能调用,不会产生二义性。

多重继承会使类型转换、构造方法的调用顺序变得复杂,会影响到性能。

13.final,finally,finalize的区别是什么:

final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可继承。

finally作为异常处理的一部分,只能在try/catch语句中使用,finally附带一个语句块用来表示这个语句最终一定被执行,经常被用在需要释放资源的情况下。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的finalize()方法。当垃圾回收器准备好释放对象占用空间时,首先会调用finalize()方法,并在下一次垃圾回收动作发生时真正回收对象占用的内存。

14.出现在java程序中的finally代码块是否一定会执行:

当遇到下面情况不会执行。

1.当程序在进入try语句块之前就出现异常时会直接结束。

2.当程序在try块中强制退出时,如使用System.exit(0),也不会执行finally块中的代码。

其它情况下,在try/catch/finally语句执行的时候,try块先执行,当有异常发生,catch和finally进行处理后程序就结束了,当没有异常发生,在执行完finally中的代码后,后面代码会继续执行。值得注意的是,当try/catch语句块中有return时,finally语句块中的代码会在return之前执行。如果try/catch/finally块中都有return语句,finally块中的return语句会覆盖try/catch模块中的return语句。

15.static关键字的作用:

static的主要作用有两个:

1.为某种特定数据类型或对象分配与创建对象个数无关的单一的存储空间。

2.使得某个方法或属性与类而不是对象关联在一起,即在不创建对象的情况下可通过类直接调用方法或使用类的属性。

具体而言static又可分为4种使用方式:

1.修饰成员变量。用static关键字修饰的静态变量在内存中只有一个副本。只要静态变量所在的类被加载,这个静态变量就会被分配空间,可以使用''类.静态变量''和''对象.静态变量''的方法使用。

2.修饰成员方法。static修饰的方法无需创建对象就可以被调用。static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和静态成员方法。

3.修饰代码块。JVM在加载类的时候会执行static代码块。static代码块常用于初始化静态变量。static代码块只会被执行一次。

4.修饰内部类。static内部类可以不依赖外部类实例对象而被实例化。静态内部类不能与外部类有相同的名字,不能访问普通成员变量,只能访问外部类中的静态成员和静态成员方法。

16.运算符==与equals的区别:

== 比较的是引用,equals比较的是内容。

1.如果变量是基础数据类型,== 用于比较其对应值是否相等。如果变量指向的是对象,== 用于比较两个对象是否指向同一块存储空间。

2.equals是Object类提供的方法之一,每个Java类都继承自Object类,所以每个对象都具有equals这个方法。Object类中定义的equals方法内部是直接调用 == 比较对象的。但通过覆盖的方法可以让它不是比较引用而是比较数据内容。

17.java中Class对象:

java中对象可以分为实例对象和Class对象,每一个类都有一个Class对象,其包含了与该类有关的信息。

获取Class对象的方法:

1.Class.forName(“类的全限定名”)

2.实例对象.getClass()

3.类名.class

18.简述元注解

元注解可以理解为注解的注解,即在注解中使用,实现想要的功能。其具体分为:

1.@Retention: 表示注解存在阶段是保留在源码,还是在字节码(类加载)或者运行期(JVM中运行)。

2.@Target:表示注解作用的范围。

3.@Documented:将注解中的元素包含到 Javadoc 中去。

4.@Inherited:一个被@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。

5.@Repeatable:被这个元注解修饰的注解可以同时作用一个对象多次,但是每次作用注解又可以代表不同的含义。

19.Java基本数据类型:

byte: 占用1个字节,取值范围-128 ~ 127

short: 占用2个字节,取值范围-2^15^ ~ 2^15^-1

int:占用4个字节,取值范围-2^31^ ~ 2^31^-1

long:占用8个字节

float:占用4个字节

double:占用8个字节

char: 占用2个字节

boolean:占用大小根据实现虚拟机不同有所差异

20.简述Java的多态:

Java多态可以分为编译时多态和运行时多态。

编译时多态主要指方法的重载,即通过参数列表的不同来区分不同的方法。

运行时多态主要指继承父类和实现接口时,可使用父类引用指向子类对象。

运行时多态的实现:主要依靠方法表,方法表中最先存放的是Object类的方法,接下来是该类的父类的方法,最后是该类本身的方法。如果子类改写了父类的方法,那么子类和父类的那些同名方法共享一个方法表项,都被认作是父类的方法。因此可以实现运行时多态。

21.关于内部类:

成员内部类:作为成员对象的内部类。可以访问private及以上外部类的属性和方法。外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法。外部类也可访问private修饰的内部类属性。

局部内部类:存在于方法中的内部类。访问权限类似局部变量,只能访问外部类的final变量。

匿名内部类:只能使用一次,没有类名,只能访问外部类的final变量。

静态内部类:类似类的静态成员变量。

 22.Java序列化与反序列化:

序列化:将java对象转化为字节序列,由此可以通过网络对象进行传输。

反序列化:将字节序列转化为java对象。

具体实现:实现Serializable接口,或实现Externalizable接口中的writeExternal()与readExternal()方法。

23.Externalizable与Serializable的异同:

1.序列化内容
Externalizable自定义序列化可以控制序列化的过程和决定哪些属性不被序列化。

2.Serializable序列化时不会调用默认的构造器,而Externalizable序列化时会调用默认构造器的

3.使用Externalizable时,必须按照写入时的确切顺序读取所有字段状态。否则会产生异常。例如,如果更改ExternalizableDemo类中的number和name属性的读取顺序,则将抛出java.io.EOFException。而Serializable接口没有这个要求。

24.Java的list:

List是一个有序队列,在JAVA中有两种实现方式:

ArrayList 使用数组实现,是容量可变的非线程安全列表,随机访问快,集合扩容时会创建更大的数组,把原有数组复制到新数组。

LinkedList 本质是双向链表,与 ArrayList 相比插入和删除速度更快,但随机访问元素很慢。

25.Java中线程安全的基本数据结构有哪些:

HashTable: 哈希表的线程安全版,效率低

ConcurrentHashMap:哈希表的线程安全版,效率高,用于替代HashTable

Vector:线程安全版Arraylist

Stack:线程安全版栈

BlockingQueue及其子类:线程安全版队列

26.Java的set:

Set 即集合,该数据结构不允许元素重复且无序。JAVA对Set有三种实现方式:

HashSet 通过 HashMap 实现,HashMap 的 Key 即 HashSet 存储的元素,Value系统自定义一个名为 PRESENT 的 Object 类型常量。判断元素是否相同时,先比较hashCode,相同后再利用equals比较,查询O(1)

LinkedHashSet 继承自 HashSet,通过 LinkedHashMap 实现,使用双向链表维护元素插入顺序。

TreeSet 通过 TreeMap 实现的,底层数据结构是红黑树,添加元素到集合时按照比较规则将其插入合适的位置,保证插入后的集合仍然有序。查询O(logn)

27.Java的TreeMap:

TreeMap是底层利用红黑树实现的Map结构,底层实现是一棵平衡的排序二叉树,由于红黑树的插入、删除、遍历时间复杂度都为O(logN),所以性能上低于哈希表。但是哈希表无法提供键值对的有序输出,红黑树可以按照键的值的大小有序输出。

28.Collection和Collections区别:

1.Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如List、Set等。

2.Collections是一个包装类,包含了很多静态方法、不能被实例化,而是作为工具类使用,比如提供的排序方法: Collections.sort(list);提供的反转方法:Collections.reverse(list)

29.ArrayList、Vector和LinkedList有什么共同点和区别:

1.ArrayList、Vector和LinkedList都是可伸缩的数组,即可以动态改变长度的数组。

2.ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会在内存中开辟一块连续的空间来存储,支持下标、索引访问。但在涉及插入元素时可能需要移动容器中的元素,插入效率较低。当存储元素超过容器的初始化容量大小,ArrayList与Vector均会进行扩容。

3.Vector是线程安全的,其大部分方法是直接或间接同步的。ArrayList不是线程安全的,其方法不具有同步性质。LinkedList也不是线程安全的。

4.LinkedList采用双向列表实现,对数据索引需要从头开始遍历,因此随机访问效率较低,但在插入元素的时候不需要对数据进行移动,插入效率较高。

30.HashMap和Hashtable有什么区别:

1.HashMap是Hashtable的轻量级实现,HashMap允许key和value为null,但最多允许一条记录的key为null.而HashTable不允许。

2.HashTable中的方法是线程安全的,而HashMap不是。在多线程访问HashMap需要提供额外的同步机制。

3.Hashtable使用Enumeration进行遍历,HashMap使用Iterator进行遍历。

31.fail-fast和fail-safe迭代器的区别是什么:

1.fail-fast直接在容器上进行,在遍历过程中,一旦发现容器中的数据被修改,就会立刻抛出ConcurrentModificationException异常从而导致遍历失败。常见的使用fail-fast方式的容器有HashMap和ArrayList等。

2.fail-safe这种遍历基于容器的一个克隆。因此对容器中的内容修改不影响遍历。常见的使用fail-safe方式遍历的容器有ConcurrentHashMap和CopyOnWriteArrayList。

32.HashSet中,equals与hashCode之间的关系:

equals和hashCode这两个方法都是从object类中继承过来的,equals主要用于判断对象的内存地址引用是否是同一个地址;hashCode根据定义的哈希规则将对象的内存地址转换为一个哈希码。HashSet中存储的元素是不能重复的,主要通过hashCode与equals两个方法来判断存储的对象是否相同:

1.如果两个对象的hashCode值不同,说明两个对象不相同。

2.如果两个对象的hashCode值相同,接着会调用对象的equals方法,如果equlas方法的返回结果为true,那么说明两个对象相同,否则不相同。