JAVA面试通关知识点必备(持续更新中)

版权声明:未经本人允许,不得转载本博客,转载请注明地址 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接口的实现类,存储的元素是有序的
  • ②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
      • 作用是进行视图解析,根据逻辑视图解析成真正的视图

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中有哪些锁?

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会把响应发送到客户端。

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_34691713/article/details/81987411