java80道面试题

目录

Java基础  

1.Java中内存管理及各区域内存储数据的生命周期?

2.JVM堆内存的分代管理以及垃圾回收流程?

3.面向对象三大特征及详细理解?

4.重载(overload)与重写(override)的区别?  

5.接口和抽象类区别?  ,

6.实例变量和静态变量的区别?

7.八大基本类型及字节数和位数?

8.switch case是否支持byte,short和long,是否支持String?

9.String中和Array中是否有length属性和length()方法?

  10.==和equals的区别?

11.String str=new String("abc");创建了几个对象?

 12.String,StringBuffer,StringBulider的区别?

13.怎么把ISO8859-1编码的字符串转换成GBK或者UTF-8的字符串?

14.Integer i1=127;Integer i2=127;i1==i2结果为true还是false?Integer         i3=Integer.valueOf(127);Integer i4=Integer.valueOf(127);        i3==i4结果为true还是false?

15.List和Set以及Map他们的实现类有哪些?

16.ArrayList和LinkedList的区别?

17.HashMap和HashTable的区别?

18.HashMap内部存储数据的原理?(PPT上有张原理图务必会画)《一   67》

19.创建线程有几种方式?有何区别?

20.线程运行中的五种状态?  (新建  就绪  运行 阻塞  结束)

21.线程中synchronized的用法?

22.synchronized什么情况下是同步锁,什么情况下是互斥锁?

23.什么是死锁?怎么解决死锁?

24.Exception和RuntimeException区别?throw和throws的区别?

25.请说出五种以上常见运行时异常的名字以及产生的原因和解决方案?

26.final,finalize,finally的区别?

27.什么是反射,怎么通过反射获取类对象,并且实例化该类对象,怎么获取类对象中属性和方法并执行方法?

CSS/JS

28.表单控件有哪些?

29.三种弹出框分别是?

30.什么是盒子模型?盒子模型计算公式?

31.JQuery提供on()函数用法?

32.怎么获取select下来选选中的option的value值?

33.怎么获取checkbox选中的多个value值?

34.怎么获取radio单选框选中的value值?

35.CSS选择器有哪些?

36.JQuery选择器有哪些?

37.JQuery中val(),val("值"),html(),html("值"),text(),text("值")有什么区别?分别支持哪些类型标签?

38.JQuery中addClass("样式名");removeClass("样式名");hasClass("样式名");

39.mysql和oracle的端口号?

40.oracle和mysql中的聚合函数和空值函数有哪些?

41.oracle和mysql中各自的分页查询怎么写?

42.oracle和mysql中怎么做行列转换?

43.复制表:包含结构和数据以及只包含结构不包含数据分别怎么实现?

44.将一个表中的数据插入到另外一张表结构相同的表中怎么实现?

45.oracle中的rowid和rownum分别是什么?

46.数据库约束有哪些?

47.(1)TRUNCATE和DELETE以及DROP的区别?(面)

(2)WHERE过滤句子和having过滤子句的区别?(面)

48.删除表中重复数据保留一条怎么实现?   

49.union和unionall的区别?

50.创建用户并授权?

51.真删除和假删除?真分页和假分页?

52.什么是事务?事务有哪4项特性?《三---6题》

53.事务隔离级别,脏读,幻读,不可重复读?

54.数据库中乐观锁和悲观锁?

55.JDBC的运行过程?

​56.Statement和Preparedstatement的区别?《三---5题》

 Servlet/JSP

57.什么是HTTP协议?包含哪些数据包,各数据包内又有什么?

58.有几种方式可以修改tomcat的端口号?

59.servlet生命周期?

60.JSP的运行过程?

61.JSP九大内置对象?其中哪4个是作用域对象?怎么从某个作用域中取值?《四--15 16 题》

62.session和cookie的区别(详细的)?《四---19》

63.转发和重定向的区别以及是哪个对象调用其哪个方法执行的?

64.get和post请求的区别?

65.Spring框架的核心模块(PPT上有一张图)?

66.SpringIOC和DI?

67.SpringMVC的五大核心组件及工作流程?《高萌面试》

68.SpringMyBatis整合需要做哪些相关配置?

69.单例模式,工厂模式?《四--23-24》

70.Ajax技术(js版和jquey版)?<四---46>

71.JSON技术?<四---48>

72.Spring框架的 组件扫描  注解有哪些?《四题----28》

73.RequestMapping和ResponsBody注解分别是做什么用的?

74.什么是AOP?通知方式有几种?切入点有哪些?

222》什么是OOP?

75.拦截器和过滤器的区别?

76.MyBatis中#{}和${}的区别?

77.spring cloud 介绍?(了解就可以了,小白面试一般不会问)

项目

77.项目某模块思路

提高题:

78.Nginx是什么技术?(面试题五--4)

79.Redis是什么技术?(面试题五--5)

关于Shiro技术?

Shiro框架介绍

什么是MyCat:

Vue是啥?

API是啥?{application programming interface}

啥是JavaScript(动态效果)?Css? (颜色);

js函数

什么是单点登录?

一、jsonp 原理

 Feign详解与实例?

SpringBoot优点?



Java基础  

1.Java中内存管理及各区域内存储数据的生命周期?

JVM会将申请到的内存从逻辑上划分为三个区域:堆、栈、方法区。这三个区域分别用于存储不同的数据。

堆:用于存储使用new关键字所创建的对象以及对象的属性成员变量。

栈:用于存储程序运行时在方法中声明的所有的局部变量。

方法区:用于存放类的各种信息(包括方法)都在方法区存储。

在这里插入图片描述

局部变量:

1) 定义在方法中;

2) 没有默认值,必须自行设定初始值;

3) 方法被调用时,存在栈中,方法调用结束时局部变量从栈中清除;

成员变量:

1) 定义在类中,方法外;

2) 由系统设定默认初始值,可以不显式初始化;

    3) 所在类被实例化后,存在堆中,对象被回收时,成员变量失效;

2.JVM堆内存的分代管理以及垃圾回收流程?

存放对象的实例,垃圾收集器管理的主要区域,分为新生代,老年

新生代又分为Eden区域, Survivor区域

Survivor区域又分为form,to区域

java80道面试题_第1张图片

新生代Eden:新对象和没有达到一定年龄的对象保存在该区域

java80道面试题_第2张图片

老年代Tenured:新创建的超大对象,长时间被使用的对象,经过GC清理后还存活的对象

元空间:像一些方法中操作的参数,临时的对象都保存在元空间

1).创建一个新对象,会把这个新对象的实例放在新生代的Eden区域,当Eden区空间不足,无法保存创建新的对象时则会触发MinerGC进行清理

2).当经过一次MinorGC进行清理后Eden区还存活的一些对象会通过复制算法把它复制到Survivor区(存活区)的from 区(原to区).

3).Survivor区的两块区域是相同大小的两块区域,是可以互相交换的,交换以后form的叫to,to的叫from,交换的过程中会把其中一个的对象复制到另外一个,保证有一个是空的.

 --经历一次MinorGC,如果Eden区有对象被保存到Survivor区的原to区时,然后对原from区域中进行一次清理,把清理后还依然存活的对象复制到原to区,然后把原to区更名为from区,把原form区更名为to区,这样就保证每次to区都是空的

java80道面试题_第3张图片

4).当原from区进行MinorGC进行清理后往原to区进行复制的时候,原to区复制一部分对象后满了的情况下,会将原form区的剩余对象复制到老年代区域.

--另外Survivor区中的对象每熬过一次MinorGC年龄就会增长一次,还可以通过设置年龄阈值参数:-XX:MaxTenuringThreshold,当年龄增到到我们设定的阈值时,将该对象直接复制到老年代中.

5).老年代区域没有可用空间时会触发Full GC,Full GC会扫描整个老年代区域将还存活的对象进行标记,然后把不存活的对象进行清除.

优点:空间内存活对象多的情况下,效率高.

缺点:直接回收不存活对象所占用的内存空间,回收后造成整个空间不连贯,产生内存碎片.

java80道面试题_第4张图片

堆内存空间满的情况会抛出OutOfMemoryError异常.

GC的垃圾回收策略:

串行策略,并行策略,并发策略

GC的垃圾回收算法:

复制,标记-清除,标记-清除-整理

3.面向对象三大特征及详细理解?

封装,继承,多态

封装:把描述一个对象的属性和行为封装成一个类,把具体的业务逻辑功能实现封装成一个方法,其次封装的意义还有效的保护属性通过访问修饰符私有化属性(成员变量),公有化方法.

继承:实现代码的复用,所有的子类所共有的行为和属性抽取为一个父类,所有的子类继承该类可具备父类的属性和行为,继承具有单一性和传递性.

多态:程序中定义的引用类型变量所指向的具体类型和调用具体的方法在编译期无法确定,而是在运行期才能确定该引用类型变量指向具体哪个对象而调用在哪个类中声明的方法.

多态的表现形式有强制类型转换,向上造型等,多态可分为行为多态和对象多态:

行为多态:同一个run(){}方法,不同的对象调用时会有不同的实现,猫调用时是跑,鱼调用时是游,鸟调用时是飞.

对象多态:同一个对象,可以被造型为不同的类型,比如同一个人对象,可以被造型为儿子,父亲,员工等.

4.重载(overload)与重写(override)的区别?  

Overload是重载的意思,Override是覆盖的意思,也就是重写。

重载Overload表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同)。

重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的多态性的一种表现。

重写要遵循"两同两小一大"原则:

两同:1)方法名相同 2)参数列表相同

两小: 1)子类方法的返回值类型小于或等于父类的

    1.1)void时必须相等

1.2)基本类型时必须相等

    1.3)引用类型时小于或相等:父类大,子类小

  2)子类抛出的异常小于或等于父类的

一大:子类方法的访问权限大于或等于父类的

5.接口和抽象类区别?  ,

含有abstract修饰符的class即为抽象类,抽象类不能创建的实例对象。含有抽象方法的类必须定义为abstract class.

接口(interface)可以说成是一种特殊的抽象类,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。

下面比较一下两者的语法区别:

    1. 抽象类可以有构造方法,接口中不能有构造方法。
    2. 抽象类中可以有普通成员变量,接口中没有普通成员变量
    3. 抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
    4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然eclipse不报错,但也不行,默认类型子类不能继承),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型.
    5. 抽象类中可以包含静态方法,接口中JDK1.8之前不可以有不能包含静态方法和成员方法,JDK1.8之后可以包含.但成员方法必须使用default修饰
    6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
    7. 一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类,接口不可以实现接口,但可以继承接口并且可以继承多个接口,用逗号隔开.

              

6.实例变量和静态变量的区别?

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。


7.八大基本类型及字节数和位数?


java80道面试题_第5张图片

java80道面试题_第6张图片

8.switch case是否支持byte,short和long,是否支持String?

在switch(expr1)中,expr1只能是一个整数表达式,整数表达式可以是int基本类型或Integer包装类型,由于byte,short,char都可以自动转换成int型,所以可以使用.
long类型由于不能自动转换成int类型,所以不能使用.
关于字符串类型,在JDK是1.7版本之前,swicth case中不可以使用字符串,但在JDK1.7之后是可以用字符串的,这是最新版本新加入的特性.

java80道面试题_第7张图片

9.String中和Array中是否有length属性和length()方法?

String有length()这个方法。
Array(数组)有length的属性。
集合没有length()方法,有size()方法。


  10.==和equals的区别?

  ==比较基本数据类型时比较的时值是否相等,比较引用类型时比较的是对象的地址值是  
   否相同,也就是否是同一对象。
   未重写的equals方法调用的是Object的方法,用法==一样,重写后的equals方法是用
   于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的
   两个对象是独立的。例如对于下面的代码:
   String a=new String("foo");
   String b=new String("foo");
   两条new语句创建了两个对象,然后用a和b这两个变量分别指向了其中一个对象,
   这是两个不同的对象,它们的地址是不同的,所以表达式a==b将返回false,而这两
   个对象中的内容是相同的,所以,表达式a.equals(b)将返回true.
   String这个类重写过equals方法, StringBuffer,StringBuilder未重写过equals方法.

11.String str=new String("abc");创建了几个对象?


再以上基础上又String str1=new String("abc");一共创建几个对象?
创建了两个对象,一个str引用指向堆内存中的String对象,另外一个则是String类有参构造方法中的直接量字符串对象,该字符串对象在字符串常量池中.
如果在执行一次String str1=new String("abc");此时共创建了几个对象?
因为在第一次常量池中已经有一个"abc"字符串对象,第二个创建时并没有创建新的,而是拿过来直接用,只是创建了1个str1指向堆内存中的String对象,共3个.

 12.String,StringBuffer,StringBulider的区别?


String类是final修饰的,该类所表示的字符串对象不可变,一旦发生改变即创建新对象, 当我们通过字面量,常量来初始化一个字符串时,JVM首先会从字符串的常量池(一个JVM内部维护的内存区域,用来保存已经创建过的字符串对象)中查询用来保存该字符串的对象是否存在,若存在则直接引用,若不存在则创建该字符串对象并存入常量池,然后引用它.
StringBuffer和StringBuilder是可变字符串对象,对字符串的修改操作不会创建新对象,都是在原有对象基础上进行修改,内部有很多操作字符串的方法,比如append()等.另外StringBuffer是线程安全的,同步处理的,性能稍慢;StringBuilder是非线程安全的,并发处理的,性能稍快。

13.怎么把ISO8859-1编码的字符串转换成GBK或者UTF-8的字符串?

 String类有一个重载的构造方法:

    String(byte bytes[], String charsetName)

    第一个参数为一个byte数组,第二个参数为指定的字符集类型

字符串有       第一个是数组,第二个可以传你想变得类型;

                         

14.Integer i1=127;Integer i2=127;i1==i2结果为true还是false?Integer         i3=Integer.valueOf(127);Integer i4=Integer.valueOf(127);
        i3==i4结果为true还是false?

Integer i1=new Integer(i);

Integer i2=new Integer(i);

System.out.println(i1==i2);

System.out.println(i1.equals(i2));

输出的结果是false   true

因为i1和i2使用new关键字new了两次,在堆内存中创建了2个对象,所以==比较为false,内容相同equals比较为true

        Integer i3=Integer.valueOf(i);

Integer i4=Integer.valueOf(i);

System.out.println(i3==i4);

System.out.println(i3.equals(i4));

输出结果为false   true

在包装类的内存中有一块区域,缓存着Integer的byte范围内的值(-128~127),如果未超出此范围,则直接在该缓存区取值,并不会在堆中创建新对象,如果超出此范围则会在堆内存中创建新对象.

如上代码i=128超出了取值范围,则在i3和i4创建了两个对象,所以双等号比较为false,内容相同equals比较为true


是引用类型取的地址值从Integer缓存区拿出来的 第一个是true 第二个是是fasle记住缓存区范围是127~-128之间

15.List和Set以及Map他们的实现类有哪些?

java80道面试题_第8张图片
List是可重复集合,Set是不可重复集合,这两个接口都实现了Collection父接口.
    Map未继承Collection,而是独立的接口, Map是一种把键对象和值对象进行映射的集
    合,它的每一个元素都包含了一对键对象和值对象, Map中存储的数据是没有顺序的,  
    其key是不能重复的,它的值是可以有重复的。
List的实现类有ArrayList, Vector和LinkedList.
ArrayList和Vector内部是线性动态数组结构,在查询效率上会高很多,Vector是线程安全的,相比ArrayList线程不安全的,性能会稍慢一些.
LinkedList:是双向链表的数据结构存储数据,在做查询时会按照序号索引数据进行前向或后向遍历,查询效率偏低,但插入数据时只需要记录本项的前后项即可,所以插入速度较快。
Set的实现类有HashSet和TreeSet;
HashSet: 内部是由哈希表(实际上是一个 HashMap 实例)支持的。它不保证 set元素的迭代顺序.
TreeSet:  TreeSet使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序.
Map接口有三个实现类:Hashtable,HashMap,TreeMap,LinkedHashMap
Hashtable: 内部存储的键值对是无序的是按照哈希算法进行排序,与HashMap最大的区别就是线程安全.键或者值不能为null,为null就会抛出空指针异常
HashMap: 内部存储的键值对是无序的是按照哈希算法进行排序,与Hashtable最大的区别就是非线程安全的,键或值可以为null
TreeMap: 基于红黑树(red-black tree)数据结构实现, 按 key 排序,默认的排序方式是升序.
LinkedHashMap:有序的Map集合实现类,相当于一个栈,先put进去的最后出来,先进后出.

16.ArrayList和LinkedList的区别?


List的实现类有ArrayList, Vector和LinkedList.
ArrayList和Vector内部是线性动态数组结构,在查询效率上会高很多,Vector是线程安全的,相比ArrayList线程不安全的,性能会稍慢一些.
LinkedList:是双向链表的数据结构存储数据,在做查询时会按照序号索引数据进行前向或后向遍历,查询效率偏低,但插入数据时只需要记录本项的前后项即可,所以插入速度较快。


