PS:这些是在面试过程中遇到的或复习过程中在别人博客中看到的题目,以及我整理的答案(一些还没找到答案,后面陆续补齐),如果还有哪些常被问到的题目没列出或文章有任何错漏,欢迎评论区指出。
1、使用length属性获取数组长度,public、private、protected、friendly区别 。
答:public、private、protected、friendly访问权限:
2、Collection和Collections区别 。
答:1、java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。
2、java.util.Collections 是一个包装类(工具类/帮助类)。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,用于对集合中元素进行排序、搜索以及线程安全等各种操作,服务于Java的Collection框架。
3、String s=new String(‘xyz’);创建了几个object对象 。
答:两种情况:
1、常量池中有"xyz"时,只在堆中创建了一个对象;
2、常量池中没有"xyz"时,在常量池和堆中都创建了对象,即两个。
4、short 数据类型。
s1=s1+1;是否有错?
答:有错,因为1是int类型,则(s1+1)为int类型,int转化为short为向下转换,需强制转换,即s1=(short)(s1+1)。
5、Overriding和Overloading区别
答:方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现。二者的差别在于,重载是编译时多态,重写是运行时多态。重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding) 。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了.
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型或有不同的参数次序,则称为方法的重载(Overloading)。不能通过访问权限、返回类型、抛出的异常进行重载.
6、Set里面的元素不能重复,用什么方法区分重复与否。
答:用equals;==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。再看一下Set里面存的是对象,还是对象的引用。根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,也就出现了重复元素。所以应该用equals()来判断。
7、常见的runtime exception。
答:
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常
SQLException - 操作数据库异常类
ClassNotFoundException - 异常的解释是"指定的类不存在"
UnsupportedOperationException - 不支持的操作异常
8、error和exception区别。
答:
Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的;
Exception(异常)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的。
参考 : Error与Exception的区别
9、List和Set是否继承自Collection接口?
答:是。
List特点:元素有放入顺序,元素可重复
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
10、abstract class和interface 的区别。
答:含有abstract修饰符的class即为抽象类,abstract 类不能创建实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法;
2.抽象类中可以有普通成员变量,接口中没有普通成员变量;
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法;
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型;
5. 抽象类中可以包含静态方法,接口中不能包含静态方法;
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
11、是否可以继承String类。
答:不可以,因为String类有final修饰符,而final修饰的类是不能被继承的。
12、try{}里有一个return语句,紧跟在try后的finally里的code会不会被执行,什么时候执行,return前执行还是return后执行。
答:会执行,finally语句是在try的return语句执行之后,return返回之前执行。
13、最有效率的方法算2*8等于几
答:2 << 3,
因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3。
14、两个对象值相同,x.equal(y)==true,但是却可有不同的hashcode,这句话对不对。
答:按照Java的规范:
1) 对象相等则hashCode一定相等;
2) hashCode相等对象未必相等
这句话是错的,但是,如果一个类只重写了Object的equals而没重写其hashcode方法时,这句话有可能是对的。
15、值传递和引用传递
答:Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!
当参数为基本类型时,传给形参的是一个数值的副本,即传值;当参数为引用类型时,传给形参的是引用对象对应的地址值,也是值传递。
按值传递的精髓是:传递的是存储单元中的内容,而不是存储单元的引用!
16、switch是否作用在byte、long、string上。
答:在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型,由于,byte,short,char都可以隐含转换为int,所以,这些类型以及这些类型的包装类型也是可以的。显然,long和String类型都不符合switch的语法规定,并且不能被隐式转换成int类型,所以,它们不能作用于swtich语句中。
另外由于在JDK7.0中引入了新特性,所以witch语句可以接收一个String类型的值,String可以作用在switch语句上
17、ArrayList和Vector区别,HashMap和Hashtable区别(了解这几个类的底层jdk中的编码方式)。
答:
相同点:
1、ArrayList和Vector都是继承了相同的父类和实现了相同的接口(List)
2、底层都是数组实现的
3、初始默认长度都为10。
不同点:
1) Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
HashMap和Hashtable区别:
1)Hashtable既不支持Null key也不支持Null value;HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null;
2)Hashtable是线程安全的,HashMap不是线程安全的;但是HashMap效率更高。
3)Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。(之所以会有这样的不同,是因为Hashtable和HashMap设计时的侧重点不同。Hashtable的侧重点是哈希的结果更加均匀,使得哈希冲突减少。当哈希表的大小为素数时,简单的取模哈希的结果会更加均匀。而HashMap则更加关注hash的计算效率问题。在取模计算时,如果模数是2的幂,那么我们可以直接使用位运算来得到结果,效率要大大高于做除法)
18、GC是什么,为什么要有GC,简单介绍GC。
答:GC就是垃圾回收的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。垃圾回收可以有效的防止内存泄漏,有效的使用可以使用的内存。
垃圾回收器,通常是作为一个单独的低优先级线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。简单来说就是JVM会把不会再被引用的对象当成垃圾,系统后台会自动调用垃圾回收的线程进行垃圾回收,但垃圾回收无法通过人为准确控制,即使是调用system.gc()也只是通知JVM调用垃圾回收,但具体调不调用,何时调用,无法准确控制。
回收机制:虚拟机内存主要分为新生代、老年代和持久代,持久代主要存类信息和与类相关的静态变量等信息,发生垃圾回收概率极小,一般不做考虑。所以我们说的gc一般指新生代和老年代的垃圾回收,新创建的对象分配到新生代,经过几次minorGC仍然存活的对象,则会进入老年代,老年代满时会触发fullGC,fullGC发生频率较低,对象存活率较高,一般采用标记清除或标记整理算法,而新生代的对象存活率很低,因此一般采用复制算法。
19、float f=3.4是否正确。
答:错误,3.4默认是double,double到float为向下转换,需要强制转换,正确写法是 float f = 3.4f。
20、介绍Java中的Collection framework。
答:
Java collection是java提供的工具包,包含了常用的数据结构:集合、链表、队列、栈、数组、映射等。
Java集合主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator、Arrays和Collections)。
21、Collection框架中实现比较方法 。
答:实现comparable接口,实现compareTo方法。
22、String和Stringbuffer的区别 。
答:String为字符串常量,而StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后者的对象是变量,是可以更改的。StringBuffer效率比String快。
23、final、finally、finalize区别 。
答:
final:在java中,final可以用来修饰类,方法和变量(成员变量或局部变量);当用final修饰类的时,表明该类不能被其他类所继承;当final修饰方法时,把方法锁定,以防止继承类对其进行更改。当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。
finally:finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常)------一般情况下,经常被用在需要释放资源的情况下。
finalize:finalize()是java.lang.Object中定义的,也就是说每个对象都有该方法,当该对象要被垃圾回收时,调用此方法。但是根据java垃圾回收器的特性,这个方法不一定会被调用。一个对象的finalize()方法只会被调用一次,而即使finalize()方法被调用,也不意味着该对象一定会被回收,所以有可能出现,此方法被调用了,而该对象又不需要回收了,而当对象真正需要回收时,由于之前已经执行过它的finalize()方法,所以不会再被执行而出现问题。
24、面向对象的特征 。
答:继承、封装、多态
25、String是最基本的数据类型吗。
答:不是;Java8答基本数据类型:字节型(byte),短整型(short),整型(int),长整型(long),字符型(char),浮点型(float),双精度型(double),布尔型(boolean)
26、运行时异常和一般异常的区别 。
答: Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked).
一般异常需要在程序中处理或者抛出,而运行时异常不需要,碰到RuntimeException,那么一定是程序存在逻辑错误,要对程序进行修改(相当于调试的一种方法);只有已检查异常(一般异常)才是程序员所关心的,程序应该且仅应该抛出或处理已检查异常.
27、说出ArrayList、Vector、Linkedlist的存储性能和特性 。
答:
1、Vector、ArrayList都是以类似数组的形式存储在内存中,LinkedList则以链表的形式进行存储。
2、Vector线程同步,ArrayList、LinkedList线程不同步。
3、LinkedList适合指定位置插入、删除操作,不适合查找;ArrayList、Vector适合查找,不适合指定位置的插入、删除操作。
4、ArrayList在元素填满容器时会自动扩充容器大小的50%,而Vector则是100%,因此ArrayList更节省空间。
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!
28、heap和stack区别 。
答:
1). 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。
2). 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共享,详见第3点。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
3). Java中的数据类型有两种。
一种是基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char(注意,并没有string的基本类型)。这种类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。值得注意的是,自动变量存的是字面值,不是类的实例,即不是类的引用,这里并没有类的存在。如int a = 3; 这里的a是一个指向int类型的引用,指向3这个字面值。这些字面值的数据,由于大小可知,生存期可知(这些字面值固定定义在某个程序块里面,程序块退出后,字段值就消失了),出于追求速度的原因,就存在于栈中。
4).stack的空间由操作系统自动分配和释放,heap的空间是手动申请和释放的,heap常用new关键字来分配。
5).stack空间有限,heap的空间是很大的自由区。
另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。
29、Java中的异常处理机制的简单原理和应用。
答: 异常就是程序运行时发生的不正常情况或者错误,Java对异常进行了分类,Java异常的根类是Throwable,派生出两个子类:Error和Exception,Error是系统发生的比较严重的错误,一般只能通过重新启动克服,如内存溢出或者死锁;而Exception是可以克服或者处理的,Exception又分为编译时异常(checked)和运行时异常(unchecked),编译器会强制要求对编译时异常进行处理(通过try...catch或者throws抛出),如IO异常等,而运行时异常则不强制要求处理,如空指针异常,数组越界异常等。
30、垃圾回收的原理和特点,并考虑2种回收机制 。
答:(参考地18题 )
回收机制:
minorGC:一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发minorGCGC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。
FullGC:对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比minorGC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。
有如下原因可能导致Full GC:
1.年老代(Tenured)被写满
2.持久代(Perm)被写满
3.System.gc()被显示调用
4.上一次GC之后Heap的各域分配策略动态变化
31、说出一些常用的 集合类和方法 。
答:ArrayList、HashMap、LinkedList、Vector
方法:Collections.sort(list)、Collections.max(list)、 Collections.reverse(list)、Collections.replaceAll(list)、Collections.synchronizedList(list)
32、描述一下JVM加载Class文件的原理和机制 。
答:
由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2)如果类中存在初始化语句,就依次执行这些初始化语句。
类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。 从Java 2(JDK 1.2)开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明:
Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);
Extension:从java.ext.dirs系统属性所指定的目录中加载类库,它的父加载器是Bootstrap;
System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。
33、排序的几种方法,了解。(算法和数据结构在面试的时候还没有被问到。
答:
34、Java语言如何进行异常处理,throws,throw,try catch finally代表什么意义,try块中可以抛出异常吗 ?
答:
throws关键字通常被应用在声明方法时,用来指定可能抛出的异常。多个异常可以使用逗号隔开。
throw关键字通常用在方法体中,并且抛出一个异常对象。程序在执行到throw语句时立即停止,它后面的语句都不执行。通过throw抛出异常后,如果想在上一级代码中来捕获并处理异常,则需要在抛出异常的方法中使用throws关键字在方法声明中指明要跑出的异常;如果要捕捉throw抛出的异常,则必须使用try—catch语句。可见,throw可以主动抛出异常,也就是可以在try中抛出异常。
35、一个’.java’源文件是否可以包括多个类,有什么限制。
答:可以有多个类,但只能有一个public类,并且public的类名必须与文件名相一致。
36、Java中有几种类型流,jdk为每种类型的流提供了一些抽象类以供继承,请分别说出它们是哪些类。
37、Java中会存在内存泄漏吗,请简单描述。
答:java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。
38、静态变量和实例变量的区别。
答:
静态变量从属于类,实例变量从属于对象;
实例变量必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量;
静态变量即类别量,只要程序加载了类的字节码,静态变量就会被分配空间,即可使用;
综上,实例变量必须创建对象后通过这个对象来使用,静态变量可以直接使用类名来引用。
39、什么是Java序列化,如何实现java序列化。
答:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
40、是否可以从一个static方法内部发生对非static方法调用。
答:不可以,除非在static方法内实例化该对象,否则不行;因为非static方法依赖于对象,而static方法依赖于类,static方法可以通过类名调用而无需创建对象,当通过类名调用时还没实例化对象,此时static方法内的非static方法关联于哪个对象上呢?因此不行。
41、写clone方法,通常都有一行代码。
答:super.clone();
42、Java中如何跳出多重嵌套循环 ?
答:
方法一:可以在需要的循环语句前定义一个标号,
然后在里层循环体的代码中使用带有标号的break语句,即可跳出外层循环
方法二:可以在需要的循环条件内加入一个boolean类型的判断,需要的时候将此变量值反转,再break当前循环即可跳出。
Java中如何指定跳出多重嵌套循环
43、说出常用类、包、接口,各举5个。
答:类:String、Integer、Long 、File 、Date、Thread
包:java.lang.*、java.io.*、java.util.*、java.sql.* 、java.math.*;
接口:Comparable 、Collection、Serializable、Map、List
44、Java中实现线程的方法,用关键字修饰同步方法。
45、同步和异步区别。
46、线程同步的方法。
答:synchronized;
JAVA中线程同步的方法
47、字符串常用方法,字符串转化为整型数方法,整型数转化为字符串方法。
答:length()、endsWith()、equals()、trim()、indexOf(int);
字符串转化为整型:Integer.parseInt(String)
整型转化为字符串:String.valueOf(int)、 int + "";
1、简述面向对象的理解,并举例说出你的理解。
2、写出单例模式。
3、写出一种11位手机号的正则表达式
4、实现字符串多个空格转换一个空格
5、字符串常用方法,substring(),split()。
6、start()和run()区别。
7、写出知道的设计模式。
8、Webservice介绍。(这个我自己没用过,渣渣了)
9、说出Servlet生命周期,Servlet和CGI区别。
10、sleep和wait的区别。
11、什么是发射,如何实现。
12、检查字符串回文,实现英文中单词个数和单词次数统计(部分公司要求较高,需要手动编程,百度查找一些面试常用编程题即可)。
13、tcp/ip协议三次握手。
14、http协议几种请求方式,区别。
15、Ajax请求是否可以实现同步。
16、隐藏URL方式。
17、描述取到一个网页内容的实现步骤,不需要具体实现过程(就是爬虫:取到网页的URL,然后从URL中国获取网页内容),考察逻辑思维能力。
18、简述form表单提交post方法与get方法在字符编码、http协议方面的区别。
19、一个http请求从开始到结束都经历了哪些过程,简写流程图。
1、Spring中的事务管理,支持哪几种方式,以及每种方式具体方法。
2、Spring常用注解。
3、Hibernate的缓存级别。
4、hibernate是什么,工作原理。
5、hibernate如何实现延迟加载。
6、hibernate如何怎样类之间的关系。
7、struts1是什么,工作流程。
8、struts2工作流程。
9、spring是什么。
10、介绍IOC和AOP。
11、springmvc工作原理。
12、Mybatis工作流程。
13、Mybatis与Hibernate区别。
14、Mybatis框架传递参数方式。
15、简述Spring事务管理,使用什么设计模式实现。
1、数据库里面的索引和约束是什么。
2、用SQL语句实现oracle分页查询。
3、学生成绩表的常用查询(百度即可查到,常用的查询语法)
4、数据库性能优化常用基础知识,百万级数据优化(百度搜搜即可)。
5、left join ,right join用法。
6、了解redis,memcache,mongodb等,最好有项目使用经验。
7、如何防止SQL注入。
8、一个微博评论功能的数据库设计,部门表和员工表的设计,权限管理系统的数据库设计(数据库设计这个是一个重点,面试了几家公司都问到了,而且是重点)。
9、简述悲观锁和乐观锁。
1、修改系统时间命令、修改权限命令、等命令。
1、javascript中怎样选中一个checkbox,设置它无效的方式。
答:document.getElementById("checkemail").disabled=true;
2、form表单 的input可以设置readonly和disable区别。
答:readonly不可编辑,但可以选择和复制;值可以传递到后台
disabled不能编辑,不能复制,不能选择;值不可以传递到后台
3、javascript变量范围有什么不同,全局变量和局部变量。
答:
4、列举3种数据类型。
答:number、string、boolean、undefined、null
5、javascript常用对象 。
答:string、Math、Date
6、javascript中常用的取值赋值方法,对于单选按钮,复选框等的取值赋值等方法。(百度即可,javascript常用基础)。
答:element.value();
单选框:var radio=document.getElementsByName("radio");
选中:radio[i].checked==true
取值: radio[i].vaule;
复选框:类似-----
var checkbox=document.getElementsByName("checkbox");
选中:checkbox[i].checked==true
取值: checkbox[i].vaule;
7、jquery取值赋值基本方法。
答:$.val();
8、获取单选按钮的值,获取复选框的值,获取下拉列表的值,后去复选框的值,获取单选按钮组的值,文本框、文本域赋值。
9、jquery的append与appendTo区别。
10、CSS盒子模型的4个顺序。
辛苦手打,如果有任何错误,欢迎指正!
1.volatile有什么用?
答:保证不同线程对这个变量操作的可见性,也就是说,一个线程修改了某个变量的值,这个新值对其他线程来说都是可见的。
2.Minor GC和Full GC的触发时机
答:
Minor GC触发条件:当Eden区满时,触发Minor GC。
Full GC触发条件:
(1)调用System.gc时,系统建议执行Full GC,但是不必然执行
(2)老年代空间不足
(3)方法去空间不足
(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
(5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
3.反射用到了哪些接口,哪些类?
答:Field、Method、Constructor、Class
4.反射机制中可以获取private成员的值吗?
答:可以,field.setAccessible(true)
5.Java中sleep方法和wait方法的区别。
答:
1、sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);
wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。
2、sleep()方法可以在任何地方使用;
wait()方法则只能在同步方法或同步块中使用;
3、sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;
wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;
6.Java中有哪些注解?在SpringMVC中,requestmapping是自定义注解,问:如何实现自定义注解?
答: @Override---重写、@Deprecated-----(过期)、
@SuppressWarnings
(
"deprecation"
) -----忽略警告
自定义注解:
@Target({ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Description {
String desc();
String author();
int age() default 18;
}
@Target是这个注解的作用域,ElementType.METHOD
是这个注解的作用域的列表,METHOD
是方法声明,除此之外,还有:CONSTRUCTOR(构造方法声明),FIELD(字段声明),LOCAL VARIABLE(局部变量声明),METHOD(方法声明),PACKAGE(包声明),PARAMETER(参数声明),TYPE(类接口)
@Retention是它的生命周期,前面不是说注解按照运行机制有一个分类嘛,RUNTIME
就是在运行时存在,可以通过反射读取。除此之外,还有:SOURCE(只在源码显示,编译时丢弃),CLASS(编译时记录到class中,运行时忽略),RUNTIME(运行时存在,可以通过反射读取)
@Inherited是一个标识性的元注解,它允许子注解继承它。
@Documented,生成javadoc时会包含注解。
框架开发之Java注解的妙用
1.线程池,threadpool有哪些重要的参数?
答:
corePoolSize:核心池的大小,这个参数与后面讲述的线程池的实现原理有非常大的关系。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建corePoolSize个线程或者一个线程。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;
maximumPoolSize:线程池最大线程数,它表示在线程池中最多能创建多少个线程;
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize:即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize;但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;
unit:参数keepAliveTime的时间单位,有7种取值,在TimeUnit类中有7种静态属性,以及TimeUtil的源码展示:
2.http协议头有哪些字段?
答:
Accept:请求报文可通过一个“Accept”报文头属性告诉服务端 客户端接受什么类型的响应;
Cookie :客户端的Cookie就是通过这个报文头属性传给服务端的;例如sessionid,服务端就是通过这个值确定客户端的多个请求是不是隶属于同一个session;
refer:表示该请求是从哪个地址来的;
User-Agent: 浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用;
Host: 初始URL中的主机和端口;
Accept-Language: 浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到;
Connection: 表 示是否需要持久连接;
Content-Length :表示请求消息正文的长度;
3.oracle如何实现分页(手写)。
答:
SELECT * FROM
(
SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME order by add_time) A
WHERE ROWNUM <= page*size
)
WHERE RN >= (page-1)*size
4.SpringMVC在处理前端页面请求时,各模块是如何工作的?
其主要组件如下:
前端控制器(DispatcherServlet):接收请求,响应结果,相当于电脑的CPU。
处理器映射器(HandlerMapping):根据URL去查找处理器
处理器(Handler):(需要程序员去写代码处理逻辑的)
处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)
视图解析器(ViewResovler):进行视图解析,多返回的字符串,进行处理,可以解析成对应的页面
1、 用户发送请求至前端控制器DispatcherServlet。
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet调用HandlerAdapter处理器适配器。
5、 HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView。
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
9、 ViewReslover解析后返回具体View。
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、 DispatcherServlet响应用户。
SpringMVC工作原理
5.数据库索引有什么作用?带来的问题是什么?
答:
作用:
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
问题:
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
就像书的目录,可以帮助你更快的找到所需要的内容,但当需要更新内容时,目录也得更新,这就消耗了时间,影响性能。
6.以前有没有用过Java枚举
答: