美文网首页
面试题集

面试题集

作者: 疑呓microcosm | 来源:发表于2018-08-03 00:04 被阅读0次

    servlet执行流程

    客户端发出http请求,web服务器将请求转发到servlet容器,servlet容器解析url并根据web.xml找到相对应的servlet,并将request、response对象传递给找到的servlet,servlet根据request就可以知道是谁发出的请求,请求信息及其他信息,当servlet处理完业务逻辑后会将信息放入到response并响应到客户端。


    对ajax的理解

    Ajax为异步请求,即局部刷新技术,在传统的页面中,用户需要点击按钮或者事件触发请求,到刷新页面,而异步技术为不需要刷新页面,这样使得用户体验感增强,比如商城购物车的异步加载,当你点击商品时无需请求后台而直接动态修改参数。


    父类与子类之间的调用顺序

    父类静态代码块

    子类静态代码块

    父类构造方法

    子类构造方法

    子类普通方法


    内部类与外部类的调用

    内部类可以直接调用外部类,包括private的成员变量使用外部类引用的this.关键字调用即可

    而外部类调用内部类需要建立内部类对象


    多线程的理解

    一个进程是一个独立的运行环境,可以看做是一个程序,而线程可以看做是进程的一个任务,比如QQ是一个进程,而一个QQ窗口是一个线程。 

    在多线程程序中,多线程并发可以提高程序的效率,cpu不会因为某个线程等待资源而进入空闲状态,它会把资源让给其他的线程。 

     用户线程就是我们开发程序是创建的线程,而守护线程为系统线程,如JVM虚拟中的GC 

     线程的优先级别:每一个线程都有优先级别,有限级别高的可以先获取CPU资源使该线程从就绪状态转为运行状态。也可以自定义线程的有限级别

     死锁:至少两个以上线程争取两个以上cpu资源,避免死锁就避免使用嵌套锁,只需要在他们需要同步的地方加锁和避免无限等待. 


     Arraylist与linkedlist的区别 

    都是实现list接口的列表,arraylist是基于数组的数据结构,linkedlist是基于链表的数据结构,当获取特定元素时,ArrayList效率比较快,它通过数组下标即可获取,而linkedlist则需要移动指针。当存储元素与删除元素时linkedlist效率较快,只需要将指针移动指定位置增加或者删除即可,而arraylist需要移动数据。


    数据库优化

    选择合适的字段,比如邮箱字段可以设为char(6),尽量把字段设置为not null,这样查询的时候数据库就不需要比较null值 

    使用关联查询( left join on)查询代替子查询 

    使用union联合查询手动创建临时表 

    开启事务,当数据库执行多条语句出现错误时,事务会回滚,可以维护数据库的完整性

    使用外键,事务可以维护数据的完整性但是它却不能保证数据的关联性,使用外键可以保证数据的关联性 

    使用索引,索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快的多的速度检索特定的行,特别是对于max,min,order by查询时,效果更明显

    优化的查询语句,绝大多数情况下,使用索引可以提高查询的速度,但如果sql语句使用不恰当的话,索引无法发挥它的特性。 


     类加载的过程 

    加载一个新的类时,首先会到方法区去找该类的class文件,找到后会返回,将class文件加载到方法区中,在类加载的时候,静态成员变量会被分配到方法区的静态区域,非静态成员变量分配到非静态区域,然后开始给静态成员变量初始化,赋默认值,赋完默认值后,会根据静态成员变量书写的位置赋显示值,然后执行静态代码。当所有的静态代码执行完,类加载才算完成。


    事物的理解 

    原子性:是指在一个事物中,要么全部执行成功,要么全部失败回滚。 

    一致性:事物执行之前和执行之后都处于一致性状态 

    持久性:事物多数据的操作是永久性 

    隔离性:当一个事物正在对数据进行操作时,另一个事物不可以对数据进行操作,也就是多个并发事物之间相互隔离。 


    用 wait-notify 写一段代码来解决生产者-消费者问题? 

    注意:记住在同步块中调用 wait() 和 notify()方法 避免产生死锁代码参考简书.... Java高级线程部分 


     Java 中 sleep 方法和 wait 方法的区别? 

    两者都是用来暂停当前运行的线程,但是 sleep() 实际上只是短暂停顿,因为它不会释放锁,睡眠时间结束后,自动进入就绪状态,等待获取CPU时间片,而wait() 会释放对象锁,失去竞争CUP时间片的权力,只有调用notify()/notify()All()才会唤醒。重新进入就绪状态。 


    Java 中 ++ 操作符是线程安全的吗? 

    不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。 


    a = a + b 与 a += b 的区别 

    += 隐式的将加操作的结果类型强制转换操作符左边的类型例:byte b=2; b+=5; 编译器将2+5的结果强制转为为byte 


    3*0.1 == 0.3 将会返回什么?true 还是 false? 

    fasle, 因为有些浮点数不能完全精确的表示出来 


    我们能在 Switch 中使用 String 吗? 

    从 Java 7 开始,我们可以在 switch case 中使用字符串,但这仅仅是一个语法。内部实现 在 switch 中使用字符串的 hash code。 


     Java 中的构造器链是什么? 

     从一个构造器中调用另一个构造器,就是Java 中的构造器链。这种情况只在重载了类的构造器的时候才会出现。 


     JRE、JDK、JVM 之间有什么不同? 

    JRE 代表 Java 运行时(Java run-time),是运行 Java 引用所必须的。 

     JDK 代表 Java 开发工具(Java development kit),是 Java 程序的开发工具,如 Java 编译器,它也包含 JRE。 

     JVM 代表 Java 虚拟机(Java virtual machine),它的责任是运行 Java 应用。 


    你能保证 GC马上执行吗 

    不能,虽然可以调用 System.gc() ,但是没有办法保证 GC 的执行。 


     hashCode() 有什么用?与 equals() 有什么关系? 

    hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、等等。它与 equals() 方法关系特别紧密。根据 Java 规范,两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code。 


     final、finalize 和 finally 的不同之处? 

     final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。 

     finalize 方法是在对象被回收之前调用的方法finally 是一个关键字,与 try 和 catch 一起用于异常的处理。

    finally 块一定会被执行,无论在 try 块中是否有发生异常。 


     用哪两种方式来实现集合的排序? 

     可以使用有序集合,如 TreeSet 或者 Collections.sort() 


    Java 中的 HashSet,内部是的实现原理? 

    HashSet 的内部采用 HashMap来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的 key,只允许有一个null key 


    类加载器工作机制: 

    1.装载:将Java二进制代码导入jvm中,生成Class文件。 

    2.连接:a)校验:检查载入Class文件数据的正确性b)准备:给类的静态变 量分配存储空间c)解析:将符号引用转成直接引用 

    3:初始化:对类的静态变量,静态方法和静态代码块执行初始化工作。 


    面向对象的特征有哪些方面? 

    抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,不关注这些行为的细节是什么。 

     继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。 

    封装:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。 

    多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为) 


    内存泄漏和内存溢出 

     内存溢出指的是内存不够用了 

     内存泄漏是指本该被GC回收的对象并没有被回收 

     内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内存溢出 


     Object有哪些公用方法? 

     方法equals测试的是两个对象是否相等 

     方法clone进行对象拷贝 

     方法getClass返回和当前对象相关的Class对象 

    方法notify,notifyall,wait都是用来对给定对象进行线程同步的 


    抽象类和接口的区别 

    一个类只能继承单个类,但是可以实现多个接口 

    接口强调特定功能的实现,而抽象类强调所属关系 

    抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象的 


    什么是值传递和引用传递? 

    值传递是对基本型变量而言的,传递的是该变量的一个值,改变值不影响原变量. 

    引用传递一般是对于对象型变量而言的,传递的是该对象的地址, 并不是原对象本身 


    集合框架中的泛型有什么优点? 

    泛型允许我们为集合提供一个可以容纳的对象类型,如果添加其它类型的任何元素,它会在编译时报错。这避免了在运行时出现ClassCastException,因为你将会在编译时得到报错信息。 


    什么是迭代器(Iterator)? 

    Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object Obj)删除,可以通过迭代器的remove()方法删除。 


    Iterator和ListIterator的区别是什么? 

    Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。  。

    相关文章

      网友评论

          本文标题:面试题集

          本文链接:https://www.haomeiwen.com/subject/vbyevftx.html