Java面试基础知识点

1.面向对象的特点?
封装、继承、抽象、多态
2.int和intger的区别?

  • intger是int的封装类,int是intger的原始类型
  • int的默认值为0,intger默认值为null

3.String和StringBuffer的区别?

  • String提供了数值不可变的字符串
  • StringBuffer提供了数值可变的字符串

4.说出Servlet的生命周期
Servlet生命周期可以分为三个阶段:
1、初始化阶段
2、响应客户阶段
3、终止阶段
在javax.servlet.Servlet接口中定义了三个方法init(),service(),destroy(),它们将分别在Servlet不同的阶段被调用。
5.1.说出ArrayList,Vector, LinkedList的存储性能和特性
1.ArrayList 和Vector都是使用数组方式存储数据,都实现了List接口,他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,
2.Vector由于使用了synchronized方法(线程安全),而ArrayList是线程序不安全的
3. LinkedList使用双向链表实现存储
5.2.List、Map、Set三个接口,存取元素时,各有什么特点?
List,Set是继承自Collection接口,Map不是

  1. List 集合中对象按照索引位置排序,可以有重复对象,允许按照对象在集合中的索引位置检索对象,例如通过list.get(i)方法来获取集合中的元素;
  2. Map 中的每一个元素包含一个键和一个值,成对出现,键对象不可以重复,值对象可以重复;
  3. Set 集合中的对象不按照特定的方式排序,并且没有重复对象,但它的实现类能对集合中的对象按照特定的方式排序,例如 Tree Set 类,
    6. Collection 和 Collections的区别
    Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
    7.&和&&的区别。
    &是位运算符,表示按位与运算,
    &&是逻辑运算符,表示逻辑与(and)。
    &&具有短路的功能
    8.HashMap和Hashtable的区别
    HashMap是Hashtable的轻量级实现,他们都完成了Map接口
    HashMap允许空(null)键值(key),而Hashtable不允许。
    HashMap是线程安全的,Hashtable是线程不安全的
    HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。
    9.final, finally, finalize的区别
     final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
     finally是异常处理语句结构的一部分,表示总是执行。
     finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃 圾收集时的其他资源回收,例如关闭文件等。
    10.sleep() 和 wait() 有什么区别?
      sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁
      wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
    11. Overload和Override的区别。
      重载Overloading表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同
      重写Override表示子类中的方法可以与父类中的某个方法的名称和参数列表完全相同
    12.error和exception有什么区别?
      error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。
    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
    13."=="和equals方法有什么区别?
    ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等
    equals方法是用于比较两个独立对象的内容是否相同,它比较的两个对象是独立的
    14.静态变量和实例变量的区别?
    在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
    实例变量属于某个对象的属性,必须创建了实例对象,实例变量才会被分配空间,才能使用这个实例变量
    静态变量不属于某个实例对象,而是属于类,所以也称为类变量
    实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
    15.同步和异步有何异同
      如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
      当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
    16.String是最基本的数据类型吗?
     基本数据类型包括byte、int、char、long、float、double、boolean和short。
     java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类
    17.运行时异常与一般异常有何异同?
     异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。
    18.Collection 和 Collections的区别。
      Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
    Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
    19. abstract class和interface有什么区别?
    含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
    接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
    下面比较一下两者的语法区别:
    1.抽象类可以有构造方法,接口中不能有构造方法。
    2.抽象类中可以有普通成员变量,接口中没有普通成员变量
    3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
  4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
    eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
  5. 抽象类中可以包含静态方法,接口中不能包含静态方法
  6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
  7. 一个类可以实现多个接口,但只能继承一个抽象类。
    20.heap和stack有什么区别。
     栈是一种线形集合,其添加和删除元素的操作应在同一段完成。栈按照后进先出的方式进行处理。
    堆是栈的一个组成元素
    21.forward 和redirect的区别
     forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
     redirect就是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
    22.、什么时候用assert。
      assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制
      assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false说明程序已经处于不正确的状态下,系统将给出警告或退出
    23.GC是什么? 为什么要有GC?
      GC是垃圾收集的意思(Gabage Collection)
      防止内存溢出
    25.String s = new String(“xyz”);创建了几个String Object?
    两个
    26.接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
     接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
    27.List, Set, Map是否继承自Collection接口?
    List,Set是,Map不是
    28.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
    都不能
    29.Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
     Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等。
    30.构造器Constructor是否可被override?
     构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
    31.是否可以继承String类?
     String类是final类故不可以继承。
     32.垃圾回收的优点和原理。并考虑2种回收机制。
     垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。
     回收机制有:
     分代复制垃圾回收
     标记垃圾回收
     增量垃圾回收。
    33.请说出你所知道的线程同步的方法。
    wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
    sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
    notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
    Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
    34.servlet的生命周期
     web容器加载servlet,生命周期开始。通过调用servlet的init()方法进行servlet的初始化。通过调用service()方法实现,根据请求的不同调用不同的do***()方法。结束服务,web容器调用servlet的destroy()方法。
    35.页面间对象传递的方法
    request,session,application,cookie等
    36.j2ee常用的设计模式?说明工厂模式
    Java中的23种设计模式:
    Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),
    Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),
    Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),
    Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),
    Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),
    Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),
    Observer(观察者模式), State(状态模式), Strategy(策略模式),
    Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)
    工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法。然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例。当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例。
    36.使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
    使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
    37.是否可以从一个static方法内部发出对非static方法的调用?
    不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。
    38.Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
    Math类中提供了三个与取整有关的方法:ceil、floor、round,这些方法的作用与它们的英文名称的含义相对应,例如,ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.3)的结果是-11;floor的英文意义是地板,该方法就表示向下取整,Math.ceil(11.6)的结果为11,Math.ceil(-11.6)的结果是-12;最难掌握的是round方法,它表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
    39.请说出作用域public,private,protected,以及不写时的区别
    这四个作用域的可见范围如下表所示。
    说明:如果在修饰的元素上面没有写任何访问修饰符,则表示friendly。
    作用域 当前类 同一package 子孙类 其他package
    public √ √ √ √
    protected √ √ √ ×
    friendly √ √ × ×
    private √ × × ×
    40.写clone()方法时,通常都有一行代码,是什么?
    clone 有缺省行为,super.clone();因为首先要把父类中的成员复制到位,然后才是复制自己的成员。
    41.数组有没有length()这个方法? String有没有length()这个方法?
    数组没有length()这个方法,有length的属性。String有有length()这个方法。
    42.启动一个线程是用run()还是start()? .
    启动一个线程是调用start()方法,使线程就绪状态,以后可以被调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。
    43.JDK中常见的类
    在JDK中常用的包有以下几种:
    1.java.lang:语言包
    2.java.util:实用包
    3.java.awt:抽象窗口工具包
    4.javax.swing:轻量级的窗口工具包,这是目前使用最广泛的GUI程序设计包
    5.java.io:输入输出包
    6.java.net:网络函数包
    7.java.applet:编制applet用到的包(目前编制applet程序时,更多的是使用swing中的JApplet类。
    object类 数据类型包装类:简单的数据类型的类包装,包括Integer、Float、Boolean等。
    数学类Math 字符串类String和StringBuffer类。 系统和运行时类:System类 线程类:Thread类。
    错误和异常处理类:Throwable .日期类:包括Date .数据结构类:包括链表类LinkedList、向量类Vector、 随机数类Random
    44.HTTP中get与post的区别
    http中,GET用于信息获取,而且是安全的和幂等的。
    http中,POST是用于修改服务器上的资源的请求
    45.session和cookie的区别
    1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
    2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
    考虑到安全应当使用session。
    3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
    考虑到减轻服务器性能方面,应当使用COOKIE。
    4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
    46.Servlet生命周期和工作原理
    Servlet生命周期可以分为三个阶段:1、初始化阶段2、响应客户阶段3、终止阶段
    在javax.servlet.Servlet接口中定义了三个方法init(),service(),destroy(),它们将分别在Servlet不同的阶段被调用。
    47.栈和堆的区别
    一、数据结构中的堆和栈
    栈:像是装数据的桶或者箱子
    它是一种具有后进先出的数据结构,也就是说后存放的先取,先存放的后取,这就类似于我们要在取放在箱子底部的东西(放进去比较早的物体)
    堆:像是一颗倒立的大树。
    堆是一种经过排序的树形数据结构,每个节点都有一个值
    二、内存分配中的堆和栈
    栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
    堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表
    三、堆栈缓存方式
    栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。
    堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
    48.前后端分离,如何防止接口被其他人恶意调用或恶意重发
  8. 非法访问通常使用认证来解决,方法很多session,token,oauth第三方框架等等。
    (1)常规的方法:用户登陆后生成token,返回客户端,然后服务器使用AOP拦截controller方法,校验token的有效性,每次token是一样的;
    (2)用户登陆后生成临时token,存到服务器,并返回客户端,客户端下次请求时把此token传到服务器,验证token是否有效,有效就登陆成功,并生成新的token返回给客户端,让客户端在下一次请求的时候再传回进行判断,如此重复。 这种方法有性能问题,但也有一个漏洞,如果用户在一次请求后,还未进行下一次请求就已被黑客拦截到登录信息并进行假冒登录,他一样可以登录成功并使用户强制下线,但这种方法已大大减少被假冒登录的机会。
    (3)两层token:一般第一次用账号密码登录服务器会返回两个token,时效长短不一样,短的时效过了之后,发送时效长的token重新获取一个短时效,如果都过期,那么就需要重新登录了。当然更复杂你还可以做三层token,按照业务分不同token。
  9. 对于合法的认证访问,通常需要进行IP访问频率和次数的限制,各种API框架都有支持,比如Django restframework的throttling。
      通常我们可以通过使用过滤器和缓存如redis来判断访问次数及频率。在filter层加一个过滤器,拦截所有的请求,解析出请求的用户,然后通过缓存,获取到该用户当前已访问次数。而缓存,要求最好能够自动超时回收,也就是说比如你想设定三分钟内限制访问次数,那么你记录的缓存有效期就三分钟就好了,过了三分钟缓存自动失效,计数器也就重新从0开始了。类似于发短信的接口,每分钟只能发一次;
  10. 最外层的限制可能需要在nginx上配置rate limit。

猜你喜欢

转载自blog.csdn.net/pdsuxueyuan/article/details/87937015