java基础面试常见

请说一下break和continue的区别?

1、这两个语句都可以用于跳出循环的;

2、break是中止循环,执行循环体以后的语句,而continue是跳出本次循环,执行下一次循环;

2、       switch 中用于判断的表达式,可以用哪些数据类型?

1、可以是char、byte、short、int,不可以是long、String等其他类型;

2、从JDK1.7开始,支持String类型;

3、 char型变量中能不能存贮一个中文汉字?为什么?

Java里采用了Unicode编码格式,Unicode编码中一个char型占用2个字节,而一个汉字也是占用2个字节,所以可以存储中文汉字。

备注:C语言里,char占用1个字节,不用存汉字。

4、 静态变量和实例变量的区别?

在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

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

5、       是否可以从一个static方法内部发出对非static方法的调用?

不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。

6、 Integer与int的区别

1、int是基本数据类型,Integer是包装类;

2、int的默认值是0,Interger的默认值是null;

7、 Overload和Override的区别。参数列表相同,返回值不同的方法,是否是重载方法?

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

重载是指在一个类里,方法名相同,参数不同;

重写是指子类继承父类,子类里重新编写了父类中的同名(同参数)方法,也就是覆盖了父类的方法;

不是!因为重载必须要求参数列表不同!

8、 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)?

接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承具体类。

备注:只要明白了接口和抽象类的本质和作用,这些问题都很好回答。

只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。

9、 面向对象有哪三大特性?

1、面向对象有三大特性,分别是:封装、继承和多态。

2、封装:面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个类中,有些属性是不希望公开的,或者说被其他对象访问的,所以我们使用private修饰该属性,使其隐藏起来;类中提供了方法(用public修饰),常用的是get、set方法,可以操作这些被隐藏的属性,其他类可以通过调用这些方法,改变隐藏属性的值!

下面的回答是更高要求,不需要学生必须掌握:

封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。

3、继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,使用extends关键字实现继承;子类中可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。

4、多态:多态就是在声明时使用父类,在实现或调用时使用具体的子类;即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性,多态增强了软件的灵活性和扩展性。这里可以举个例子,比如声明时使用的是动物类,调用时传递的是一个猫类(动物类的子类)的对象,具体执行父类里动物——吃的方法时,实际执行的是猫——吃的方法。

10、      abstract class和interface有什么区别?  

1、抽象类里面可以用普通方法,而接口中的方法全部都是抽象的;

2、在应用范围上来说,接口往往在程序设计的时候,用来定义程序模块的功能,方便各模块协同工作;抽象类是对相似类进行抽象,形成一个抽象的父类可供重用!

11、      String是最基本的数据类型吗?

1、String是个类,不是基本数据类型;

2、基本数据类型包括byte、int、char、long、float、double、boolean和short。

12、      String 和StringBuffer的区别

1、String是个不可变长度的字符串,而StringBuffer是个可变长度的字符串;

2、在对String类进行操作的时候(例如增加字符),实际上是在内存中产生了一个新的String对象; 而StringBuffer是给原对象增加字符,不是新创建一个对象;

13、      数组有没有length()这个方法? String有没有length()这个方法?

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

14、      final, finally, finalize的区别。

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

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用

15、      请说一下你常用的几种异常?

比如:

1、  空指针异常;

2、  数组下标越界;

3、  类型转换异常;

4、  算数异常,例如除数为零;

5、  IO异常,比如说找不到文件;

6、  找不到类异常;

7、  sql异常,例如sql语句不能正常运行;

8、  …

16、      线程的基本概念?线程的基本状态以及状态之间的关系

1、是程序执行流的最小单元。在单个程序中同时运行多个线程完成不同的工作,称为多线程

2、开始时:就绪状态,等待cpu调用后进入运行状态,运行过程中遇到阻塞事件,进入阻塞状态,等待阻塞事件结束后,重新进入就绪状态;如果没有阻塞事件,运行结束后,则进入结束状态。

17、      sleep() 和 wait() 有什么区别?

     sleep就是暂停当前线程一段时间,把cpu让给其他线程使用,到时后会自动恢复。调用sleep不会释放对象锁。 wait方法导致本线程放弃对象锁,进入等待,只有等到本对象的notify方法(或notifyAll)后本线程才进入就绪状态,等待执行。

18、      多线程有几种实现方法?

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口

19、      启动一个线程是用run()还是start()? .

启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。

20、      Set和List的区别,List和Map的区别

1、Set是无序的,元素不可重复;List是有序的,元素可以重复;

2、List存储的是单个对象的集合(有序的),Map存储的是键值对为对象的集合(无序的);

21、      HashMap和Hashtable的区别

1、HashMap和Hashtable都完成了Map接口;

2、HashMap非线程安全的,而Hashtable是线程安全的,原因是Hashtable里面的方法使用Synchronize关键字修饰的;

3、因为Hashtable使用了Synchronize关键字修饰,其性能比较差;(具体原因不做详细说明)

22、      说出ArrayList, LinkedList的区别

23、 1、ArrayList和LinkedList都完成了List接口;

2、ArrayList底层是用数组实现的,而LinkedList使用链表实现的;

3、ArrayList在插入、删除时,需要移动数组元素,故性能较差;但是在查询时,因为是连续的数组,所以查询速度快;LinkedList正好相反。

24、 请描述一下JDK1.5有哪些新特性?

1、泛型

2、For-Each循环

3、自动装包/拆包

4、枚举

5、静态导入

6、Annotation

25、      为什么要使用单例模式

1、避免在开发程序的时候,创建出一个类的多个实例(占用空间,性能问题),所以使用单例模式,保证该类只创建一个对象;

2、一般单例模式通常有两种形式:它的构造函数为private的,必须有一个静态方法,静态方法返回自己的实例;实行形式有两种,懒汉式和饿汉式;所谓的饿汉式就是在声明实例的时候直接初始化对象,而懒汉式是先声明一个空对象,在静态方法中实例化该对象并返回。

1.面向对象的三大特性

继承、封装、多态

什么是继承?

①继承是面向对象程序设计能够提高软件开发效率的重要原因之一。

②继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷。

③继承来的属性和方法是隐式的,也就是在本类里面是看不见的。

④一个类只能有一个父类,也就是类只能是单继承。

⑤一个接口可以有多个父类,也就是接口可以是多继承。

实际项目开发中,一个类继承于另一个类,那么前者就是后者的子类,反则反之。

什么是封装?

对象数据和操作该对象的指令都是对象自身的一部分,能够实现尽可能对外部隐藏数据。

实际项目开发中,使用封装最多的就是实体类,常常和JavaBean(类必须是具体的和公共的,并且具有无参数的构造器)一起使用。

那么,实体类有那些东西呢?

答:私有的成员变量、无参数的构造器、有参数的构造器、setter和getters方法、重写tostring方法、重写hashCode和equals方法。

什么是多态?

①多态就是对象拥有多种形态:引用多态和方法多态。

②引用多态:父类的引用可以指向本类对象、父类的引用可以指向子类的对象。

③方法多态:创建本类对象时,调用的方法为本类的方法;创建子类对象时,调用的方法为子类重写的方法或者继承的方法。

④存在多态的必要条件:继承、重写。

⑤多态的作用是消除类型之间的耦合关系。

在实际项目开发中,A类继承B类,如果在A类中不重写B类的方法的时候,输出的仍旧是B类方法里面的信息(B b=new A());如果在A类中重写B类的方法的时候,输出的是A类方法里面的信息(B b=new A())。

2.Java集合框架树

Collection接口:它是Java集合框架的一个根接口,也是List、Set和Queue接口的父接口。同时它定义了可用于操作List、Set和Queue的方法—增删改查。

Map接口:它提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的。Map接口有一个重要的实现类HashMap。

①在Map接口中的键值对是以Entry类型的对象实例形式存在。

②在Map接口中键值(Key值)是不可以重复的,value值却可以重复,也就是存在多对一的关系。

③在Map接口中提供了分别返回Key值的集合、value值的集合以及Entry集合的方法。

④Map支持泛型,同时Key值和value值都是可以为null的。

⑤在HashMap中的Entry对象是无序排序的,这点特性和List接口是相反的。

⑥在HashMap中有且只能有一个Key值为null的映射。(注:key值是不能重复的)

List接口:List接口有一个重要的实现类ArrayList(数组序列)。

①List是元素有序并且可以重复的集合。

②List可以精确的控制每个元素的插入位置,或删除某个元素的位置。

Comparator接口:临时的比较规则。如果某一个类要实现这个接口,那必然要实现它的Compare()方法。

Comparable接口:默认的比较规则。当实现了这个接口,则表示这个类的实例可以比较大小,可以进行自然排序。如果某一个类要实现这个接口,那必然要实现它的CompareTo()方法。