17.HashMap和HashTable的区别?


1.)HashMap: 内部存储的键值对是无序的是按照哈希算法进行排序,与Hashtable最大的区别就是非线程安全的,键或值可以为null
2.)Hashtable: 内部存储的键值对是无序的是按照哈希算法进行排序,与HashMap最大的区别就是线程安全.键或者值不能为null,为null就会抛出空指针异常

18.HashMap内部存储数据的原理?(PPT上有张原理图务必会画)《一   67》

java80道面试题_第9张图片

1)当调用put方法往HashMap中存键值对时,会把key的hashCode值交给Hash

算法进行计算,算出来一个地址值,该地址值决定着该键值对存在数组中的那个位置.

2)找到该存储地址位置时会在调用equals方法来比较是否存在相同的key,如果不存在则把该键值对存在该位置,如果存在则替换其value值.

3)如果在调用put方法时传入key不相同,但是key的hashCode值交给Hash算法进行计算时得到了相同的地址值,那么就会产生链表.会在同一个地址上存入两个key不相同的键值对,先存入的键值对被放到链表的尾部,后存入放到链表首部.

4)产生链表会影响查询效率,所以被存入的键值对对象都会重写equals和hashcode方法,但链表不能完全避免,原因是可能存在巧合key不相同但HashCode值相同.

        5)当调用get方法时传入key,把key的hashCode值交给Hash算法进行计算,算出来一个地址值,           通过该地址找到元素后在调用equals方法来比较key是否存在,若存在则返回其value值.

19.创建线程有几种方式?有何区别?


1)继承Thread类.重写run方法    单继承

java80道面试题_第10张图片

java80道面试题_第11张图片
2)实现Runnable接口.重写run方法     可以将创建线程的代码和代码要执行的代码分开, 降低了耦合性

 java80道面试题_第12张图片

java80道面试题_第13张图片

另外:一个线程仅需要一个实例时可以使用匿名内部类创建,这种方式有助于简化代码

继承Thread类:

java80道面试题_第14张图片

实现Runnable接口:

java80道面试题_第15张图片

20.线程运行中的五种状态?  (新建  就绪  运行 阻塞  结束)


New(新建):当我们创建一个线程时该线程并没有纳入线程调度处于一个new状态。
Runnable(就绪):当调用线程的start方法后,该线程纳入线程调度的控制,其处于一个可运行状态,等待分配时间片段以并发运行。
Running(运行):当该线程被分配到时间片段后被CPU运行,该线程处于running状态。
Blocked(阻塞):当线程在运行过程中可能会出现阻塞现象,比如等待用户输入信息等。但阻塞状态不是百分百出现的,具体要看代码中是否有相关需求。
Dead(结束):当线程的任务全部运行完毕,或在运行过程中抛出了一个未捕获的异常,那么线程结束,等待GC回收.
当使用new线程创建完毕后调用start方法后线程进入就绪状态,线程调度系统将就绪状态的线程转为运行状态,遇到synchronized语句时,由运行状态转为阻塞,当该线程获得synchronized对象锁后,由阻塞状态转为运行,在这种情况下可以调用wait 方法转为挂起状态,当线程关联的代码执行完毕后,线程变为结束状态.

java80道面试题_第16张图片

21.线程中synchronized的用法?


java中有一个关键字名为:synchronized,该关键字是同步锁,用于将某段代码变为同步操作,从而解决线程并发安全问题.
用于将某段代码变为同步操作,解决线程并发的问题           

synchronized加在普通方法上:当一个普通方法是用synchronized修饰后,该方法称为:"同步方法" 即:多个线程不能"同时"执行该方法,只能有先后顺序同步执行.锁定的是当前对象,也就是this.

注:只针对同一个对象访问同一个方法会产生同步,两个不同的对象访问各自的同步方法不会产生同步.

java80道面试题_第17张图片

synchronized加在静态方法上:当一个静态方法是用synchronized修饰后, 该方法一定具有同步效果,因为只有1份,跟对象无关, 实际上上锁的对象为当前方法所属类的类对象,即:Class的一个实例.

注:与普通方法加锁有区别,在静态方法上加锁由于锁的是当前类,所以通过该类创建出来的多个对象访问该静态方法都会出现同步.

synchronized代码块: 为了有效缩小同步范围,来提高多线程并发执行效率,可以使用同步块,同步块写在方法内部,同步方法内的某一段代码.

