java基础面试题

1.面向对象的三大特性

封装:就是将类的特性和方法隐藏起来  对外界只提供可访问的接口  外界就可以直接通过接口来进行访问这个类

继承:多个类中存在相同属性和行为时,就可以将这些内容抽取出一个父类  让其他类来继承他。初始化子类时先初始化父类,即调用构造函数时隐式执行父类构造函数

多态:就是父类引用指向子类对象  或者是接口引用指向实现类对象

2.访问修饰父有哪些:

public:公共的   

private:类私有的

protected:当前类  和同一个包下面的类及其子类

defalut:

3.为什么要有包装型:

java是面向对象编程语言  而int等都是基本型  为了能将基本型数据当成对象来操作  就有对应的包装型

4.自动拆装箱:

基本型转成包装型就是装箱

包装型转成基本型就是拆箱  java5开始自动实现自动拆装箱机制

5.&与&&的区别

首先两者都要求两个表达式的值为true整个表达式的值才是true。但&&是短路运算  当左边式子的值是false的时候 右边就不会再继续判断了  而&则会自己判断。

6.引用和实例对象

创建对象实际上是创建了一个引用对象和一个实例对象  引用对象是存在与栈内存中的  而实例对象则是存在于堆内存中的

7.数组有没有length()方法?String有没有length()方法?

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

8.构造方法能否被重载(覆盖)

构造方法不能被继承  所以不能被重载  但是可以被重写  子类调用构造方法创建对象的时候会隐性的先调用父类的构造方法

9.equal与hashcode

equal为true hashcode必定相同  但是hashcode相同  不一定equal为true

10.java中的传递都是值传递

11.final关键字

final修饰的类不能被继承

final修饰的变量不能被修改

final修饰的方法不能被继承重载

12.String字符类

String对象是字符串常量  一旦定义就不能被改变  但是这里指的是实例对象不能被改变  引用对象还是可以宠幸指向其他实例变量  但是会开辟新的内存

13.String  StringBuffer   StringBulider

String类是字符串常量  一旦定义无法修改  StringBuffer(调用append  insert  reverse等方法)和StingBuilder就可以来定义可修改的字符串变量   但是StringBuffer线程安全(方法都被synchronized修饰)  可以同步访问   StringBulider线程不安全  就不能同步访问

14.方法的重载与重写

重写:发生在两个类中  是子类对父类方法的覆盖   构造方法无法被继承  不能被重写

重载:发生在同一个类中  重载的两个方法之间 方法的返回值类型  方法名都相同  参数列表不同

15、执行流程

编译生成字节码class文件(不是完全的二进制文件)保存在硬盘上  然后启动JVM  然后JVM会启动类加载器(classloader) classloader会去硬盘上找编译生成的类文件  然后将class文件加载在到内存中 同时还会根据需求利用反射机制动态的创建实例对象  执行程序

16、跨平台原理

因为-编译生成的是字节码文件不是完全的二进制文件  所以是不能在底层系统上直接执行的  字节码文件都是运行在jvm上的  而不同系统有不同的jvm 只要安装对应的jvm就可以运行java程序  所以java程序就可以完成跨平台执行  一次编译  多次执行

17、接口和抽象类的区别

接口:接口中的成员变量默认都是静态常量  接口中的方法都必须是抽象方法(abstract修饰  无方法体)接口支持多实现  多继承抽象类:抽象类由abstract关键字修饰  抽象类中的方法可以不是抽象方法  抽象类也可以没有抽象方法  但有抽象方法的类必须是抽象类  抽象类只支持单继承 

接口和抽象类都无法被直接实例化  都只能利用实现类或是子类来实例化

18、接口能否继承接口  抽象类能否实现接口  抽象类能否继承具体的类

接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。

19、java存在内存泄漏么

不存在  java有垃圾回收机制  垃圾回收的时候会调用finalize()方法  由jvm来调用

20、js与java的区别

基于对象和面向对象:Java是一种真正的面向对象的语言;JavaScript是种脚本语言,它是一种基于对象和事件驱动的编程语言,
- 解释和编译:Java的源代码在执行之前,必须经过编译。JavaScript是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行。
- 强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量是弱类型的,甚至在使用变量前可以不作声明,JavaScript的解释器在运行时检查推断其数据类型,所有的变量类型都是var

21、finally关键字修饰的代码块

无论如何一定会被执行  由return语句就会return返回之前进行执行

22、异常

所有的异常类是从 java.lang.Exception 类继承的子类。

Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 