3.Java中的IO流

字节流:

//一个字节一个字节的读写

FileInputStream in=new FileInputStream("源文件");

FileOutputStream out=new FileOutputStream("目标文件");

......

in.close();

out.close();

首先要记住,一旦使用了IO流最后一定要记得关闭,这是常识。

//利用缓冲区,高效的读取字节

BufferedInputStream in=new BufferedInputStream(new FileInputStream("源文件");

BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream("目标文件");

......

in.close();

out.close();

字符流:

InputStreamReader isr=new InputStreamReader(new FileInputStream("源文件路径"),"设置编码");

OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("目标文件路径"),"设置编码");

......

osw.close();

isr.close();

也可以这样写:

FileReader fr=new FileReader("源文件路径");

FileWriter fw=new FileWriter("目标文件路径");

......

fr.close();

fw.close();

//利用缓冲区,高效的读取字符

BufferedReader br=new BufferedReader(new FileReade("源文件路径");

PrintWriter pw=new PrintWriter("目标文件路径");

......

br.close();

pw.close();

序列化和反序列化:

//对象的序列化

ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));

这里的file指的是String file="文件在项目中的路径";

//对象的反序列化

ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file));

4.Java的Socket通信(多线程)

思路:

①首先创建服务器端Socket,指定并侦听某一个端口,然后循环监听开始等待客户端的连接….

②创建客户端socket,指定服务器地址和端口,然后获取输出流,向服务器端发送请求,并关闭socket输出流。

③服务端接收到客户端的请求后,创建新线程并启动。

④创建线程处理类,执行线程操作,获取输入流,服务端读取客户端用户详情,关闭资源。

⑤执行线程操作,获取输出流,响应客户端请求,客户端接受到服务端的响应,关闭资源。

简单点讲,就相当于我跟你说话(客户端→服务端),你收到我说的话(服务端→线程处理类),大脑进行思考后(线程处理类),做出回答我的话(线程处理类→客户端)。

5.关系型数据库

数据库的三范式:

①字段不可分。

②有主键,非主键字段依赖主键。

③非主键字段不能互相依赖。

T-SQL:

在整个数据库中,查询操作占据增删改查的80%,而说到查询,T-SQL语句自然不能少。如图上示。

增:

①插入单行

insert into <表名> (列名) values (列值)

②将现有的表数据添加到一个已有表

insert into <已有的新表> (列名) select <源表列名> from <源表名>

③直接拿现有表数据创建一个新表并填充

select <新建表列名> into <新建表名> from <源表名>

删:

①删除满足条件的行

delete from <表名> where <删除条件>

②删除整个表

truncate table <表名>

注:删除表的所有行,但表的结构、列、约束、索引等不会被删除;不能用语有外建约束引用的表。

改:

①更新

update <表名> set <列名=更新值> where <更新条件>

子查询:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);

其中:

①SELECT * FROM t1 …称为外查询。

②SELECT column1 FROM t2 称为子查询。

所以,我们就说子查询是嵌套在外查询内部的。而事实上它也有可能在子查询内部再嵌套一个或者多个子查询。这里要注意,子查询必须出现在圆括号之间哦。

JavaWeb

JavaSpring 总结

JSP

思路:当用户使用客户端浏览器向服务器发送一个请求访问index.jsp页面,当服务器接收到客户的请求之后,开始判断用户所访问的这个资源是否是第一次访问?

①如果是第一次请求,那么Tomcat的JSP引擎就把这个JSP文件转换成一个Servlet(一个Servlet从本质上而言也是一个Java类),既然是一个Java类就需要通过编译,生成相应的字节码文件,然后执行jspInit这个初始化方法。再生成JSP页面的字节码文件,转到③。

②直接访问所生成的JSP页面的字节码文件,转到③。

③最后解析执行这个Java类当中的jspService方法,这个方法就是专门用来处理用户的请求。

JSP九大内置对象:

out对象:它是JspWriter类的实例,是向客户端输出内容常用的对象。

request对象:它表示客户端的一次请求,这个请求里面的信息是被封装在request对象中的。同时它也是HttpServletRequest类的实例,并且具有请求域,也就是在完成客户端的请求之前,该对象是一直有效的。

常用方法:

request.setCharacterEncoding("UTF-8");//设置编码,解决中文乱码问题。

request.setAttribute("","");//前者为需要设置的属性,后者为需要的值。