注:同步块需要自行指定"同步监视器",即:上锁的对象,只要保证需要排队执行的多个线程看到是同一个对象即可!,一般写的是this

22.synchronized什么情况下是同步锁,什么情况下是互斥锁?


同步锁:多个线程  同一对象  同一个加锁方法   上锁对象是同一个
互斥锁:多个线程  同一对象  不同加锁方法      上锁对象是同一个

Synchronized也是互斥锁: 当修饰的是两段不同的代码,但是同步监视器对象是同一个的时候,那么就具有了互斥性.

如下案例:

Boo类中有两个Synchronized同时修饰2个不同的方法,锁定的都是当前对象this,在访问该对象的两个不同同步方法时都会将当前对象锁定,互相牵制,谁也不让谁,必须等一个执行完另外一个才能执行.

java80道面试题_第18张图片

java80道面试题_第19张图片

注意:上述案例如果Boo里有一个synchronized修饰的是静态方法,那么将不会产生互斥,因为静态方法用synchronized修饰锁定的是当前.class,而普通方法使用synchronized修饰锁定的是当前对象,也就是this, 同步监视器监视的对象并非同一个,所以不会产生互斥.

23.什么是死锁?怎么解决死锁?

死锁: 就是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

线程死锁可能发生在以下的情况:

1)当两个线程相互调用Thread.join();

2)当两个线程使用嵌套的同步块时,一个线程占用了另一个线程的必需的锁,互相等待时被阻塞,就有可能出现死锁。

死锁一般都是由于对共享资源的竞争所引起的。但对共享资源的竞争又不一定就会发生死锁,死锁的发生必需满足4个必要条件:

  • 互斥: 所谓互斥就是进程在某一时间内独占资源。
  • 等待/持有: 一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  • 非抢占: 进程已获得资源,在末使用完之前,不能强行剥夺。
  • 形成等待环: 若干进程之间形成一种头尾相接的循环等待资源关系。

如何解决死锁:可以从死锁的四个条件去解决,只要破坏了一个必要条件,那么死锁问题就解决了,在java中使用多线程的时候一定要考虑是否有死锁的问题.

24.Exception和RuntimeException区别?
throw和throws的区别?
 

Java异常结构中定义有Throwable(可抛出)类,Exceotion(异常)和Error(错误)是其派生的两个子类。

 Exception(异常):表示由于网络故障、文件损坏、设备错误、用户输入非法等情况导致的异常,这类异常是可以通过Java异常捕获机制处理的。

 Error(错误): 表示程序无法处理的错误,表示运行应用程序中较严重问题,例如:JVM内存溢出等。

 Exception(异常):又分为检查型异常和运行时异常

检查型异常:需要经过编辑器检查处理的异常,对于声明抛出异常的方法,必须经过强制处理或者自己捕获处理,否则编译无法通过,此类异常继承Exception,典型的检查性异常有IOException,ClassNotFoundException等.

运行时异常:编辑期间编译器不做检查,在运行时才会抛出的异常,此类异常继承RuntimeException.运行时异常有NullPointerException, NumberFormatException, ArrayIndexOutOfBoundsException等.

java80道面试题_第20张图片

继承Exception时自定义异常属于检查型异常,编译器会做检查,会主动提示抛出.

继承RuntimeException时自定义异常属于运行时异常,编译期不会检查,运行时会抛出相关异常.

throw:是指抛出的一个具体的异常类型,写在方法的内部, 需要用户自己捕获相关的异 
常,而后在对其进行相关包装,最后在将包装后的异常信息抛出.

//假设自定义了一个IllegalAgeException异常,此处省略:
	public class Exception_throw {
	public static void main(String[] args){
		Person p=new Person();
		try {
			p.setAge(10);
		} catch (IllegalAgeException e) {
			e.printStackTrace();
			System.out.println("出错了!");
		}
		System.out.println("年龄是:"+p.getAge());   }}
class Person{
	private int age;
	public int getAge(){
		return age;}
	public void setAge(int age) throws IllegalAgeException{
		if(age<0||age>100){
			throw new IllegalAgeException("年龄不合法");}
		this.age=age;   
}}

throws:是用来声明一个方法可能抛出的所有异常信息,多个异常之间逗号隔开,写在方法上, 通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级调用者.

25.请说出五种以上常见运行时异常的名字以及产生的原因和解决方案?

  • RuntimeException子类:

