JAVA学习过程中总结的一些基础面试题目和知识点【1】

1,任何情况下,如果要实现多表查询的操作,永远都有一个前提:要关联的数据表一定要存在有关联的字段,或者是关联条件,不存在这些要求的,一定不能使用多表查询;另外,记住一个原则:多表查询的性能一定是很差的,在开发之中应该尽可能的回避。

2.请解释COUNT(*),COUNT(字段),COUNT(DISTINCT字段)的区别?

COUNT(*):明确的返回表中的数据个数,是最准确的。

COUNT(字段):不统计为null的数据个数,如果某一列的数据不可能为空,那么结果与COUNT(*)相同;

COUNT(DISTINCT 字段):统计消除掉重复数据后的数据个数。

3.关于WHERE和HAVING的区别?

WHERE发生在GROUP BY操作之前,属于分组前的数据筛选,即:从所有的数据之后筛选出可以分组的数据,WHERE子句不允许使用统计函数。

HAVING发生在GROUP BY之后,是针对于分组后的数据进行筛选,HAVING子句可以使用统计函数。

扫描二维码关注公众号,回复: 117016 查看本文章

4.发现多表查询可以实现统计,子查询也能够实现统计,哪种方式比较好呢?

在实际工作中,子查询的主要目的是解决多表查询所带来的性能问题,所以在开发之中使用的是最多的。

在FROM子句中出现子查询一般还有一种情况“在整个查询语句之中需要使用到统计函数,但是又无法直接去使用统计函数统计时候,可以现在FROM子句里面利用子查询实现统计”

子查询最大的作用就是解决多表查询所带来的笛卡尔积影响的性能问题。

5.每个session的事务处理上都可以使用两个命令,分别是?

Commit:事务提交,如果已经执行了多条更新操作,那么只有执行了commit之后更新才会真正的发出,在没有执行commit之前,所有的更新操作都会保存到缓冲区之中。

Rollback:事务回滚操作,如果发现更新的操作有问题,则回复所有的更新操作,以保证数据不被破坏。

6.请将表中的重复纪录只保存一条?

可以用ROWID来保存,ROWID最大的作用就是描述一行记录的唯一的编号,我们如果能找出所有重复记录最小的ROWID,那么表示这些ROWID就是要保留的数据。

7.约束外键对于两张数据表操作上的限制?

限制1:如果表中存在有外键关系,在删除父表前一定要先删除子表。

限制2:父表作为子表关联的外键字段,必须设置为主键约束或者是唯一约束。

限制3:默认情况下,如果父表纪录中有对应的子表纪录,那么父表纪录无法被删除。

解决方法:数据的级联删除:ON DELETE CASCADE;当父表的数据被删除之后,子表对应的内容设置为null,使用ON DELETE SET NULL完成。

8.视图的定义以及使用。

所谓视图就是包装了复杂查询的SQL语句对象,如果是标准的开发,强烈建议使用视图,这样可以很好的实现分工,如果项目里面真使用了视图的话,有可能视图的数量会远远大于表的数量,定义的视图都建议使用只读视图,因为视图中的数量都不是真实的数据。

9.理解索引的作用与缺点?

数据库查询之中可以利用索引提升查询性能,但是不适合于应用在数据更新频繁的操作上。因为使用索引,实际上不是扫描数据表,而是扫描索引数据B-TREE,那么如果说现在有雇员的工资数据被改变了,所以索引树的内容一定要发生改变。如果此时表中的数据量非常庞大,那么每一次树的改变一定会消耗大量的内存的空间,如果表中的数据要被频繁修改的话,那么索引就会变成彻底拖累,反而会降低整个数据库的性能,所以索引的使用要慎重。

10.数据库设计的范式?

对于任何一个软件项目开发而言,都一定会经历以下的几个步骤:获取需求阶段;需求分析与业务设计;数据库设计;程序开发与业务实现;程序的测试;程序的运维;

第一设计范式:单表,不允许拆分。

第二设计范式:多对多关系映射;

第三设计范式:一对多关系映射;

如果要想熟练的掌握数据库的分析与设计能力,是需要积累大量的项目开发经验,你必须知道程序能做那些,数据库又可以做那些事情。在实际开发之中,第三范式一定是最优先考虑。

11.JAVA虚拟机初步了解?

在整个运行机制过程之中,最终解释程序的电脑并不是一台真正的电脑,而是由软件和硬件模拟出来的一台虚拟电脑,简称JVM;JVM读取并且处理经编译过的平台无关的字节码class字节,JAVA编译器针对JAVA虚拟机产生的class文件,因此是独立于平台的。JAVA解析器负责将JAVA虚拟机的代码在特定的平台上运行。根据不同的操作系统提供不同的JVM,但是所有的JVM的支持是完全一样的,而所有的程序只找JVM,而不关心JVM对应的操作系统是哪一个。综合来说,JAVA实现可移植性的关键技术——JVM。

12.请解释PATH和CLASSPATH的区别?

PATH:是属于操作系统属性,定义所有可执行程序的路径。

CLASSPATH:是JAVA程序解释类文件时所使用的加载路径,不管定义多少个路径,一定要定义一个“.”(表示由当前所在目录进行类的加载)。

13.在程序的世界里,数据类型的转换有以下规律?

数据范围小的数据与数据范围大的数据进行数学计算的时候,自动向大的范围的数据类型转换后计算。

数据范围大的数据要变成数据范围小的数据,那么必须采用强制转换。

如果是常量进行强制转换,有2种是:常量标记(L,I),使用“(数据类型)”。

14.请解释“&”和“&&”的区别?“|”和“||”的区别?

逻辑运算:与运算分为普通与(&)和短路与(&&)两种,普通与是所有的判断条件都要判断,短路与是如果前面的判断返回了false,后面不再判断,最终结果就是false;

或运算分为普通或(|)和短路或(||)两种;普通或也是所有判断条件都要判断;短路或就是如果前面的判断返回了true,后面不再判断,最终结果就是true。

位运算:位与运算(&),位或运算(|),其中&&和||不能应用在运算上。

15.在每一个case里面出现的break语句,表示的是停止case的执行,因为switch语句默认情况下回从第一个满足的case语句开始执行全部的语句代码,一直到整个switch执行完毕或者遇见了break。

16.现在给出两种循环的语法(while和for),那么开发中用哪种?

如果不知道循环的次数,但是知道循环结束条件的时候就用while循环;

如果已经明确知道循环次数了,使用for循环。

17.方法重载的概念和定义?

方法重载要求方法的名称相同,参数的类型以及个数不同;

在进行方法重载的时候一定要考虑到参数类型的统一,虽然可以实现重载方法返回不同类型的操作,但是从标准的开发来讲,建议所有的重载后的方法使用同一种返回值类型。

方法重载的时候重点是根据参数类型及个数来区分不同的方法,而不是依靠返回值不同来确定的。

18.递归需要注意的问题?

递归调用需要明确的设置一个结束的条件,否则就会出现死循环,如果处理的数据量一大,就有可能出现内存溢出。

19.两块内存空间的概念?

堆内存:保存每一个对象的属性内容,堆内存需要用关键字new才可以开辟。

栈内存:保存的是一块堆内存的地址,也可以简单的理解栈内存保存的是对象名字;

任何情况下只要看见了关键字new,都表示要开辟新的堆内存空间,一旦堆内存空间开辟了,里面就一定会有所有类中定义的属性,当然所有的属性内容都是其对应数据类型的默认值,如果代码中里面声明两个对象,并且使用了关键字new为两个对象分别进行对象的实例化操作,那么一定是各自占有各自的堆内存空间,并且不会相互影响。

在引用的操作过程之中,一块堆内存可以同时被多个栈内存所指向,但是反过来,一块栈内存只能保存一块堆内存空间的地址。

垃圾空间指的是没有任何栈内存指向的栈内存空间,会被GC不定期进行回收。

20.构造方法的总结?

构造方法的定义要求:方法名称和类名称相同,无返回值的声明;

构造方法是在类对象使用关键字new实例化的时候被默认调用的,不管你的代码如何改变,只要是有new,就一定需要构造方法。

一个类之中至少会保留有一个构造方法,如果没有明确定义构造方法,那么会自动生成一个无参数的什么都不做的构造方法。

构造方法的核心功能是在类对象实例化的时候为类的属性初始化。

构造方法重载时只要求考虑参数的类型和个数即可;

21.数组的总结?

数组用的很少,但是一定会用,而且数组的相关逻辑关系比较麻烦。

要把数组的排序与转置弄明白。

一切要以一维数组为主,要明白数组的定义语法与内存关系(对象一致)。

数组有个最大的天生短板,就是长度固定,所以就限制了数组在开发中的出现。

数组的排序:java.util.Arrays.sort.(数组名称)

22.请解释在字符串相等的判断中“==”与equals()的区别?

“==”是JAVA提供的关系运算符,主要的功能是进行数值相等判断的,如果用在了String对象上表示的是内存地址数值的比较。

“equals()”:是由String提供的一个方法,此方法专门负责进行字符串内容的比较。

Tips:在以后的开发中,如果要判断输入的内容是否是某一字符串,请一定要把字符串写最前面。

23.简单理解一下共享设计模式?

在JVM的底层实际上会存在有一个对象池(不一定只保存String对象),当代码之中使用了直接赋值的方式定义了一个String类对象的时候,会将此字符串对象所使用的匿名对象入池保存,而后如果后续还会有其他的String类对象也采用了直接赋值的方式,并且设置同样的内容的时候,那么那么将不会开辟新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用。

24.请解释String类对象的两种实例化方式的区别?

直接赋值(String str = “字符串”)只会开辟一块堆内存空间,并且会自动保存在对象池之中以供下次重复使用。

构造方法(String str = new String("字符串”))会开辟两块堆内存空间,其中有一块空间将成为垃圾,并且不会自动入池,但是用户可以使用intern()方法手工入池。

25.String类的特点?

String类对象的相等判断使用了equals()方法完成,“==”实现的是地址数值的比较。

字符串内容一旦声明则不可改变,String类对象内容的改变是依靠引用关系的变更实现的;

String类有两种实例化方式,使用直接赋值可以不产生垃圾空间,并且自动入池,不要使用构造方法来实例化。

26.关于this的总结?

类中的属性调用以后都要加上this;

类中的构造方法间的互相调用,一定要保留有出口;

This表示当前对象,指的是当前正在调用类中方法的对象,this不是一个固定的。

27.简单Java类对象比较的总结?

对象比较一定是某一个类自己定义的功能。

对象比较时一定要判断是否为null,地址是否相同,属性是否相同。

28.关于static关键字的总结?

Static声明的属性与普通属性最大的区别就是在于保存的内存区域的不同。

既然static是一个公共属性的概念,那么如果只是简单的由一个对象去修改static属性的做法是不合适的,那么最好的做法是由所有对象的公共的代表来进行访问,那么就是类,所以来讲利用static定义的属性是可以由类名称直接调用的。

Static属性与非static属性还有一个最大的区别,所有的非static属性必须产生实例化对象之后才可以访问,但是static属性不受实例化对象的控制,也就是说,在没有实例化对象产生的情况下,依然可以使用static属性。

Static属性保存在全局数据区:内存区有4个:栈内存,堆内存,全局数据区,全局代码区。

29.什么时候使用static属性?什么时候不使用static属性?

在你编写类的过程中,你所选择的首要修饰符一定不是static(95%),如果需要描述出共享信息的时候再使用static(可以方便集体修改,可以不重复开辟内存空间)。

30.static定义的方法的限制?

Static方法不能直接访问非static属性或者是方法,只能够调用static属性或方法;

非static方法可以访问static的属性或者是方法,不受任何的限制。

为什么呢?因为所有的非static定义的结构,必须在类已经明确的产生了实例化对象才会分配堆空间,才可以使用。

所有的static定义的结构,不受实例化对象的控制,即可以在没有实例化对象的时候访问。

31.关于内部类的一些小总结?

内部类的优点就是可以与外部类方便的进行私有属性的访问;

内部类可以使用private声明,声明之后无法在外部实例化内部类对象;

使用static定义的内部类就相当于一个外部类;

内部类可以在方法中定义

32.继承的限制?

JAVA不允许多重继承,但是允许多层继承;

子类在继承父类的时候严格来讲会继承父类中全部操作,但是对于所有的私有操作属于隐式继承,而所有的非私有操作属于显式继承。

在子类对象构造之前一定会默认调用父类的构造(默认调用无参构造),以保证父类的对象先实例化,而后再实例化子类的对象。

Super()和this()都要放在首行,但是如果子类构造没有编写super()的话,会自动使用一个super()调用父类的无参构造,那么如果写上this(),那么是不是就表示子类无法调用无参构造了呢?

通过代码的验证:super()和this()不能够同时出现,不管子类怎么折腾,它都永恒有差一个存在的前提:子类对象的构造调用前定要先执行父类构造,为父类的对象初始化后才轮到子类的对象初始化。

 

33.覆写结果的分析要素与使用原则?

观察实例化的是哪一个类,观察这个实例化的类里面调用的方法是否是已经被覆写过的,如果没覆写过的话就是调用父类。

被子类所覆盖的方法不能拥有比父类更严格的访问控制权限。

Tips:当父类的方法使用private声明,那么对子类而言是不可见的,因此不能够覆写。

34.关于super.方法()与this.方法()的区别?

使用this.方法()会首先查找本类中是否存在要用调用的方法名称,如果存在则直接调用,如果不存在则查找父类中是否具备此方法,如果有就调用,如果没有就发生编译的错误提示。

使用super.方法(),明确的表示了调用不是子类方法(不查找子类是否存在此方法),而直接调用父类中的指定方法。

35.请解释重载和覆写的区别?(请解释overloading和overrid的区别?)

重载时发生在一个类里面的,方法名称相同,参数类型和个数不同,没有权限的限制。

覆写是发生在继承关系中,方法名称相同,参数类型,个数相同,方法返回值相同,被覆写的方法不能够拥有比父类更严格的访问控制权限。

在发生重载关系的时候,返回值可以不同,但是考虑到程序设计的统一性,重载时尽量保证方法的返回值类型相同。

36.final关键字的总结?

Final定义的类不能够有子类。

使用final定义的方法不能够被子类覆写。

使用final定义的变量就成为了常量,常量必须在定义的时候就设置好内容,并且不能修改。

在以后查看文档的时候,如果发现了final定义的类或者方法,不能继承和覆写。

使用public static final 定义的全局变量,全局变量的每一个字都要求大写。

37.多态性的转型总结?

对象的多态性:指的是发生在继承关系类之中,子类和父类之间的转换。

向上转型(自动完成):父类 父类对象 = 子类实例;

向下转型(强制完成):子类 子类对象 = (子类)父类实例;

向上转型的意义:由于所有的子类对象实例都可以自动的向上转型,所以在于参数的统一上。

参数统一之后,还可以调用子类覆写的方法体,即同一个方法针对不同的子类可以有不同的实现。

向下转型:指的是父类要调用子类自己特殊的方法,所有的父类发生了向上转型之后只能够看见父类自己定义的全部方法信息,但是看不见子类的特殊的方法,于是此时就需要使用向下转型,将父类对象转换成子类对象,这样就可以使用子类的特殊功能。

对于对象的转型,给出以下的经验总结:

80%的情况下只会使用向上转型,因为可以得到参数类型的统一,方便于我们的程序设计;

5%情况下会使用向下转型,目的是调用子类的特殊的方法;

15%情况下是不转型的,例如:String;

为了保证转型的顺利进行,在java里面提供一个关键字:instanceof,若某个对象是某个类的实例,那么就返回true,否则返回false。

开发之中尽量使用向上转型,以统一参数类型,同时只有发生了向上转型之后才可以发生向下转型。

子类尽量不要过多的补充与父类无关的操作方法。

38.抽象类的使用原则?

抽象类必须有子类,即每一个抽象类一定要被子类所继承。

抽象类的子类(子类不是抽象类)必须要覆写抽象类之中的全部抽象方法(强制子类覆写)。

抽象类的对象实例化需要依靠子类完成,采用向上转型的方式处理。

Tips:虽然一个子类可以去继承任意的一个普通类,可是从开发的实际要求来说,普通类不要去继承另外一个普通类,而只能继承抽象类。

抽象类强制规定了子类必须要做的事情,而且可以与抽象类的普通方法相匹配。

不管抽象类如何努力都有一个天生最大的问题:单继承局限。

39.接口的使用原则?

接口必须要有子类,但是此时一个子类可以使用implements关键字实现多个接口。

接口的子类(如果不是抽象类),必须覆写接口中全部抽象方法。

接口的对象可以利用子类对象的向上转型进行实例化操作。

Tips:在接口里面没有写上public,其最终的访问权限也是public,绝对不是default,为了防止某些不熟悉语法的开发者出现错误,所以强烈建议在接口定义方法的时候一定要写上public。

一个抽象类可以去继承另外一个抽象类,但是反过来,一个接口却可以使用extends关键字同时继承多个接口,但是接口不能继承抽象类。

40.对接口在实际开发之中有3大核心作用的先期总结?

定义不同层之间的操作标准。

表示一种操作的能力。

表示将服务器端的远程方法视图暴露给客户端。

41.接口的定义以及使用?

工厂设计模式(factory)&&代理设计模式(proxy)。

42.抽象类与接口的区别?

抽象类:关键字abstract class

组成-构造方法,普通方法,抽象方法,static方法,变量,常量

子类使用-class子类 extends 抽象类

关系-抽象类可以实现多个接口

权限-可以使用各种权限

限制-单继承局限

接口:  关键字-interface

       组成-抽象方法,全局变量

       子类使用-class子类implements接口,接口…

       关系-接口不能够继承抽象类,但是却可以继承多个父接口

       权限-只能够使用public权限

       限制-没有单继承局限

共同点:实例化对象,依靠子类对象的向上转型进行对象的实例化。

一个不成文的参考(50%):在进行某些公共操作的时候一定要定义出接口;有了接口就需要利用子类完善方法;如果是你们自己写的接口,那么绝对不要使用关键字new直接实例化接口子类,使用工厂类完成。

接口是作为标准用于解耦合以及不同层之间连接的桥梁。

一定要把工厂设计模式和代理设计模式的结构记下来。

43.Object类里面为什么要定义一个无参构造方法呢?

既然Object类是所有类的父类,那么所有类对象实例化的时候,子类构造的方法一定要默认调用父类的无参构造。

从严格意义上来讲(一般不遵守),任何简单Java类都应该覆写Object类中的如下3个方法:取得对象信息- public String toString();

对象比较- publicBoolean equals(Object obj);

取得对象HASH码:public int hashCode();

Object类对象可以接受一切的数据类型(引用数据类型),包括数组和接口,解决了数据统一的问题;toString在对象直接输出时调用,equals在对象比较时调用。

44.关于匿名内部类的总结?

匿名内部类是在抽象类和接口的基础上发展的,匿名内部类的最大好处就是帮助用户减少了类的定义。

45.基础数据类型的包装类的总结?

byte(Byte),short(Short),int(Integer),long(Long),float(Float),doublie(Double),char(Character),boolean(Boolean)

字符串与基本数据类型的互相转换:字符串变成了基本数据类型,依靠包装类的parseXxx()方法。

46.关于public class 和class声明类的完整区别?

Public class:文件名称必须与类名称保持一致,在一个*.java文件里面只能够有一个public class声明,如果一个类需要被不同的包所访问,那么一定要定义为public class。

Class:文件名称可以与类名称不一致,并且一个*.Java文件里面可以由多个class定义,编译后会形成多个*.class文件,如果一个类使用class定义,那么表示这个类只能够被本包所访问。

47.关于Applet与Application的区别?

Applet是Java在网页上嵌套的程序,是采用绘图的方式完成的显示,而Application是在主方法中运行,通过命令行执行,随着时间的发展,Applet程序已经不再使用,如果要实现同样的功能都是用Canvans绘图——html5.

Java.awt,javax.swing:图形界面的开发包,主要是进行单机版程序界面编写的。

JDK1.0的时候主要推出的是awt开发包,但是这个开发包使用了大量的windows图形函数;

JDK1.2的时候隆重推出了javax.swing开发包,是一个轻量级(Java自己写的,不依赖windos),java从此改名为java2;

48.在以后的开发之中需要大量使用第三方的jar文件,那么所有的jar文件必须配置CLASSPATH,否则不能使用。最简单的配置方式可以直接在环境属性中完成。

49.访问控制权限的总结?

范围:           private            default           protected             public

同一个类           √                √                √                  √

在同包不同类                         √                √                  √

在不同包的子类                                         √                  √

在不同包的非子类                                                           √

对于权限的选择,给出以下的建议:

声明属性就使用private,声明方法就使用public。

50.关于命名的要求?

类名称每个单词的首字母大写,其余字母小写:例如AvengerInfo;

属性名称第一个单词字母小写,而后每个单词首字母大写:例如avengerName;

方法名称第一个单词字母小写,而后每个单词首字母大写,例如getName;

常量名称使用大写字母表示,例如:AVENGERS;

包名称使用小写字母,例如:cn.aven.demo;

51.单例设计模式Singleton代码意义?

如果说现在想要控制一个类中实例化对象的产生个数,那么首先要锁定的就是类中的构造方法,因为在实例化任何新对象都要使用构造方法,如果构造方法被锁了,那么自然就无法产生新的实例化对象了。

可是既然需要的是一个实例化对象,那么就可以在类的内部使用static方式来定义一个公共的对象,并且每一次通过static方法返回唯一的一个对象,这样外部不管有多少次调用,那么最终一个类只能够产生唯一的一个对象,这样的设计就属于单例设计模式(Singleton)。

52.请编写一个Singleton程序,请解释Singleton程序的特点?

代码到时补上;对于单例设计模式有2种形式:饿汉式,懒汉式。

饿汉式是在Singleton类定义的时候就已经准备好了一个Singleton类的实例化对象INSTANCE,而没有关心这个对象的使用。

懒汉式的最大特点就是在于它是第一次使用的时候才进行实例化操作。

单例是一个理解的过程,核心的一个目的:让一个类在整个系统里面只允许存在一个实例化对象。

.53.请编写一个多例设计模式程序,请解释程序的特点?

多例设计模式可以产生多个对象,要取得的时候需要加上标记;

不管是单例设计还是多例设计,核心都是:构造方法私有化。

54.请解释Error和Execption的区别?

Error:指的是JVM错误,即此时的程序还没有执行,如果没有执行用户无法处理;

Exception:指的是程序运行中产生的异常,用户可以处理。

55.请解释Java中的异常处理流程?

①当程序在运行的过程之中出现了异常后,那么会由JVM自动根据异常的类型实例化一个与之类型匹配的异常类对象(此处用户不用关心new,由系统自动负责处理);

②产生了异常对象之后会判断当前的语句上是否存在有异常处理,如果现在没有异常处理,那么就交给JVM进行默认的异常处理,处理的方式:输出异常信息,而后结束程序的调用。

③如果此时存在有异常的捕获操作,那么会由try语句来捕获产生的异常类实例化对象,而后与try语句后的每一个catch进行比较,如果现在有符合的捕获类型,则使用当前catch的语句来进行异常处理,如果不匹配,则向下继续匹配其他的catch;

④不管最后异常处理是否能够匹配,那么都要向后执行,如果此时程序中存在finally语句,那么就先执行finally中的代码,但是执行完毕后需要根据之前的catch匹配结果来决定如何执行,如果之前已经成功的捕获了异常,那么就继续执行finally之后的代码,如果之前没有成功的捕获异常,那么就将此异常交给JVM进行默认处理(输出异常信息,而后结束程序执行)

Tips:在编写多个catch捕获异常的时候,捕获范围大的异常一定要放在捕获范围小的异常之后,否则程序编译错误;

虽然直接捕获Exception比较方便,但是这样不好,因为所有的异常都会按照同样一种方式进行处理,如果在一些要求严格的项目里面,异常一定要分开处理会比较好。

56.请解释throw和throws的区别?

Throw:指的是方法之中认为抛出的一个异常类对象(这个异常类对象可能是自己实例化或者是抛出已存在的)

Throws:在方法的声明上使用,表示此方法在调用时必须处理异常。

57.请解释Exception与RuntimeException的区别?请列举几个你常见的RuntimeException;

Exception是RuntimeException的父类;

使用Exception定义的异常必须要被处理,而RuntimeException的异常可以选择性处理;

常见的RuntimeException:ArithmeticException,NullPointerException,ClassCastException。

58.junit是一个测试工具,对于软件测试而言分为两种测试;

黑盒测试:针对功能进行测试,看不见里面的代码;

白盒测试:针对性能进行测试,算法的调整;

 

59.java5的新特性总结?

①可变参数:访问权限 返回值类型 方法名称(参数类型…变量){}

②foreach循环:增强型for循环的使用,例如for(int x:data);

③静态导入;

④泛型:?extends类:设置泛型上限,可以在声明上和方法参数上使用;例如:?extends Number:意味可以设置Number或者是Number的子类(Integer,Double)

?super类:设置泛型下限,方法参数上使用;例如?super String:意味着只能够设置String或者是它的父类Object。

泛型解决的是向下转型所带来的安全隐患,其核心的组成就是在声明类或者接口的时候不设置参数或属性的类型;?可以接受任意的泛型类型,只能够取出,但是不能够修改。

⑤枚举:属于高级的多例设计模式。

⑥Annotation;

60.Java8的新特性总结?

①接口定义增强;

②Lamda表达式:有三种形式:(参数)->单行语句;(参数)->{单行语句};(参数)->表达式;解决问题:避免了匿名内部类定义过多无用的操作;

方法引用:定义了四种形式:

引用静态方法:类名称::static方法名称;

引用某个对象的方法:实例化对象::普通方法;

引用特定类型的方法:特定类::普通方法;

引用构造方法:类名称::new。

内建函数式接口:

功能性接口(Function):publicinterface Funtion<T,R>{public R apply(T t);}

 |-此接口需要接收一个参数,并且返回一个处理结果;

消费型接口(Consumer):publicinterface Consumer<T> {public void accept(T t);}

 |-此接口只是负责接收数据(引用数据是不需要返回),并且不返回处理结果。

供给型接口(Supplier):publicinterface Supplier<T>{public T get()}

 |-此接口不接受参数,但是可以返回结果;

断言型接口(Predicate):publicinterface Predicate<T>{public Boolean test (T t)}

 |-进行判断操作使用;

61.为什么多线程启动不是调用run()而是必须调用start()?

使用Thread类的start()方法不仅仅要启动多线程的执行代码,还要去根据不同的操作系统进行资源的分配。

62.请解释Thread类与Runnable接口实现多线程的区别?(请解释多线程两种实现方式的区别?)

Thread类是Runnable接口的子类,使用Runnable接口实现多线程可以避免单继承局限;

Runnable接口实现的多线程可以比Thread类实现的多线程更加清楚的描述数据共享的概念;

63.请写出多线程两种实现操作。

把Thread类继承的方式和Runnable接口实现的方式代码都写出来。

64.每一个JVM进程启动的时候至少启动几个线程?

Main线程:程序的主要执行,以及启动子线程;

Gc线程:负责垃圾收集;

65.请解释多个线程访问同一资源时需要考虑到那些情况?有可能带来那些问题?

多个线程放在同一资源的时候一定要处理好同步,可以使用同步代码块或者同步方法来解决;同步代码块:synchronized(锁定对象){代码};同步方法:synchronized 返回值 方法名称(){代码};

Tips:但是过多的使用同步,有可能会造成死锁;死锁是一种不确定的状态。

66.请解释sleep()和wait()的区别?

Sleep()是Thread类定义的方法,wait()是Object类定义的方法;

Sleep()可以设置休眠时间,时间一到自动唤醒,而wait()需要等待notify()进行唤醒。

67.请解释String,StringBuffer,StringBuilder的区别?

String的内容一旦声明了则不可以改变,而StringBuffer和StringBuilder声明的内容可以改变;StringBuffer类中提供的方法都是同步的方法,属于安全的线程的操作;而StringBuilder类中的方法都属于异步方法,属于非线程安全的操作;

日后开发之中,如果见到字符串的应用,不需要思考95%使用的都是String类,只有在需要频繁修改的时候才会考虑到使用StringBuffer和StringBuilder类的操作。

68.请解释什么叫GC?如何处理?

GC全名是Garbage Collector,垃圾收集器,指的是释放无用的内存空间。

GC会由系统不定期进行自动的回收,或者调用Runtime类中的gc()方法手工回收。

69.请解释final,finally,finalize的区别?

Final:关键字,定义不能被继承的类,不能被覆写的方法,常量;

Finally:关键字,异常的统一出口;

Finalize:方法,Object类提供的方法,指的是对象回收前的收尾方法,即使出现了异常也不会导致程序中断执行。

70.Math的round函数在进行负数的四舍五入时,操作的数据小数位大于0.5才进位,小于等于0.5不进位。

71.请问当前假设有两个很大的数字要进行数学计算(超过了double范围),你该怎么做?

如果真的超过了double的范围,那么肯定无法使用double进行保存,只有String才可以准确的保存好这个数据,如果真的数据很大的数字要进行数学计算,只能够将其变成String型,而后按位取出每一个字符保存的数据,进行手工的计算;所以在Java里面考虑到此类情况,专门提供了大数字的操作类,其中就有BigInteger和BigDecimal两种。

72.日期格式化:SimpleDateFormat的总结?

构造方法:public SimpleDateFormat(String pattern),需要传递转换格式;

将Date转换成String:public final String format(Date date);

将String转换为Date:public Date parse(String source)throws ParseException。

73.关于数据类型的转换的总结?

Date与String之间的转换依靠的是SimpleDateFormat。

String与基本类型之间的转换依靠的是包装类与String,valueOf()方法;

Long与Date转换依靠的是Date提供的构造以及getTime()方法。

74.以后不管何种情况下,只要是一组对象要排序,对象所在的类一定要实现Comparable接口。

 

75.请解释Comparable和Comparator的区别?(请比较这两种比较器的区别?)

如果对象数组要进行排序那么必须设置排序规则,可以使用Comparable或者Comparator接口实现,java.lang.Comparable是在一个类定义的时候实现接口,这样本类的对象数组就可以进行排序,在Comparable接口下定义有一个public int compareTo()方法;

Java.util.Comparator是专门定义一个指定类的比较规则,属于挽救的比较操作,里面有2个方法:public int compare(),public Boolean equals();

76.正则标记(背,死了都要会!)

单个字符(数量为1

字符:表示由一位字符所组成;

\\:表示转义字符\

\t:表示一个“\t”符号;

\n:匹配换行(\n)符号;

字符集(数量1

[abc]:表示可能是字符a或者b或者c中的任意一位;

[^abc]:表示不是abc中的任意一位;

[a-z]:所有的小写字母;

[a-zA-Z]:表示任意的一位字母,不区分大小写;

[0-9]:表示任意的一位数字;

简化的字符集表达式(数量1

.:表示任意的一位字符;

\d:等价于[0-9]

\D:等价于[^0-9]

\s:表示任意的空白字符,例如:“\t”,”\n”;

\S:表示任意的非空白字符;

\w:表示任意字母,数字,_所组成;

\W:表示不是由任意的字母,数字,_所组成;

边界匹配(不要在java中使用,在javaScript里使用)

^:正则的开始;

$:正则的结束;

数量表达

正则?:表示此正则可以出现0次或1次;

正则+:表示此正则可以出现1次或者1次以上;

正则*:表示此正则可以出现0次,1次或者1次以上;

正则{n}:表示正好出现n次;

正则{n,}:表示此正则出现n此以上(包含n次);

正则{n,m}:表示此正则出现n-m次。

逻辑运算

正则1正则2:正则1判断完成之后判断正则2;

正则1|正则2:正则1或者是正则2有一组满足即可;

(正则):将多个正则作为1组,可以为这一组单独设置出现的次数。

 

77.File类的简单总结?

File类本身只是操作文件,不涉及到内容;

File类中的重要方法:

置完整路径:public File(String pathname);

删除文件:public Boolean delete();

判断文件是否存在:public Boolean exits();

找到父路径:public File getParentFile();

创建目录:public Boolean mkdirs();

在使用File类操作的时候路径的分隔符使用:File.separator;

 

78.字节流和字符流的区别?

最大的区别:字节流直接与终端进行数据交互,字符流需要将数据经过缓冲区处理后才可以输出;

在使用OutputStream输出数据的时候即使最后没有关闭输出流,那么内容也可以正常输出,但是反过来如果使用的是字符输出流,如果不关闭,那么就表示在缓冲区之中处理的内容不会被强制性的清空,所以就不会输出数据,如果现在有特殊情况不能够关闭字符输出流,可以使用flush()方法强制清空缓冲区。

在开发之中,对于字节数据处理是比较多的,例如:图片,音乐,电影,文字。而对于字符流最大的好处是它可以进行中文的有效处理,那么在日后的开发之中,如果要处理中文的时候请优先考虑字符流,如果没有中文问题,建议使用字节流。

 

79.ISO8859-1:是国际编码,可以描述任何的文字信息;UNICODE:是十六进制编码,造成传输的无用数据过多;UTF-8:融合了ISO8859-1和UNICODE编码的特点;在以后的开发中都是使用UTF-8,;乱码的本质是编码与解码不统一;

80.打印流PrintStream(打印字节流),PrintWriter(打印字符流),日后开发进行程序输出数据操作的话,绝对要使用打印流完成功能;

使用Scanner读取数据的时候综合来讲的确要比BufferedReader简单一些,所以在以后的开发之中,程序输出数据使用打印流,输入数据使用Scanner(如果Scanner不好用,使用BufferReader)。

 

81.InputStream类的功能已经被Scanner解决了。

Reader类的功能不足被BufferedReader解决了。

OutputStream类的功能不足被PrintStream解决了。

Writer类的功能不足被PrintWriter解决了。

 

82.对象序列化的概念?

所谓的对象序列化指的就是将保存在内存中的对象数据转换为二进制数据流进行传输的操作。但是并不是所有类的对象都可以进行序列化,如果要被序列化的对象,那么其所在的类一定要实现java.io.Serializable接口。但是这个接口里面并没有任何的操作方法存在,因为它是一个标识接口,表示一种能力。开发使用中非常的广泛,需要注意的是:不是所有的类都需要被序列化,只有传输的对象所在的类才要进行序列化操作。

 

83.Collection接口的总结?

在所有开发之中add()与itearor()两个方法的使用几率(99%)是最高的,其他的方法几乎可以忽略,但是你必须知道。但是千万记住,contains()与remove()两个方法一定要依靠equals()支持。

从一般的道理来讲,现在已经知道了Collection接口的方法了,就应该使用子类为这个接口实例化并且使用,但是现在的开发由于要求的严格性,所以不会再直接使用Collection接口,而都会使用它的两个子接口:List(允许重复),Set(不允许重复)。

 

84.解释ArrayList与Vector的区别?

ArrayList(90%):采用异步处理,非线程安全,输出(Iterator,ListIterator,foreach)

Vector(10%):采用同步处理,线程安全,输出(Iterator,ListIterator,foreach,Enumeration)。

 

85.关于Set接口的简单总结?

Set(20%)接口下有2个常用的子类:HashSet,TreeSet。

Set集合下没有重复的元素,这是Set接口的特征,同时发现在里面所保存的数据没有任何顺序,即HashSet子类的特征就是无序排列;而TreeSet子类没有重复数据,以及所保存的内容自动排序。

关于数据排序的说明,集合就是一个动态的对象数组,那么如果要想成为一组对象进行排序,在JAVA里面必须要使用比较器,应该使用Comparable完成比较。通过检测可以发现,TreeSet类主要依靠Comparable接口中的compareTo()方法判断是否是重复数据,如果返回是0,那么就是重复数据,不会保存。

在以后非排序的情况下,只要是判断重复元素依靠的永远都是hashCode()与equals();

 

86.集合输出的4种方式?

Iterator(95%),ListIterator(0.05%),Enumeration(4.9%),foreach(0.05%)。

要以Iterator与Enumeration为主,记住两个接口的核心操作方法。

87.请解释HashMap与HashTable的区别?

HashMap(90%),采用异步处理,非线程安全,允许key或者value内容为null。

HashTable(10%):采用同步处理,线程安全,不允许设置null。

 

88.请解释Collection与Map的区别?

Map存放的数据的最终目的实际上是为了信息的查找,但是Collection存放数据的目的是为了输出。

 

89.关于Iterator输出的问题(核心)?

只要是集合的输出那么就一定要使用Iterator完成,但是在整个Map接口里面并没有定义任何的可以返回Iterator接口对象的方法,所以如果想使用Iterator输出Map集合,首先必须要针对于Map集合与Collection集合保存数据的特点进行分析才能实现。

利用Map接口的entrySet()方法将Map集合变成Set集合,里面的泛型是Map.Entry;

利用Set集合中的Iterator()方法将Set集合进行Iterator输出;

每一次Iterator循环取出的都是Map.Entry接口对象,利用此对象进行key与value的取出。

 

90.请解释Collection与Collections的区别?

Collection是集合操作的接口;

Collections是集合操作的工具类,可以进行List,Set,Map集合的操作。

 

91.JDBC连接数据库的操作流程?

加载驱动程序;

连接数据库;

进行CRUD

关闭数据库;

 

92.使用PreparedStatement接口操作时最需要注意的是里面的setDate()方法,因为此方法使用的是java.sql.Date,而不再是java.util.Date。

在java.util.Date类下有三个子类都是在java.sql包中的;

Java.sql.Date描述的是日期;

Java.sql.Time描述的是时间;

Java.sql.Timestamp:描述的是时间戳(日期时间)。

如果要将java.util.Date变为Java.sql.Date(Time,Timestamp)只能够依靠long完成。

Public long getTime();可以将Date变成long;

Public Date(long date) 将long变为sql.Date;

 

 

 

猜你喜欢

转载自blog.csdn.net/RobertDowneyLm/article/details/80214378