JAVA基本面试一
2016-12-23 11:44
274 查看
A、String、StringBuffer与StringBuilder的区别?
1)、在执行速度方面的比较:StringBuilder > StringBuffer;
2)、String类中使用字符数组保存字符串,如private final char value[];,因为有“final”修饰符,所以可以知道String对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如char[]
value;,可知这两种对象都是可变的。
3)、StringBuilder:线程非安全,String、StringBuffer:线程安全的。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
对于三者使用的总结:1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer
B、HashMap、TreeMap、LindedHashMap的区别?
共同点:
HashMap,LinkedHashMap,TreeMap都属于Map;Map主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
不同点:
1.HashMap里面存入的键值对在取出的时候是随机的,也是最常用的一个Map.它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map中插入、删除和定位元素,HashMap是最好的选择。
2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
3.LinkedHashMap是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现.(应用场景:购物车等需要顺序的)
C、try catch finally,try里有return,finally还执行么?
结论:
1、不管有没有有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,还是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
D、foreach与正常for循环效率和使用场景对比?
结论:
1、需要循环数组结构ArrayList时,建议使用普通for循环,因为for循环采用下标访问,对于数组结构的数据来说,采用下标访问比较好。
2、需要循环链表结构LinkedList时,一定不要使用普通for循环,另外,foreach的时候会锁定集合中的对象,期间不能修改。在一些全局的,多线程可以访问的数据结构对象,使用foreach。而对本地变量,则使用for,效率和安全兼顾!
E、JAVA多线程实现的三种方式?
1、继承Thread类实现多线程;
2、实现Runnable接口方式实现多线程;
3、使用ExecutorService、Callable、Future实现有返回结果的多线程。ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。
public static ExecutorService newFixedThreadPool(intnThreads)
创建固定数目线程的线程池。
public static ExecutorService newCachedThreadPool()
创建一个可缓存的线程池,调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。
public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的Executor。
public static ScheduledExecutorService
newScheduledThreadPool(intcorePoolSize)
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
ThreadPoolExecutor参数:
corePoolSize:池内线程初始值与最小值,就算是空闲状态,也会保持该数量线程。
maximumPoolSize:线程最大值,线程的增长始终不会超过该值。
keepAliveTime:当池内线程数高于corePoolSize时,经过多少时间多余的空闲线程才会被回收,回收前处于wait状态。
F、设计模式:单例、工厂、适配器、代理、观察者?
设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:
工厂模式(在不确定会有多少个处理操作时应该考虑使用简单工厂模式,如针对同样的接收到的数据,处理的逻辑可能会不同,可能以后还会增加新的操作。 这样如果对原有功能进行更改或是新添加新的功能,也不会对原来的其他类做修改,只编译修改的那个类或是新的类就可以了。 这样就做到了把耦合降到最低,同时也便于维护。 实际用例:
Spring IoC容器)、
单例模式(资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置)
、抽象工厂模式、建造者模式、原型模式。
结构型模式,共七种:
适配器模式(如果一个抽象类或者接口的话,就必须要重写所有的抽象方法。那么,如果一个接口中定义的抽象方法过多,而子类中很多抽象方法又不需要用到,就应该设计一个适配器。比如:windowAdapter)、
代理模式(方法前后添加日志或者测试方法耗时的场景。实际用例:Spring的AOP框架)、
装饰器模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:
观察者模式(对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。商品降价通知到各个用户的场景, 实际用例:JMS)、
策略模式、模板方法模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。
G、JDK几种常用的内存调试工具:jps、jstack、jmap、jstat、jinfo、jconsole?
jps:
查看所有的jvm进程,包括进程ID,进程启动的路径等等。
jstack:
观察jvm中当前所有线程的运行情况和线程当前状态。
系统崩溃了?如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java
stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。系统hung住了?jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java
stack和native stack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
jmap:
监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量;系统崩溃了?jmap可以从core文件或进程中获得内存的具体匹配情况,包括Heap
size, Perm size等等,一般结合jhat使用。
jstat:
jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;特别的,一个极强的监视内存的工具,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。
jinfo:
观察进程运行环境参数,包括Java System属性和JVM命令行参数
系统崩溃了?jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。
jconsole:
jconsole是一个内置Java性能分析器,可以从命令行或在 GUI shell中运行。可以轻松地使用
jconsole来监控 Java应用程序性能和跟踪 Java中的代码。
H、如何查找占用CPU最高的线程及相关代码?
方法:
1、使用top命令确认是哪个进程占用CPU高。
2、使用top -H -p PID的方式,查看指定进程的线程使用CPU的情况。
3、使用jstack打印一下指定进程ID的java堆栈信息。
4、上面咱们已经找到了占用CPU最高的线程,我们现在将线程的PID转换成16进制。在上面jstack中打印出来的dump信息里面,搜索分析即可。
1)、在执行速度方面的比较:StringBuilder > StringBuffer;
2)、String类中使用字符数组保存字符串,如private final char value[];,因为有“final”修饰符,所以可以知道String对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如char[]
value;,可知这两种对象都是可变的。
3)、StringBuilder:线程非安全,String、StringBuffer:线程安全的。StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
对于三者使用的总结:1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区下操作大量数据 = StringBuffer
B、HashMap、TreeMap、LindedHashMap的区别?
共同点:
HashMap,LinkedHashMap,TreeMap都属于Map;Map主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
不同点:
1.HashMap里面存入的键值对在取出的时候是随机的,也是最常用的一个Map.它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map中插入、删除和定位元素,HashMap是最好的选择。
2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。
3.LinkedHashMap是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现.(应用场景:购物车等需要顺序的)
C、try catch finally,try里有return,finally还执行么?
结论:
1、不管有没有有出现异常,finally块中代码都会执行;
2、当try和catch中有return时,finally仍然会执行;
3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,还是之前保存的值),所以函数返回值是在finally执行前确定的;
4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。
D、foreach与正常for循环效率和使用场景对比?
结论:
1、需要循环数组结构ArrayList时,建议使用普通for循环,因为for循环采用下标访问,对于数组结构的数据来说,采用下标访问比较好。
2、需要循环链表结构LinkedList时,一定不要使用普通for循环,另外,foreach的时候会锁定集合中的对象,期间不能修改。在一些全局的,多线程可以访问的数据结构对象,使用foreach。而对本地变量,则使用for,效率和安全兼顾!
E、JAVA多线程实现的三种方式?
1、继承Thread类实现多线程;
2、实现Runnable接口方式实现多线程;
3、使用ExecutorService、Callable、Future实现有返回结果的多线程。ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类。ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。
public static ExecutorService newFixedThreadPool(intnThreads)
创建固定数目线程的线程池。
public static ExecutorService newCachedThreadPool()
创建一个可缓存的线程池,调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。
public static ExecutorService newSingleThreadExecutor()
创建一个单线程化的Executor。
public static ScheduledExecutorService
newScheduledThreadPool(intcorePoolSize)
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。
ThreadPoolExecutor参数:
corePoolSize:池内线程初始值与最小值,就算是空闲状态,也会保持该数量线程。
maximumPoolSize:线程最大值,线程的增长始终不会超过该值。
keepAliveTime:当池内线程数高于corePoolSize时,经过多少时间多余的空闲线程才会被回收,回收前处于wait状态。
F、设计模式:单例、工厂、适配器、代理、观察者?
设计模式的分类
总体来说设计模式分为三大类:
创建型模式,共五种:
工厂模式(在不确定会有多少个处理操作时应该考虑使用简单工厂模式,如针对同样的接收到的数据,处理的逻辑可能会不同,可能以后还会增加新的操作。 这样如果对原有功能进行更改或是新添加新的功能,也不会对原来的其他类做修改,只编译修改的那个类或是新的类就可以了。 这样就做到了把耦合降到最低,同时也便于维护。 实际用例:
Spring IoC容器)、
单例模式(资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置)
、抽象工厂模式、建造者模式、原型模式。
结构型模式,共七种:
适配器模式(如果一个抽象类或者接口的话,就必须要重写所有的抽象方法。那么,如果一个接口中定义的抽象方法过多,而子类中很多抽象方法又不需要用到,就应该设计一个适配器。比如:windowAdapter)、
代理模式(方法前后添加日志或者测试方法耗时的场景。实际用例:Spring的AOP框架)、
装饰器模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式,共十一种:
观察者模式(对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变。商品降价通知到各个用户的场景, 实际用例:JMS)、
策略模式、模板方法模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
其实还有两类:并发型模式和线程池模式。
G、JDK几种常用的内存调试工具:jps、jstack、jmap、jstat、jinfo、jconsole?
jps:
查看所有的jvm进程,包括进程ID,进程启动的路径等等。
jstack:
观察jvm中当前所有线程的运行情况和线程当前状态。
系统崩溃了?如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java
stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。系统hung住了?jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java
stack和native stack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
jmap:
监视进程运行中的jvm物理内存的占用情况,该进程内存内,所有对象的情况,例如产生了哪些对象,对象数量;系统崩溃了?jmap可以从core文件或进程中获得内存的具体匹配情况,包括Heap
size, Perm size等等,一般结合jhat使用。
jstat:
jstat利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对进程的classloader,compiler,gc情况;特别的,一个极强的监视内存的工具,可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量,以及加载类的数量。
jinfo:
观察进程运行环境参数,包括Java System属性和JVM命令行参数
系统崩溃了?jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。
jconsole:
jconsole是一个内置Java性能分析器,可以从命令行或在 GUI shell中运行。可以轻松地使用
jconsole来监控 Java应用程序性能和跟踪 Java中的代码。
H、如何查找占用CPU最高的线程及相关代码?
方法:
1、使用top命令确认是哪个进程占用CPU高。
2、使用top -H -p PID的方式,查看指定进程的线程使用CPU的情况。
3、使用jstack打印一下指定进程ID的java堆栈信息。
4、上面咱们已经找到了占用CPU最高的线程,我们现在将线程的PID转换成16进制。在上面jstack中打印出来的dump信息里面,搜索分析即可。
相关文章推荐
- java技术面试基本问题小结
- java程序员面试基本题目
- JAVA基本面试二
- Java 基本数据类型和引用数据类型各有什么特点(面试)
- Java面试笔试指南(四)---基本类型、字符串、数组与运算
- [转] java技术面试基本问题小结
- Java核心技术及面试指南面试题,基本数据类型、封装类和运算操作的面试题
- 一些面试基本知识(JAVA篇二)
- 一些面试基本知识(JAVA篇一)
- 面试宝典---java程序设计的基本概念
- java程序员面试复习资料2——[JAVA基本概念]
- Java面试基本题
- Java面试基本题
- Java基本数据类型面试
- java中基本类型占用字节数 (面试总问)
- java程序员面试基本题目
- java程序员面试基本题目
- java程序员面试基本题目
- java面试-1-基本的数据类型
- 算法面试-基本题-排序 c++&java&php