Java面试常问题目_第1页
Java面试常问题目_第2页
Java面试常问题目_第3页
Java面试常问题目_第4页
Java面试常问题目_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实用文案Java类别问题1. String 与StringBuilder 、StringBuffer 的区别如果要操作少量的数据用 =String单线程操作字符串缓冲区 下操作大量数据 =StringBuilder多线程操作字符串缓冲区 下操作大量数据 =StringBufferCollection类,Collection包结构,与Collections的区别Collection是集类,包含List有序列表,Set无序集合以及Map双列集合Collection 是集合类的上级接口,子接口主要有 Set和List、Map。Collections 是针对集合类的一个帮助类,提供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。java哪些集合类是线程安全的vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。statck:堆栈类,先进后出enumeration:枚举,相当于迭代器hashtable:就比hashmap多了个线程安全线程安全是什么意思就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,标准文档实用文案其他的不能再对他进行操作了, 必须等到这次访问结束以后才能对这个线程安全的方法进行访问5. 九种基本数据类型的大小,以及他们的封装类。java提供了一组基本数据类型,包括 boolean,byte,char,short, int,long,float,double,void. 同时,java也提供了这些类型的封装类,分别为 Boolean,Byte,Character,Short,Integer,Long,Float,Double,Void既然提供了基本类型,为什么还要使用封装类呢比如,如果想使用 List来保存数值,由于 List中只能添加对象,另外,有些情况下,我们也会编写诸如 func(Objecto) 的这种方法Switch能否用string做参数在Java7之前,switch 只能支持 byte、short、char、int或者其对应的封装类以及Enum 类型。在 Java7中,String 支持被加上了。equals与==的区别。1.==是一个运算符。2.Equals则是Object对象的方法,可以.(点)出来。Java的四种引用,强弱软虚,用到的场景1.强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它。当内存空 间不足,Java虚拟机宁愿抛标准文档实用文案出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。2.软引用,如果一个对象只具有软引用,那就类似于可有可无的生活用品。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。3.弱引用,如果一个对象只具有弱引用,那就类似于可有可无的生活用品。 弱引用与软引用的区别在于: 只具有弱引用的对象拥有更短暂的生命周期。 在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。4.虚引用,"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。 如果一个对象仅持有虚引用, 那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。Hashcode的作用Hashcode 这个方法是用来鉴定 2个对象是否相等的,hashcode 方法一般用户不会去调用,比如在 hashmap 中,由于 key是不可以重复的,他在判断 key是不是重复的时候就判断了 hashcode 这个方法,而且也用到了 equals 方法。ArrayList、LinkedList、Vector的区别ArrayList,Vector底层是由数组实现,LinkedList底层是由双线链表实现,从底层的实现可以得出它们的性能问题,ArrayList,Vector插入速度相对较慢,查询速度相对较快,而LinkedList插入速度较快,而查询速度较慢。再者由于Vevtor使用了线程安全锁,标准文档实用文案所以ArrayList 的运行效率高于 Vector。Map、Set、List、Queue、Stack的特点与用法Set集合类似于一个罐子,"丢进"Set集合里的多个对象之间没有明显的顺序。List集合代表元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。Stack是Vector 提供的一个子类,用于模拟 "栈"这种数据结构 (LIFO后进先出)Queue 用于模拟"队列"这种数据结构 (先进先出 FIFO)。Map用于保存具有 "映射关系"的数据,因此 Map 集合里保存着两组值HashMap和HashTable的区别Hashtable是基于陈旧的Dictionary类的,HashMap是Map接口的一个实现Hashtable的方法是线程同步的,而HashMap的方法不是。只有HashMap 可以让你将空值作为一个表的条目的 key或value13. TreeMap、HashMap 、LindedHashMap 的区别Hashmap 是一个最常用的 Map,它根据键的 HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。LinkedHashMap 保存了记录的插入顺序,在用 Iterator 遍历LinkedHashMap 时,先得到的记录肯定是先插入的 .也可以在构造时用带参数,按照应用次数排序TreeMap 取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap 会更好。标准文档实用文案14. trycatchfinally ,try里有return,finally 还执行么a.不管有木有出现异常, finally 块中代码都会执行b.当try和catch中有return 时,finally 仍然会执行c.finally 是在return 后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管 finally 中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在 finally 执行前确定的d.finally 中最好不要包含 return,否则程序会提前退出, 返回值不是 try或catch中保存的返回值OOM你遇到过哪些情况 堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。 永久代溢出,即方法区溢出了,一般出现于大量 Class或者jsp页面,或者采用cglib 等反射机制的情况,因为上述情况会产生大量的 Class信息存储于方法区。 不会抛OOMerror ,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数 -Xss来设置栈的大小。Java面向对象的三个特征与含义封装性:它是将类的一些敏感信息隐藏在类的类部,不让外界直接访问到标准文档实用文案继承性:子类通过一种方式来接受父类所有的公有的,受保护的成员变量和成员方法多态性:程序在运行的过程中,同一种类型在不同的条件下表现不同的结果17. Override 和Overload 的含义去区别方法的重写 Overriding 和重载Overloading 是Java多态性的不同表现。重写Overriding 是父类与子类之间多态性的一种表现, 重载Overloading 是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数, 我们说该方法被重写 (Overriding) 。子类的对象使用这个方法时, 将调用子类中的定义, 对它而言,父类中的定义如同被 “屏蔽”了。如果在一个类中定义了多个同名的方法, 它们或有不同的参数个数或有不同的参数类型,则称为方法的重载 (Overloading) 。Overloaded的方法是可以改变返回值的类型。18. Interface 与abstract 类的区别接口可以多重继承,抽象类不可以接口定义方法,不给实现;而抽象类可以实现部分方法接口中基本数据类型的数据成员,都默认为 static 和final,抽象类则不是19. Staticclass 与nonstaticclass 的区别内部静态类不需要有指向外部类的引用。但非静态内部类需要持有对外部类的引用。非静态内部类能够访问外部类的静态和非静态成员。 静态类不能访问外部类的非静态成员。他只能访问外部类的静态成员。 一个非静态内部类不能脱离外部类实体被创建, 一个非静态内部类可以访问外部类的数据和方法,因为他就在外部类里面。标准文档实用文案java多态的实现原理ⅰ.设计时多态:方法【重载】实现的多态ⅱ.运行时多态:方法【重写】实现的多态实现多线程的两种方法:Thread与Runable使用Runnable 接口实际工作中,几乎所有的多线程应用都用实现 Runnable 这种方式。Runnable 适合多个相同程序代码的线程去处理同一资源的情况。把虚拟 CPU(线程)同程序的代码、数据有效的分离,较好的体现了面向对象的设计思想。避免由于Java的单继承特性带来的局限性。也就是如果新建的类要继承其他类的话 ,因为JAVA中不支持多继承 ,就只能实现 接口。有利于程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。继承Thread 类不能再继承他类了。编写简单,可以直接操纵线程,无需使用 Thread.currentThread() 。22. 线程同步的方法: sychronized 、lock、reentrantLock 等sychronized 是java中最基本同步互斥的手段 ,可以修饰代码块 ,方法,类,在修饰代码块的时候需要一个 reference 对象作为锁的对象,在修饰方法的时候默认是当前对象作为锁的对象,在修饰类时候默认是当前类的 Class对象作为锁的对象 .ReentrantLock 除了synchronized 的功能,多了三个高级功能 .标准文档实用文案等待可中断,在持有锁的线程长时间不释放锁的时候 ,等待的线程可以选择放弃等待公平锁,按照申请锁的顺序来一次获得锁称为公平锁 .synchronized 的是非公平锁,ReentrantLock可以通过构造函数实现公平锁绑定多个Condition. 通过多次 newCondition 可以获得多个 Condition 对象,可以简单的实现比较复杂的线程同步的功能 .通过await(),signal();23. Java锁的等级方法锁,synchronized 标记的方法对象锁,在方法上加了 synchronized 的锁,或者 synchronized(this )的代码段类锁,在代码中的方法上加了 static和synchronized 的锁,因为在静态方法中加同步锁会锁住整个类写出生产者消费者模式阻塞队列实现生产者消费者模式超级简单,它提供开箱即用支持阻塞的方法 put()和take(),开发者不需要写困惑的 wait-nofity 代码去实现通信。 BlockingQueue 一个接口,Java5提供了不同的现实,如ArrayBlockingQueue 和LinkedBlockingQueue ,两者都是先进先出( FIFO)顺序。而 ArrayLinkedQueue 是自然有界的,LinkedBlockingQueue 可选的边界。标准文档实用文案25. ThreadLocal 的设计理念与作用标准文档实用文案ThreadLocal 并不是一个 Thread,而是Thread 的局部变量,也许把它命名为ThreadLocalVariable 更容易让人理解一些当使用ThreadLocal 维护变量时, ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本, 而不会影响其它线程所对应的副本。ThreadPool用法与优势线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。FixedThreadPool(intnThreads):创建一个可重用的固定线程数的线程池,如果池中所有的nThreads个线程都处于活动状态时提交任务(任务通常是Runnable或Callable对象),任务将在队列中等待,直到池中出现可用线程CachedThreadPool():调用此方法创建的线程池可根据需要自动调整池中线程的数量,执行任务时将重用存在先前创建的线程 (如果池中存在可用线程的话 ).如果池中没有可用线程,将创建一个新的线程 ,并将其添加到池中 .池中的线程超过 60秒未被使用就会被销毁,因此长时间保持空闲的SingleThreadExecutor(): 创建一个单线程的 Executor. 这个Executor 保证按照任务提交的顺序依次执行任务 .ScheduledThreadPool(intcorePoolSize): 创建一个可重用的固定线程数的线程池 .ScheduledExecutorService 是ExecutorService 的子接口,调用ScheduledExecutorService 的相关方法,可以延迟或定期执行任务 .以上静态方法均使用默认的 ThreadFactory( 即Executors.defaultThreadFactory() 方标准文档实用文案法的返回值)创建线程,如果想要指定 ThreadFactory, 可调用他们的重载方法 .通过指定ThreadFactory, 可以定制新建线程的名称 ,线程组,优先级,守护线程状态等 .如果Executors 提供的创建线程池的方法无法满足要求 ,可以使用ThreadPoolExecutor 类创建线程池 .27. wait()和sleep()的区别sleep指线程被调用时,占着 CPU不工作,形象地说明为“占着 CPU睡觉”,此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制。wait指线程处于进入等待状态, 形象地说明为“等待使用 CPU”,此时线程不占用任何资源,不增加时间限制foreach与正常for循环效率对比针对列表的foreach的效率是最低,耗时是普通for循环的2倍以上。个人理解它的实现应该和iterator相似JavaIO与NIOJavaNIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。JavaIO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。 如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 JavaNIO 的缓冲导向方法略有不同。 数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。 这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。 而且,需确保当更多的标准文档实用文案数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。30. 反射的作用于原理JAVA反射(放射)机制:Reflection ,Java程序可以加载一个运行时才得知名称的 class,获悉其完整构造(但不包括 methods 定义),并生成其对象实体、 或对其fields 设值、或唤起其methods 。用途:Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象; 在运行时判断任意一个类所具有的成员变量和方法; 在运行时调用任意一个对象的方法;生成动态代理。泛型常用特点,List<String>能否转为List<Object>泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数, 此时类型也定义成参数形式 (可以称之为类型形参),然后在使用 /调用时传入具体的类型(类型实参)在Java的泛型接口中 把List<String> 转换成List<Object> 是可以的。解析XML的几种方式的原理与特点:DOM、SAXDom解析在内存中创建一个DOM树,该结构通常需要加载整个文档然后才能做工作。由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的,树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改能随机访问文件内容,也可以修改原文件内容标准文档实用文案SAX解析 SAX处理的优点非常类似于流媒体的优点。 分析能够立即开始, 而不是等待所有的数据被处理。 SAX解析器采用了基于事件的模型, 它在解析 XML文档的时候可以触发一系列的事件,当发现给定的 tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。 而且,由于应用程序只是在读取数据时检查数据, 因此不需要将数据存储在内存中。 这对于大型文档来说是个巨大的优点线性解析, 不能随机访问,也无法修改原文件设计模式:单例、工厂、适配器、责任链、观察者等等34. JNI的使用JNI作为java和操作系统间的一个直接接口,可以通过 JNI使得java直接调用操作系统的资源。目前JNI只能通过 c/C++实现,因为jni只是对操作系统资源调用的一个桥接过程。所以理论上在 windows 下只要是 dll文件均可以被调用。jni一般有以下一些应用场景1.高性能 ,在一些情况下因为处理运算量非常大,为了获取高性能,直接使用 java是不能胜任的,如:一些图形的处理2.调用一些硬件的驱动或者一些软件的驱动,比如调用一些外部系统接口的驱动,如:读卡器的驱动, OCI驱动3.需要使用大内存,远远超过 jvm所能分配的内存,如:进程内 Cache4.调用C或者操作系统提供的服务,如: java调用搜索服务,其中搜索是由 C/C++ 实现的,不过这个一般可以设计成更加通用的方式,比如 soa的方式标准文档实用文案所有这些场景的前提是牺牲了 java代码的可移植性,不同的 os,甚至版本都需要写不同版本的native 实现mysql机制InnoDB与MyisamInnodb支持事务功能,Myisam不支持。Myisam的执行速度更快,性能更好。InnoDB为行级锁,myisam为表级锁MyISAM:如果执行大量的 SELECT,MyISAM 是更好的选择InnoDB:如果你的数据执行大量的 INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB 表MyISAM:selectcount(*)fromtable,MyISAM 只要简单的读出保存好的行数,注意的是,当count(*) 语句包含 where 条件时,两种表的操作是一样的InnoDB :InnoDB 中不保存表的具体行数,也就是说,执行 selectcount(*)fromtable 时,InnoDB 要扫描一遍整个表来计算有多少行36. Servlet 的生命周期、 Servlet 是否线程安全的a.在servlet 容器启动时初始化。在 web.xml<servlet> 中配置<load-on-startup>1</load-on-startup> 表示在容器启动时初始化。默认没有此置b.servlet 在第一次被访问时初始化。即创建唯一的 servlet 实例。(单例多线程下面会说)c.当有请求访问该 servlet 是,servlet 容器就会创建针对于这个请求的 servletRequest标准文档实用文案于servletResponse,然后servlet的service方法被调用。当容器把servlet生成的响应结果发送给客户,容器就会销毁request和response对象d.容器在销毁该实例前调用servlet的destroy方法(释放servlet所占用的资源,如关闭流和数据库连接),此外还会销毁与servlet对象关联的ServletConfig对象。e.servlet 类只创建一个实例,对于可与客户端的并发访问,它是线程不安全的。f.servlet 的处理方式是,每次访问时重新起一线程执行 service 方法。所以要想保证servlet 的线程安全,不应该在 servlet 中定义实例变量。当然完全可以通过加锁保证线程安全,但对于成千上万的并发访问,性能下降。JVM类别问题内存模型以及分区,需要详细到每个区放什么。程序计数器:当前线程执行的字节码的行号指示器,线程私有JAVA虚拟机栈:Java方法执行的内存模型,每个 Java方法的执行对应着一个栈帧的进栈和出栈的操作。本地方法栈:类似“ JAVA虚拟机栈 ”,但是为 native 方法的运行提供内存环境。JAVA堆:对象内存分配的地方,内存垃圾回收的主要区域,所有线程共享。可分为新生代,老生代。方法区:用于存储已经被 JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 Hotspot 中的“永久代”。运行时常量池:方法区的一部分,存储常量信息,如各种字面量、符号引用等。直接内存:并不是JVM运行时数据区的一部分, 可直接访问的内存, 比如NIO会用到这部分。标准文档实用文案2. 堆里面的分区: Eden,survivalfromto ,老年代,各自的特点。对象创建方法,对象的内存分配,对象的访问定位。GC的两种判定方法:引用计数与引用链。引用计数方式最基本的形态就是让每个被管理的对象与一个引用计数器关联在一起,该计数器记录着该对象当前被引用的次数,每当创建一个新的引用指向该对象时其计数器就加1,每当指向该对象的引用失效时计数器就减1。当该计数器的值降到0就认为对象死亡。Java的内存回收机制可以形象地理解为在堆空间中引入了重力场,已经加载的类的静态变量和处于活动线程的堆栈空间的变量是这个空间的牵引对象。这里牵引对象是指按照Java语言规范,即便没有其它对象保持对它的引用也不能够被回收的对象,即Java内存空间中的本原对象。当然类可能被去加载,活动线程的堆栈也是不断变化的,牵引对象的集合也是不断变化的。对于堆空间中的任何一个对象,如果存在一条或者多条从某个或者某几个牵引对象到该对象的引用链,则就是可达对象,可以形象地理解为从牵引对象伸出的引用链将其拉住,避免掉到回收池中GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?标记清除算法是最基础的收集算法,其他收集算法都是基于这种思想。标记清除算法分为“标记”和“清除”两个阶段:首先标记出需要回收的对象,标记完成之后统一标准文档实用文案清除对象。它的主要缺点:①.标记和清除过程效率不高 。②.标记清除之后会产生大量不连续的内存碎片。标记整理,标记操作和“标记 -清除”算法一致,后续操作不只是直接清理对象,而是在清理无用对象完成后让所有存活的对象都向一端移动, 并更新引用其对象的指针。主要缺点:在标记 -清除的基础上还需进行对象的移动,成本相对较高,好处则是不会产生内存碎片。复制算法,它将可用内存容量划分为大小相等的两块, 每次只使用其中的一块。 当这一块用完之后, 就将还存活的对象复制到另外一块上面, 然后在把已使用过的内存空间一次理掉。这样使得每次都是对其中的一块进行内存回收, 不会产生碎片等情况, 只要移动堆订的指针,按顺序分配内存即可,实现简单,运行高效。主要缺点:内存缩小为原来的一半。GC收集器有哪些?CMS收集器与G1收集器的特点。单线程收集器,使用单线程去完成所有的 gc工作,没有线程间的通信,这种方式会相对高效并行收集器,使用多线程的方式,利用多 CUP来提高GC的效率,主要以到达一定的吞吐量为目标并发收集器,使用多线程的方式 ,利用多CUP来提高GC的效率,并发完成大部分工作,使得gcpause 短G1具备如下特点:并行与并发、分代收集、空间整合、可预测的停顿CMS具备了并发收集、 低停顿的优点、CMS收集器对 CPU资源非常敏感、CMS收集器无法处理浮动垃圾、收集结束时会产生大量空间碎片标准文档实用文案MinorGC与FullGC分别在什么时候发生?MinorGC :通常是指对新生代的回收。 指发生在新生代的垃圾收集动作, 因为 Java对象大多都具备朝生夕灭的特性,所以 MinorGC 非常频繁,一般回收速度也比较快MajorGC :通常是指对年老代的回收。FullGC:MajorGC 除并发gc外均需对整个堆进行扫描和回收。 指发生在老年代的 GC,出现了 MajorGC ,经常会伴随至少一次的 MinorGC (但非绝对的,在ParallelScavenge 收集器的收集策略里就有直接进行 MajorGC 的策略选择过程) 。MajorGC 的速度一般会比 MinorGC 慢10倍以上。几种常用的内存调试工具:jmap、jstack、jconsole。jmap(linux下特有,也是很常用的一个命令)观察运行中的 jvm物理内存的占用情况。参数如下:-heap:打印jvmheap 的情况-histo:打印jvmheap 的直方图。其输出信息包括类名,对象数量,对象占用大小。-histo:live :同上,但是只答应存活对象的情况-permstat :打印permanentgenerationheap 情况jstack(linux下特有)可以观察到 jvm中当前所有线程的运行情况和线程当前状态jconsole 一个图形化界面,可以观察到 java进程的gc,class,内存等信息jstat最后要重点介绍下这个命令。这是 jdk命令中比较重要,也是相当实用的一个命令,可以观察到 classloader ,compiler ,gc相关信息标准文档实用文案具体参数如下:-class:统计classloader 行为信息-compile :统计编译行为信息-gc:统计jdkgc 时heap 信息-gccapacity :统计不同的 generations (不知道怎么翻译好,包括新生区,老年区,permanent 区)相应的 heap 容量情况-gccause :统计gc的情况,(同-gcutil )和引起 gc的事件-gcnew :统计gc时,新生代的情况-gcnewcapacity :统计gc时,新生代 heap 容量-gcold:统计gc时,老年区的情况-gcoldcapacity :统计gc时,老年区 heap 容量-gcpermcapacity :统计gc时,permanent 区heap容量-gcutil :统计gc时,heap情况-printcompilation :不知道干什么的,一直没用过。类加载的五个过程:加载、验证、准备、解析、初始化。“加载”(Loading) 阶段是“类加载” (ClassLoading) 过程的第一个阶段,在此阶段,虚拟机需要完成以下三件事情:1、通过一个类的全限定名来获取定义此类的二进制字节流。2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。3、在Java堆中生成一个代表这个类的 对象,作为方法区这些数据的访问入口。标准文档实用文案验证是连接阶段的第一步, 这一阶段的目的是为了确保 Class文件的字节流中包含的信息符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。准备阶段是为类的静态变量分配内存并将其初始化为默认值, 这些内存都将在方法区中进行分配。准备阶段不分配类中的实例变量的内存, 实例变量将会在对象实例化时随着对象一起分配在 Java堆中。解析阶段是虚拟机将常量池内的符号引用替换为直接引用的过程。类初始化是类加载过程的最后一步, 前面的类加载过程, 除了在加载阶段用户应用程序可以通过自定义类加载器参与之外, 其余动作完全由虚拟机主导和控制。 到了初始化阶段,才真正开始执行类中定义的 Java程序代码。10. 双亲委派模型: BootstrapClassLoader 、ExtensionClassLoader 、ApplicationClassLoader 。1、启动类加载器,负责将存放在 <JAVA_HOME>\lib 目录中的,或者被-Xbootclasspath 参数所指定的路径中, 并且是虚拟机识别的 (仅按照文件名识别, 如rt.jar,名字不符合的类库即时放在 lib目录中也不会被加载)类库加载到虚拟机内存中。启动类加载器无法被 java程序直接引用。2、扩展类加载器:负责加载 <JAVA_HOME>\lib\ext 目录中的,或者被 系统变量所指定的路径中的所有类库,开发者可以直接使用该类加载器。3、应用程序类加载器:负责加载用户路径上所指定的类库,开发者可以直接使用这个类加载器,也是默认的类加载器。三种加载器的关系:启动类加载器 ->扩展类加载器 ->应用程序类加载器 ->自定义类加载器。标准文档实用文案这种关系即为类加载器的双亲委派模型。 其要求除启动类加载器外, 其余的类加载器都应当有自己的父类加载器。 这里类加载器之间的父子关系一般不以继承关系实现, 而是用组合的方式来复用父类的代码。双亲委派模型的工作过程: 如果一个类加载器接收到了类加载的请求, 它首先把这个请求委托给他的父类加载器去完成, 每个层次的类加载器都是如此, 因此所有的加载请求都应该传送到顶层的启动类加载器中, 只有当父加载器反馈自己无法完成这个加载请求(它在搜索范围中没有找到所需的类)时,子加载器才会尝试自己去加载。好处:java类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类java.lang.Object,它存放在rt.jar中,无论哪个类加载器要加载这个类,最终都会委派给启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。相反,如果用户自己写了一个名为java.lang.Object的类,并放在程序的Classpath中,那系统中将会出现多个不同的Object类,java类型体系中最基础的行为也无法保证,应用程序也会变得一片混乱。实现:在java.lang.ClassLoader的loadClass()方法中,先检查是否已经被加载过,若没有加载则调用父类加载器的loadClass()方法,若父加载器为空则默认使用启动类加载器作为父加载器。如果父加载失败,则抛出ClassNotFoundException异常后,再调用自己的findClass()方法进行加载。分派:静态分派与动态分派。静态分派与重载有关,虚拟机在重载时是通过参数的静态类型,而不是运行时的实际类型作为判定依据的;静态类型在编译期是可知的;动态分派与重写(Override )相关,invokevirtual( 调用实例方法 )指令执行的第一步就标准文档实用文案是在运行期确定接收者的实际类型,根据实际类型进行方法调用;数据结构与算法各种排序:冒泡、选择、插入、希尔、归并、快排、堆排、桶排、基数的原理、平均时间复杂度、最坏时间复杂度、空间复杂度、是否稳定。一、冒泡排序基本思想是:两两比较相邻记录的关键字,如果反序则交换冒泡排序时间复杂度最好的情况为O(n),最坏的情况是O(n^2)改进思路1:设置标志位,明显如果有一趟没有发生交换(flag=flase),说明排序已经完成改进思路2:记录一轮下来标记的最后位置,下次从头部遍历到这个位置就Ok二、直接插入排序将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增1的有序表,时间复杂度也为O(n^2),比冒泡法和选择排序的性能要更好一些三、简单选择排序通过n-i次关键字之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)个记录交换之,尽管与冒泡排序同为O(n^2),但简单选择排序的性能要略优于冒泡排序四、希尔排序先将整个待排元素序列分割成若干子序列 (由相隔某个“增量”的元素组成的)分别进行直接插入排序, 然后依次缩减增量再进行排序, 待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。其时间复杂度为标准文档实用文案O(n^3/2), 要好于直接插入排序的 O(n^2)五、归并排序假设初始序列含有 n个记录,则可以看成 n个有序的子序列 ,每个子序列的长度为 1,然后两两归并,得到(不小于n/2 的最小整数)个长度为 2或1的有序子序列 ,再两两归并,...如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。时间复杂度为O(nlogn),空间复杂度为O(n+logn),如果非递归实现归并,则避免了递归时深度为logn的栈空间空间复杂度为O(n)六、堆排序堆是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆;或者每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。堆排序就是利用堆进行排序的方法.基本思想是:将待排序的序列构造成一个大顶堆.此时,整个序列的最大值就是堆顶的根结点.将它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素的次大值.如此反复执行,便能得到一个有序序列了。时间复杂度为O(nlogn),好于冒泡,简单选择,直接插入的O(n^2)七、快速排序通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。时间复杂度为O(nlogn)对冒泡与快排的改进。标准文档实用文案改进思路1:设置标志位,明显如果有一趟没有发生交换( flag=flase) ,说明排序已经完成改进思路2:记录一轮下来标记的最后位置,下次从头部遍历到这个位置就 Ok二分查找,与变种二分查找。二叉树的前中后续遍历:递归与非递归写法,层序遍历算法。排列组合问题。大数据处理:类似10亿条数据找出最大的1000个数、、、、、、、、、等等我们只要定义一个的链表,将1亿个数用插入排序法插入,当链表的里元素的个数大于1000时,每插一个数就丢掉一个最小值(head节点)其他问题对某个项目印象最深,得到了什么收获项目中遇到的困难,怎么解决的解释一下数据库事务概念,特点数据库隔离级别解释一下不可重复读线程池中核心线程数和最大线程数的区别如果加入公司后这些你的上级对你做的东西全盘否定,说这个太垃圾了,你会怎么做补充问题1. 【海亮】SpringMVC4.0 的哪个注解,使得整个 Controller 都返回Json格式数据标准文档实用文案【海亮】SQL中like通配符的效率问题3. 【信鸽】Java缓存技术 Memcached 、Redis【信鸽】Mysql两大引擎区别【信鸽】MySQL联合索引和单索引什么时候用单一列索引的应用结论:1):只要条件列中出现索引列,无论在什么位置,都能利用索引查询.两者的共同点:1):要想利用索引,都要符合SARG标准.:都是为了提高查询速度.3):都需要额外的系统开销 ,磁盘空间.补充说明:stmtText 信息来产生,在查询语句前面加上:SETSTATISTICSPROFILEon.可以通过运行它 ,来观察你的查询是否合理 ,这样才能真正做到优化 .本文主旨:讨论什么情况下能利用上索引 .索引:创建索引可以根据查询业务的不同分为两种 :单一列的索引 ,联合索引.顾名思义,单一列索引就是指在表的某一列上创建索引 ,联合索引是在多个列上联合创建索引.优缺点比较:1):索引所占用空间 :单一列索引相对要小 .2):索引创建时间 :单一列索引相对短 .3):索引对insert,update,delete 的影响程序:单一列索引要相对低 .4):在多条件查询时 ,联合索引效率要高 .索引的使用范围 :单一列索引可以出现在 where 条件中的任何位置 ,而联合索引需要标准文档实用文案按一定的顺序来写【信鸽】多线程类锁和方法锁【信鸽】nginx服务器、负载均衡、分布式数据库8. 【快云】SpringMVC 的异常统一处理机制SpringMVC 提供的异常处理主要有两种方式,一种是直接实现自己的HandlerExceptionResolver ,另一种是使用注解的方式实现一个专门用于处理异常的Controller ——ExceptionHandler 。【海象】多线程操作的包是哪个是在java.lang这个包下面的,主要是一个类和一个接口java.lang.Runnable【海象】泛型是做什么的,为了解决什么问题,是从哪个版本开始出现的泛型是JavaSE1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。 这种参数类型可以用在类、 接口和方法的创建中, 分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。在 JavaSE1.5之前,没有泛型的情况的下,通过对类型 Object 的引用来实现参数的“任意化” ,“任意化”带来的缺点是要做显式的强制类型转换, 而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全, 并且所有的强制转换都是自动和隐式的,标准文档实用文案以提高代码的重用率。11. 【海象】SpringMVCAOPIOC 分别是什么IOC就是典型的工厂模式,通过 sessionfactory 去注入实例。AOP就是典型的代理模式的体现。在传统的程序设计中, 当调用者需要被调用者的协助时, 通常由调用者来创建被调用者的实例。但在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论