ArrayIndexOutOfBoundsException:  数组下标越界异常。当对数组的下标为负数或大于等于数组大小时抛出。

ArithmeticException: 算术条件异常。如:整数除以零。

NullPointerException:空指针异常, 调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等.

ClassNotFoundException:  找不到类异常。根据字符串形式的类名在遍CLASSPAH之后找不到对应名称的class文件时,抛出该异常。

NegativeArraySizeException  数组长度为负异常

ArrayStoreException 数组中包含不兼容的值抛出的异常

SecurityException 安全性异常

IllegalArgumentException 非法参数异常

ClassCastException    类型转换异常类

ArrayStoreException  数组中包含不兼容的值抛出的异常

SQLException   操作数据库异常类

NoSuchFieldException   字段未找到异常

NoSuchMethodException   方法未找到抛出的异常

NumberFormatException    字符串转换为数字抛出的异常

StringIndexOutOfBoundsException 字符串索引超出范围抛出的异常

IllegalAccessException  不允许访问某类异常

  • IOException的子类:

IOException:操作输入流和输出流时可能出现的异常。

EOFException   文件已结束异常

FileNotFoundException   文件未找到异常

26.final,finalize,finally的区别?

final:修饰符:

final修饰的类不能被继承,

final修饰的变量不可改变,在声明的同时初始化.

final修饰的方法不可被重写.

finalize:方法名

在垃圾回收器将内存中的没有引用指向的对象清空之前,调用finalize() 进行清理工作.

finally:异常处理中的程序块

在异常处理时,使用finally块来进行必要的清理工作,不论是否有异常发生,finally语句块中的语句都会被执行,如果发生了异常,则执行catch语句,再执行finally块.

27.什么是反射,怎么通过反射获取类对象,并且实例化该类对象,怎么获取类对象中属性和方法并执行方法?

反射是Java 动态执行机制,可以实现动态执行功能:

1.反射提供了在运行时判断任意一个对象所属的类型并可以检查解析类型的内部结构。

2.反射可以动态加载类型,并能够动态创建对象

3.反射可以动态访问对象的属性。

4.反射可以动态执行对象的方法。

5.利用反射API还可以动态的访问,不可见的属性和方法,打破面向对象的封装性.

优点:可以动态执行!在运行期间根据业务功能动态执行方法、访问属性,最大限度发

挥了java的灵活性。

缺点:对性能有影响,这类操作总是慢于直接执行java代码。

有一个实体类Person:

java80道面试题_第21张图片

通过反射机制获取该类的类对象和内部的属性及方法,并给属性赋值和调用方法:

java80道面试题_第22张图片

JDBC中,利用反射动态加载了数据库驱动程序。

  Web服务器中利用反射调用了Sevlet的服务方法。

很多框架用到反射机制,注入属性,调用方法,如Hibernate、Struts2、Spring等

反射是Java 动态执行机制,可以实现动态执行功能
通过反射获取类对象有三种方法:类名.class,class.forname(类的全路径名),对象.getclass;
获取类中的属性及方法:用类对象调用getDeclaredDield(“变量名”)给属性赋值:Field对象调用set(实例对象.值)
获取类中的方法并执行:
获取:类对象调用getDeclaredMethod(方法名.参数类型的class)
执行:返回一个method类型的对象,用它调用invoke(实例对象,参数)


CSS/JS


28.表单控件有哪些?

表单是浏览器向服务器传送数据的手段,使用

标签将表单元素及书写包裹在内.

有三个主要属性:

action:表单提交的URL地址路径

method: 表单的提交方式,默认为get请求方式,可设置为post请求方式.

enctype:表单数据的编码方式

表单控件分为input元素和其他元素:

input元素:

文本框:

密码框:

主要属性:value:用户输入的文本数据  maxlength:最大输入字符数  readonly:只读

单选框:男性

       女性

复选框:checked  name="like" value="1"/>篮球

       足球

主要属性:value:单/复选框文本    name:分组,一组单/复选框name属性必须相同

         checked:设置选中

按钮元素:

提交按钮::自带表单提交效果

重置按钮::重置表单内容

普通按钮::普通按钮

主要属性:value:按钮名字

隐藏框,文件选择框元素:

隐藏框::一个用户看不到的框体

文件框::选择要上传的文件

其他元素:

文本域: