版权声明:未经本人允许,不得转载本博客,转载请注明地址 https://blog.csdn.net/qq_34691713/article/details/81987411
1.JAVA基本数据类型包括哪些?
- 基本数据类型包括byte,short,int,long,float,double,boolean,char.
2.String能被继承吗?为什么?
- java.lang.String类是final类型的,因为不可以继承这个类,不能修改这个类,为了提高效率节省空间,我们应该用StringBuffer类。
3.java集合有哪些?哪些是线程安全的?
- ①Collection接口:单列集合,有两个子接口
- List:有三个实现类
- *ArrayList:底层是数组,每次删除都要创建新数组,效率低,查找快
- *LinkedList:底层是双向链表,适合增删元素,不适合查询
- *Vector:底层也是数组,方法是Synchronize的,所以是线程安全的,效率低
- Set:有两个实现类
- *HashSet:底层是哈希表,存储的元素无序,不可重复
- *TreeSet:是SortedSet接口的实现类,存储的元素是有序的
- List:有三个实现类
- ②Map接口:双列集合(value-key)
- HashMap:非线程安全,高效,支持null
- HashTable:线程安全,低效,不支持null
- TreeMap:能够把记录值根据键排序,默认是键值的升序
4.HashMap和HashTable的区别?
- HashMap是非线程安全的,HashTable是线程安全的
- HashMap支持null键值,效率较高,HashTable不支持null,效率较低
- HashTable的方法是Synchronize的,当多个线程访问HashTable时,不需要自己为它的方法同步,HashMap就需要外同步例如:Map map=new Collections.synchronizedMap(new HashMap())
5.实现多态的方法?
- 虚方法virtual:虚方法可以给父类的方法一个实现,也必须有实现部分,哪怕是空方法
- 抽象方法abstract:抽象类不能被实例化,只能被其他类继承,继承抽象类的子类必须把抽象类中的抽象成员都重写(除非子类也是抽象类)
- 接口interface:接口实现了多态,接口解决了类的多继承的问题,接口解决了类继承以后体积庞大的问题。接口之间可以实现多继承
6.用String s=new String("xyz") 创建了几个对象?
- 首先String s是定义了一个字符串变量,并未产生对象,=不产生对象,那么只有后面的new String("xyz")了。把它拆分成"xyz"和new String(),首先在字符串常量池去寻找有没有"xyz"这个字符串,没有就创建一个“xyz”字符串对象在栈中,然后new String把这个字符串对象拷贝一份到堆中,返回这个对象的引用。所以一共产生两个对象
- 试问s变量存储在堆中还是栈中?关键点是区分s是成员变量还是局部变量,如果是局部变量在方法体内,它就存储在栈中,如果是成员变量那么久跟随成员对象存储在堆中。
7.实现多线程的方法?
- 继承Thread类
- 实现Runnable接口
- 实现Callable接口(被线程执行后,有返回值)(Future可以取得返回值)点击
8.实现多线程我们使用Thread还是Runnable?
- 当我们知道Java只支持单继承的时候,Runnable可能会好一些,接口可以被多个类实现。
9.HashMap的工作原理?
- Java 中的 HashMap 是以键值对(key-value)的形式存储元素的。HashMap 需要一个 hash 函数, 它使用 hashCode()和 equals()方法来向集合/从集合添加和检索元素。当调用 put()方法的时 候,HashMap 会计算 key 的 hash 值,然后把键值对存储在集合中合适的索引上。如果 key 已经存在了,value 会被更新成新值。HashMap 的一些重要的特性是它的容量(capacity),负 载因子(load factor)和扩容极限(threshold resizing)
10.线程都有哪些状态?
- 新建状态:刚被new出来,此时什么都没有做
- 就绪状态:当线程调用了Start()方法,线程就启动了,不一定立刻开始执行,还能得到cpu才能运行
- 运行状态:线程获得cpu的时候,线程开始执行,真正开始执行run方法
- 阻塞状态:i/o阻塞,等待i/o操作完成 同步阻塞,等待获取锁
- 死亡状态:线程完成了执行任务
11.String,StringBuffer和StringBuilder的区别?
- StringBuffer是线程安全的,StringBuilder是线程不安全的
- 执行速度,String<StringBuffer<StringBuilder
- 原因是String是字符串常量,一旦被new过就不可变了,每一次字符串的改变都是创建了新对象和垃圾回收的过程,所以速度慢,另外两个都是字符串变量,更改并不会创建新对象,StringBuffer是线程安全的,效率较低,比StringBuilder慢。
12.Spring中最重要的两个方面是什么,简述一下?
- IOC:控制反转,对象的创建不是通过new来创建,而是交给spring配置创建对象,IOC 或 依赖注入把应用的代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。最小的代价和最小的侵入性使松散耦合得以实现。
- AOP:面向切面编程,扩展功能不通过源代码实现,采用横向抽取机制,取代了传统纵向继承体系重复性代码。
13.Spring中用到了哪些设计模式?
- 工厂模式:Spring的Bean管理里用到了工厂模式,把对象的创建和使用相分离
- 单例模式:Spring的Bean 默认都是singleton,即唯一的标识去工作
- 代理模式:Spring Aop中用到了JDK 的动态代理方法
- 观察者模式:Spring中listener的实现基本都是观察者,监控想监控的对象
- 此外还有几种...面试的时候没有必要说完
14.解释一下Synchronize关键字的作用?
- Synchronize是Java中的一个关键字,是一个同步锁,可以作用在几个方面
- 修饰一个代码块,被修饰的代码块被称为同步语句块,作用范围就是{}里的代码,作用的对象是调用这个代码块的对象。
- 修饰一个方法,被修饰的方法叫做同步方法,作用范围就是整个方法,作用对象就是调用这个方法的对象。
- 修饰一个静态方法,作用范围就是整个静态方法,作用对象就是调用这个静态方法的对象。
- 修饰一个类,作用对象就是类的所有对象 详细内容 请点击
15.对Sql有哪些常见的优化方式?
- 对查询进行优化,尽量避免全表扫描,首先考虑在where和orderby涉及的列上建立索引
- 尽量避免判断为null操作,计算机会放弃索引去扫描全表
- 索引上,用>=代替=
- sql语句优化
- 用exists代替in
- 使用groupby之前可以把不需要的数据先过滤掉
- 尽量多使用commit,会因为commit释放资源效率提高
- 尽量避免使用*
- 使用别名
16.Mybatis的工作原理
- MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession。
17.Spring MVC 的工作原理
- 第一步:发起请求到前端控制器(DispatherServlet)
- 第二步:前端控制器请求处理器映射器(HandlerMapping)查找处理器(Handler)
- 可以根据xml配置,注解进行查找
- 第三步:处理器映射器向前端控制器返回Handler
- 第四步:前端控制器调用处理器适配器(HandlerAdapter)去执行Handler
- 第五步:处理器适配器去执行Handler
- 第六步:Handler执行完成向处理器适配器返回ModelAndView
- ModelAndView是springmvc框架的一个底层对象
- 第七步:处理器适配器向前端控制器返回ModelAndView
- 第八步:前端控制器请求视图解析器去进行视图解析(jsp)
- 第九步:视图解析器向前端控制器返回View
- 第十步:前端控制器进行视图渲染
- 第十一步:前端控制器相应到用户
- 涉及到的组件
- 前端控制器DispatherServlet
- 作用是接收请求,响应结果,相当于转发器
- 处理器映射器HandlerMapping
- 作用是根据请求的URL查找Handler
- 处理器Handler(需要我们实现)
- 处理器适配器HandlerAdapter
- 作用是根据特定规则(HandlerAdapter要求的规则)去执行Handler
- 注意:编写Handler时按照HandlerAdapter的要求去做,才能被适配器识别
- 视图解析器Viewresolver
- 作用是进行视图解析,根据逻辑视图解析成真正的视图
- 前端控制器DispatherServlet
18.JVM
19.不使用第三方变量,实现两个整形变量交换?(异或运算符的考查)
- 一个数杯同一个数异或两次,原数不变,例如5^10^10=5
- 所以我们可以用异或交换两个数的值
- int x=5,y=10
- x=x^y;//x=5^10
- y=x^y;//y=5^10^10=5
- x=x^y;//x=5^10^5=10
- 我们发现x,y的值发生了交换。
20.最有效计算2*8的值(位移运算符的考查)
- 2<<3;//2的二进制左移3位相当于乘以2的3次幂
21.抽象类和接口的区别?
- 接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象方法
- 类可以实现多个接口,但是只能继承一个抽象类
- 类如果要实现一个接口,它必须要实现接口声明的所有方法。但可以不实现抽象类声明的所有方法,当然,在这种情况下,类必须声明是抽象的
- 抽象类可以在不提供接口方法的情况下实现接口
- Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量
- Java接口中成员函数默认是public的,抽象类的成员函数可以是private,protected或者是public
- 接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化。但是,如果它包含main方法的话可以被调用的。
22.JVM的垃圾回收原理?
23.sleep()和wait()方法的区别?
- 每个对象都有一个锁来控制同步访问,Synchronized关键字可以和对象的锁交互,来实现同步方法或同步块。sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()或notifyAll()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行。(注意:notify的作用相当于叫醒睡着的人,而并不会给他分配任务,就是说notify只是让之前调用wait的线程有权利重新参与线程的调度)
- sleep()方法可以在任何地方使用;wait()方法则只能在同步方法或同步块中使用;
- sleep()是线程线程类(Thread)的方法,调用会暂停此线程指定的时间,但监控依然保持,不会释放对象锁,到时间自动恢复;wait()是Object的方法,调用会放弃对象锁,进入等待队列,待调用notify()/notifyAll()唤醒指定的线程或者所有线程,才会进入锁池,不再次获得对象锁才会进入运行状态;
24.线程关闭的几种方式?
-
1.设置标志符号,使线程正常退出,也就是当run()方法完成后线程终止
-
2.使用interrupt()方法中断线程
-
3.使用stop方法强行终止线程(不推荐使用,Thread.stop, Thread.suspend, Thread.resume 和Runtime.runFinalizersOnExit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的!)
25.servlet为何设计成单例多线程?
- servlet中的init方法只有在启动(例如web容器启动,要看loadOnStartup的设置)的时候调用,也就是只初始化一次,这就是单实例。
- servlet在处理请求的时候 调用的是service方法,这个方法可以处理多个客户端的请求。 具体访问时: JSP 在web容器中"翻译成servlet"由容器执行,web 容器本身就是提供的多线程,A,B,C 3个访问,建立3个独立的线程组,然后运行一个servlet。依次执行。
26.jsp的内置对象有哪些?
- request对象 request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为一次请求。
- response对象 response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作用域,它只在JSP页面内有效。
- session对象 session 对象是由服务器自动创建的与用户请求相关的对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。
- application对象 application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。与session对象相比,application对象生命周期更长,类似于系统的“全局变量”。
- out 对象 out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。
- pageContext 对象 pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
- config 对象 config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过 config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
- page 对象 page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针。
- exception 对象 exception 对象的作用是显示异常信息,只有在包含 isErrorPage="true" 的页面中才可以被使用,在一般的JSP页面中使用该对象将无法编译JSP文件。excepation对象和Java的所有对象一样,都具有系统提供的继承结构。exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
27.转发和重定向的区别?
- 转发在服务器端完成的;重定向是在客户端完成的
- 转发的速度快;重定向速度慢
- 转发的是同一次请求;重定向是两次不同请求
- 转发不会执行转发后的代码;重定向会执行重定向之后的代码
- 转发地址栏没有变化;重定向地址栏有变化
- 转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
28.http中get和post的区别?
- get是从服务器端取得数据,post是向服务器端发送数据
- get会在请求中把信息附加在URL上,是非常不安全的,post把Http包中比较安全一些
- 一般来说get有对数据大小有限制(主要是浏览器对URL的限制),而post请求理论上没有限制
29.Spring声明对象有几种方式?
- 无参构造方法(我们常用的get和set方法,<bean id="user" class="CreateObject.User">)
- 有参构造方法(<bean id="user" class="CreateObject.User"> <!-- index表示参数顺序,type为参数类型 value为参数值 --> <constructor-arg value="100" index="0" type="int"></constructor-arg>)
- 工厂模式(<!-- 创建工厂 --> <bean id="factory" class="CreateObject.ObjectFactory"></bean> <!-- 创建user对象,用factory的实例方法 --> <!-- factory-bean指定的是具体对象 --> <bean id="user4" factory-bean="factory" factory-method="getInstance"></bean> <!-- 静态方法 --> <!-- 静态方法由类调用,需要指定类的位置,factory-method指定的是工厂内的静态方法 --> <bean id="user" class="CreateObject.ObjectFactory" factory-method="getStaticInstance"></bean> </beans>)
30.Mybatis中${}和#{}的区别?
- #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id". $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by 111, 如果传入的值是id,则解析成的sql为order by id.
- #方式能够很大程度防止sql注入。 $方式无法防止Sql注入。
- $方式一般用于传入数据库对象,例如传入表名.
- 一般能用#的就别用$.
- MyBatis排序时使用order by 动态参数时需要注意,用$而不是#
31.volatile关键字的作用?
- 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。
- 禁止进行指令重排序。
- 看到一篇文章写的非常清楚 详情点击
32.JAVA中有哪些锁?
33.switch中可以填哪些值?
34.怎么避免死锁?
35.什么是事务?
36.什么是反射机制?
37.
38.final关键字有什么作用?
39.重载和重写有什么区别?
- 方法的重写Overriding和重载Overloading是Java多态性的不同表现。
- 重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
- 如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
40.tomcat下怎么布置项目?
41.单例模式有哪些常见类型?
42.JAVA使用JDBC的步骤?
- 加载JDBC驱动程序:
- 提供JDBC连接的URL 。
- 创建数据库的连接
- 创建一个Statement
- 执行SQL语句
- 处理结果 两种情况:
- 关闭JDBC对象 操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源 详情点击
43.Mysql数据库索引有哪些方式?
44.类和对象有什么区别?
- 类是一类物体的共同特性的抽象.对象是类的一个实例.
45.JSP是如何被处理的?
- 浏览器首先要请求一个以.jsp扩展名结尾的页面,发起jsp请求,然后web服务器读取这个请求,使用jsp编译器把jsp页面变成一个servlet类,只有当第一次请求页面或者时候jsp文件发生改变的时候jsp文本才会被编译,然后服务器调用servlet类,处理浏览器的请求,一旦请求执行结束,servlet会把响应发送到客户端。