request.getAttribute();

request.getRequestDispatcher("index.jsp").forward(request, response);//请求转发到index.jsp页面,该请求对象是一直有效的。

response对象:它包含了响应客户请求的相关信息,它也是HttpServletResponse类的实例。和request一样,它具有页面的作用域,也就是在访问一个页面的时候,该页面的response对象只对这次访问有效,往后执行是不存在、无效的。

常用方法:

response.setContentType("text/html","charset="utf-8");//设置响应的MIMI类型。

response.sendRedirect("index.jsp");//请求重定向,如果存在多次重定向,那么对象数据是不会保存下来的,即为null。

请求转发和请求重定向的区别分析:

  • 请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。

  • 请求转发:服务器行为,request.getRequestDispatcher().forward(req, resp);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。

session对象:当我们第一次访问页面的时候,session对象就会被自动装载和创建。它是HttpSession类的实例对象。

什么是会话?为什么要用session对象?

  • 会话:当一个客户端打开浏览器连接到服务器开始,到客户端关闭浏览器服务器结束这个过程,我们称为一个会话。

  • 在实际情况下,客户在访问服务器的过程中,避免不了会在服务器的几个页面之间切换,这时候服务端有必要知道当前操作的客户是不是操作前几个页面的客户,也就是必须要清楚知道是否同一个人在进行操作。所以就引入了session对象这个概念。

application对象:它实现了用户间数据的共享,可以存放全局变量,它是ServletContext类的实例。它的生命周期开始于服务器的启动,终止于服务器的关闭。

注:

①在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。

②在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。

JSP的指令和动作:

①三个编译指令:page、include、taglib。

②七个动作指令:jsp:forward、jsp:param、jsp:include、jsp:plugin、jsp:useBean、jsp:setProperty、jsp:getPProperty。

JSP指令:

include指令和include动作指令区别:

Session的生命周期

Session生命周期的“活动”思路:

①某次会话当中通过超链接打开的新页面属于同一次会话。

②只有当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。

③除非本次会话的所有页面都关闭后再重新访问某个Jsp或者Servlet将会创建新的会话。

注:

注意原有会话是还存在的,只是这个旧的SessionId仍然存在于服务端,只不过再也没有客户端会携带它然后交予服务端校验。

注:

①当Web容器启动的时候,过滤器就已经加载并启动了。

②实例化只会实例化一次,也就是说在Web容器中只会使用一次。

思路:

①首先判断Servlet实例是否存在,如果存在则跳入第③步。

②初始化阶段,init初始化方法是在创建实例之后完成的。

③响应阶段,响应客户端的请求,调用service()方法。由service()方法根据提交方式选择性执行doGet()方法或者doPost()方法。

④终止阶段,调用Destroy()方法销毁,服务器关闭。

Web监听器

Web监听器是有Servlet规范定义的一种特殊类,它可以监听客户端的请求和服务端的操作,同时它还可以监听,包括ServletContext、HttpSession、ServletRequest等对象。

监听器的分类

HttpSession的事件监听器

ServletContext的事件监听器

ServletRequest的事件监听器

注:

这三个监听事件,分别实现对应的接口,也就是图示的1..N。既然实现了接口,即必然要实现其对应的方法,如图所示。主要用途也如图所示。

绑定到HttpSession域中的对象状态的事件监听器

注:

为什么要用session钝化?

首先,正常情况下,我们的session是存放在服务器的session当中的,但是如果我们的用户很多的时候,仍然把session存放在服务器里,这时服务器的开销是很大的,会直接影响我们Web应用的使用。所以就需要使用到session钝化机制,它的本质就是将服务器未使用到的session对象暂时序列化到系统文件当中,当要使用的时候再反序列化到服务器内存当中。

Model1和Model2

注:

Model1是最早的能体现分层思想的一种开发模式,简单来说Model1就是一种Jsp+JavaBean的一种开发模式。

缺点:可维护性和可扩展性是比较差的。

思路:

①首先由Jsp页面向Servlet提交一个请求。

②然后在我们的控制层Servlet实例化一个模型层的对象或者调用模型层的一些功能。

③然后由模型层来访问读取我们的数据库层。

④当得到读取到结果后,再将结果返回到我们的控制层。

⑤控制层得到这个结果后,会根据这个结果给用户展示不同的Jsp页面。

猜你喜欢

转载自blog.csdn.net/Athena072213/article/details/82631146