Error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。

编译时异常(可检查异常):在编译时就不可以忽略的异常  要么抛出  要么捕获

运行时异常:在编译时可被忽略  在运行时不可忽略

常见的运行时异常:

下标越界   空指针   类型转换   算术异常

23、异常处理

try  catch:捕获异常

throw/thorws:抛出异常  throw  方法体内部  抛出一个具体的异常实例

throws  用在方法上  向上抛出异常  谁调用方法就抛出给谁  不对异常进行处理

24、集合

集合的顶层接口由collection和map两个(collections是辅助操作集合的工具类)

collection下的继承的三个接口:set  list  queue

      (1)list与set的区别:list允许多个null元素  set只允许一个null元素

                                          list允许元素重复  set不允许元素重复

                                          list元素有序  set元素无序

        (2)linklist与arraylist的区别:       

                linklist底层实现是链表  支持顺序访问  存储密度低  增删速度快

                arraylist底层实现是数组  支持随机访问   存储密度高   增删速度慢       

               

set下无继承接口  主要实现类有:hashmap  hashtable

          (3)hashmap与hashtable的区别:

                      Hashmap线程不安全  允许null

                      hashtaple线程安全  不允许null

25、集合与数组的区别

集合:集合中只能存储对象  不能存储基本类型数据  集合可扩展  长度不定(利用迭代器遍历集合的时候可以对集合底层元素进行删除)

数组:数组中既可以保存对象数据也可以保存集合数据  长度一定

26、线程:

       (1)线程和进程:

                进程由线程构成  线程依赖于进程存在

       (3)线程的声明周期:

                1、新建:创建线程即为新建状态

                2、就绪:线程调用start方法即处于就绪状态

               3、运行:cpu调度线程开始执行

               4、阻塞:等待阻塞:线程调用了wait()方法

                                同步阻塞:线程执行的时候获取锁对象失败

                              其他阻塞

         (2)线程的实现方式:

                继承thread  重写run方法  调用start方法开启线程

                实现Runable接口   重写run方法  调用start开启线程   实现runable接口在创建实例的时候还是要将runable的实现类作为参数来创建一个thread实例  所以实际上还是创建thread对象

两者的区别:

实现runable接口的实现方式很好的解决了java单继承的局限性  且这种方式可以实现数据共享

          (3)线程安全

                  什么是线程安全:

                                           java程序只能保证各个线程都进行执行但是并不能保证线程的执行顺序  所以就不能保证执行结果的正确性   所以线程安全就是在保证所有线程都执行的情况下保证执行结果的正确

    (4)保证线程安全:

             同步代码块  同步方法  加关键字 synchronized

             使用锁机制Lock  创建锁对象  使用方法lock()获取锁对象   unlock()释放锁对象  

             区别:synchronized会自动释放锁对象   Lock机制需要手动释放锁对象  一般放在finally中

    (5)wait(),sleep(),yeid()方法的区别

           wait():线程调用方法进入阻塞状态  释放锁对象   再次执行要调用notify()方法并重新获取锁对象才可以

          sleep():线程调用方法进入阻塞状态  不释放锁对象   方法执行完成线程继续执行

          yeid():线程调用方法进入就绪状态 

 

27、Comparable 和 Comparator 的区别?

Comparable 相当于一个内部比较器  一般用于可修改的类上   实现compareTo方法实现比较  对对象的耦合度高  

Comparator相当于一个外部比较器  一般用于不可修改的类上  需要定制一个比较类去实现它,重写里面的compare方法实现比较

 

28、什么是序列化

序列化:指将对象数据转成字节序列  ,该字节序列包括该对象的各种信息  

反序列化将序列化对象写入文件之后,可以从文件中读取出来,并且对它进行反序列化在内存中新建对象

29、序列化实现

实现Serializable或者Externalizable接口  实现这两个接口就是标记这两个接口可序列化  然后调用java.io.ObjectInputStream的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。调用java.io.ObjectOutputStream的writeObject()将对象数据写出成字节序列

先创建流对象  再调用方法进行读入写出   当一个属性不想呗序列化的时候  使用关键字transient即可

30、代理机制

动态代理:创建目标类的代理类,再不改变原目标类的情况下,可以扩展目标类的方法 添加一些辅助功能  实现解耦

实现方式:

               jdk原生实现   要求目标类和嵌入类实现同一接口  (代理类与目标类产生联系就是因为双方都实现了同一个接口)   代理类要实现InvocationHandler 接口重写 invoke 方法,添加辅助功能业务逻辑   代理对象为Proxy类   使用 Proxy.newProxyInstance 方法获取代理对象    

              使用CGLib实现:CGLib是一个代理框架   不要求代理类和目标类实现统一接口

AOP:底层是两种动态代理机制的动态切换实现

31、反射

什么是反射:反射机制就是指在程序的运行过程中动态的加载一些类  可以获取这些类的实例对象  调用方法 属性等(java是完全的面向对象编程语言  会把类  属性  方法都封装成一个类)

获取类的方法:Class.forName()   实例.getClass()   类名.class

32、Class.forName() 与ClassLoader的区别

两者都是加载类到jvm中  但是Class.forName()在加载的时候还会对类进行解析  执行类中的satic块

ClassLoader仅仅就是进行加载不会执行static块

33、类的实例化顺序

父类的静态成员变量静态代码块  子类的静态成员静态代码块   父类的非静态成员变量非静态代码块    父类构造方法   子类的非静态成员非静态代码块    子类构造方法

34、值传递和引用传递

值传递是传递传递变量值的副本    引用传递是传递地址的副本而不是变量本身

java默认都是值传递

35、多态的实现

实现接口  继承父类  方法重载

36、static关键字

修饰变量:变量随着类加载而加载  所有实例共享一份变量  在类加载进jvm的时候会对变量进行实例化

修饰方法:方法是静态方法  随着类加载而加载  类名直接调用  不可被重写(静态方法可以被继承但不可以被重写   构造方法不能被继承所以不能被重写)  非静态方法可以调用静态的方法变量但是非静态方法不可以调用静态的方法变量

37、不可变对象

就是指一旦创建就不可以在被改变  一旦改变都会创建一个新的实例对象  例如String

38、创建对象的几种方式

构造方法   反射   反序列化

39、switch参数类型

int   byte   char    String

40、String的intern()方法

String str=“aaa”  str.intern();  会先去常量池中判断是否存在于与str值相等的String  如果有就返回该String的引用  如果没有  就会创建新的String对象并把引用值返回

41、java中==与equals的区别

==:当比较的是基本变量的值的时候  比较的是实例对象的值   当比较的是对象数据的值的时候  比较的是两个对象的引用的值

equals:是object的公共方法  底层实现哦也是基于==的  但是一般在子类中会进行重写  来进一步判断

42、Object中的公共方法

equals   getClass()  toString

43、hashcode()与equals()

hashcode()相等equals()未必相等

equals()相等hashcode()一定相等

44、break和continue

break退出整个循环

continue退出当前循环

45、io流:

       io流顶层接口:

       字符流:读入:Reader   实现类:BufferReader

                    写出:wirte    实现类:BufferWriter

       字节流:InputSream:实现类  ObjectSInputtream

                    outputStream: 实现类  ObjectOutputStream 

     缓冲区:缓冲就是在对某一个资源(文件或数据库)频繁操作的时候可以将数据先放在缓冲区  再一次统一操作  对字符流的操作实际上就是对缓冲区的操作

 

字符流与字节流的区别:对字节流的操作实际上是直接操作文件本身   对字符流的操作实际上是经过缓冲区的

 

46、泛型:

什么是泛型:就是参数化类型  可以将类型当成参数来对待  再使用的时候将类型作为参数进行传入

泛型的好处:通过一次反斜就可以对多种类型的数据进行操作(可变参数)

泛型类  泛型方法  集合泛型:

泛型类:public class Generic<T>  根据t的传值可以进行使用

泛型接口:public interface Generator<T>

泛型方法:public <T> T showKeyName()  public <T> void  showKeyName()  T可以用在很多地方

集合泛型:规定集合中存储的数据类型

 

47、线程池:

什么是线程池:线程池就是提前创建若干个线程,如果有任务需要处理,线程池里的线程就会处理任务,处理完之后线程并不会被销毁,而是等待下一个任务。Executor接口的实现用于创建线程池  空间换时间

常见的线程池:

Java中有三个比较常用的线程池

FixedThreadPool,创建固定大小的线程池

SingleThreadExecutor:单个线程的线程池,即线程池中每次只有一个线程工作,单线程串行执行任务

CachedThreadPool:创建一个可缓存的线程池

Spring中的线程池是由ThreadPoolTaskExecutor类来实现的

常见线程池参数:

corePoolSize:线程池的大小。线程池创建之后不会立即去创建线程,而是等待线程的到来。当当前执行的线程数大于改值是,线程会加入到缓冲队列;
maximumPoolSize:线程池中创建的最大线程数;
keepAliveTime:空闲的线程多久时间后被销毁。默认情况下,改值在线程数大于corePoolSize时,对超出corePoolSize值得这些线程起作用。

框架:

spring:

ioc:核心是控制反转和依赖注入   控制反转就是指再ioc容器管理组件之后会在需要的时候通过反射机制来创建bean对象  依赖注入就是指在创建bean对象的时候可能还需呀一些其他的资源  那么ioc容器就会动态的将这些资源进行注入

Java中依赖注入有以下三种实现方式:构造器注入、Setter方法注入、接口注入

aop:面向切面编程  底层原理是动态代理  在运行时,创建目标类的代理类,可以扩展目标类的方法 添加一些辅助功能  底层是jdk和cglib动态代理框架的动态切换实现     AOP技术支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用

jdk:代理类要实现invacationHeandler接口  实现  invko方法  编写业务逻辑  要求 目标类与辅助类要实现同一个接口   使用 Proxy.newProxyInstance 方法获取代理对象  代理对象和被代理对象之所以能进行联系就是因为两者实现了同一个接口,

cglib不要求实现相同接口

基于aop 所以spring的事务控制就是申明式事务而不是编程式事务

 

申明式事务的实现:

基于注解和xml实现

注解:

配置事务管理器   配置jdbcTemplement操作数据库   开启基于注解的aop模式   给事务方法加上 @Transactional注解

Xml配置:配置数据源  配置jdbc templament  编写事务方法操作数据库   使用tx和aop名字空间配置事务方法运行

aop实现:

基于注解实现和基于xml配置实现

1.开启基于注解的aop模式

2.使用注解@Aspect指明切面类

3.编写切入点表达式

4.加上通知注解

  通知:before  目标方法之前执行

            afterRunning  目标方法完成之后执行

           after  目标方法之后执行

          afterThrowing  目标方法异常之后执行

          around  环绕通知  优先于所有普通通知

 

bean的生命周期:

spring创建的bean默认是单例的  但也可以改变  单例的bean在容器创建的时候就创建

多利的bean在获取的时候进行创建  

属性scope进行指定

值:prototype:多实例  singleton:单实例

 

bean的创建:

set方法注入   构造器注入  工厂注入

工厂:实现beanfactory接口即可

 工厂就是一个类帮助进行创建组件对象

 静态工厂:  工厂本身不需要进行实例创建   通过静态方法进行实例创建   类名直接调用创建方法进行组件实例的创建

 实例工厂:先要创建工厂对象

              再调用方法进行实例创建

自动装配:

@autowire  @resource   @autowire是spring的注解  脱离spring就用不了了    @resource Java的注解 扩展性更强

查找:先按bean的名字找  按类型  按构造器

 

Spring 框架中都用到了哪些设计模式?

(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;

(2)单例模式:Bean默认为单例模式。

(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;

 

spring常用注解:

@controller  @service  @compent  @reposity  @Autwied  

 

springMVC

什么是springMVC

Spring MVC是一个基于MVC设计模式的请求驱动的Web框架,通过把Model,View,Controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合

 

springMVC执行流程:

前端控制器拦截除了jsp以外的所有请求   处理器映射器会根据保存的映射信息查找处理该请求的处理器  然后根据该处理器找到该请求的适配器  (如果有拦截器的话  拦截器的preHander方法会先执行) 适配器会执行目标方法,并返回ModelAndView    

拦截器的postHandler执行   页面响应(页面渲染)   执行拦截器的AfterHandeler方法

 

springMVC的组件:

前端控制器  处理器映射器HandlerMapping   适配器 HandlerAdapter  视图解析器 ViewResolver  处理器

 

SpringMVC怎么样设定重定向和转发的?

(1)转发:在返回值前面加"forward:"  可以转发到另一个页面或者是请求

(2)重定向:在返回值前面加"redirect:  可以重定向到另一个页面或者是请求

 

springMVC实现ajax:主要是返回json数据即可  加注解@RequestBoby

 

springMVC解决乱码问题:

Get:修改服务器的配置文件

Post:可以在获取参数的时候进行编码设置

也可以在配置文件中配置一个字符编码过滤器 CharacterEncodingFilter

前端控制器:

前端控制器本质上是一个servlet  所以是在web.xml中进行配置的  默认是的单例的

 

 

  

 

 

 

 

 
 
 
 

 

 

 

 

 

 

 

 

 

 

 

    

 

 

                   

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值