设有定义语句int a[7]={3,2,8,5,4,1,7};则a[3]的值是多少,a[6]的值是多少?

sleep是线程类(Thread)的方法,致使此线程暂停执行指定时间,给执行机会给其余线程,可是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法致使本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备得到对象锁进入运行状态。

Error:JVM系统内部错误,资源耗尽等严重状况,这些问题程序员没法处理

Exception:其它因编程错误或偶然的外在因素致使的问题,程序员主要处理这些异常(例如:类型转换问题,空指针问题,数组下标越界等)

静态内容 指令 表达式 小脚本 声明 标准动做 注解

数据增加:Vector增加原来的一倍,ArrayList增长原来的0.5倍。

get方式将参数放在url后面,在请求行, post方式将参数放在请求的正文部分。

get方式参数显示在地址栏,不安全, post参数地址栏不可见,相对安全。

地址栏的参数长度有限制,post无限制。

  1. 什么状况下用doget,什么状况下用dopost?

|和&,0和1相或为1,相与为0,0和0相与相或都为0,1和1相与相或都为1。

&&和||,真&&假为假,真||假为真。假和假相或相与都为假。真和真相与相或都为真。

不能够,static在程序运行时就加载了,非static要等到调用的时候再加载,static的生命周期长,非static的生命周期短。

抽象类和普通方法的区别

202 请求被接受,但处理未完成

500 服务器内部错误

  • 编译时异常和运行时异常的区别

Exception 这种异常分两大类运行时异常和非运行时异常(编译异常)。程序中应当尽量去处理这些异常。

       运行时异常:都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中能够选择捕获处理,也能够不处理。这些异常通常是由程序逻辑错误引发的,程序应该从逻辑角度尽量避免这类异常的发生。

      运行时异常的特色是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即便没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译经过。
       非运行时异常 (编译异常):是RuntimeException之外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,若是不处理,程序就不能编译经过。如IOException、SQLException等以及用户自定义的Exception异常,通常状况下不自定义检查异常。

同步交互:指发送一个请求,须要等待返回,而后才可以发送下一个请求,有个等待过程;

异步交互:指发送一个请求,不须要等待返回,随时能够再发送下一个请求,即不须要等待。 
区别:一个须要等待,一个不须要等待,在部分状况下,咱们的项目开发中都会优先选择不须要等待的异步交互方式。

当对象被建立时,就会在jvm的堆区拥有一块内存空间,在jvm的声明周期中,java程序会陆续的建立无数个对象,假如全部的对象都永久占用内存,那么内存空间有可能很快被消耗光,最后引起内存空间不足的错误,所以必须采用一种措施来及时回收这些无用的对象内存,以保证内存的可重复使用,这种技术就是gc

转发的地址不变,重定向的地址改变

转发仅限于项目内部,重定向能够转向任意地址

  • Java中有几种类型的流

根据流的方向分为输入流和输出流:

输入流:从指定数据源中读取数据就是输入流,输入流只能读取数据,不能写数据

输出流:从*.java程序写数据到指定数据汇中就是输出流,输出流只能写数据,不能读取数据

根据处理数据的不一样分为字节流和字符流:

字节流:在进行读写时处理的是以字节为单位的数据就是字节流

字符流:在进行读写时处理的是以字符为单位的数据就是字符流

备注:JDK1.6字节流可以转换成字符流,但字符流不能够转换成字节流.

根据处理角色不一样分为节点流和处理流(包装流/过滤流)

节点流:直接和一个IO的物理节点(文件/网络资源)关联的流就是节点流

处理流:若是一个流构造方法中不是一个直接的物理节点(文件/网络资源)就是处理流

使用private修饰全部构造方法

使用公共静态工厂方法获取当前类的实例

super:表示父类实例对象的引用

使用super.父类实例方法名();调用父类被屏蔽的方法

使用super.父类实例变量名;调用父类被屏蔽的实例变量

使用super();调用父类构造方法,默认调用父类无参数的构造方法,super()必须在构造方法体除注释之外的第一行

抽象类中除了可以写抽象方法还能写非抽象方法;而接口中在jdk1.7以前只能写抽象方法

抽象类中的属性能够是常量也能够是变量;而接口中的属性都是静态的常量

抽象类中能够编写构造方法,该构造方法是给子类调用的;而接口中不能编写构造方法

抽象类中能够编写代码块;而接口中不能够

抽象类只能实现单继承,没有多继承;而接口便可单继承,也能够多继承,这样弥补了Class类的单继承的不足

  • 集合中比较要实现那些接口
  • 字符类型char 的取值范围是

JDK,开发java程序用的开发包,JDK里面有java的运行环境(JRE),包括client和server端的。须要配置环境变量。。。。
JRE,运行java程序的环境,JVM,JRE里面只有client运行环境,安装过程当中,会自动添加PATH。

continue 结束本次循环,执行下一次循环

return 结束该方法,返回值给调用者

break 结束内层循环,到外层循环去

  • HTTP协议下请求和响应的格式

throw抛出的是异常对象,而throws抛出的是异常类

throw只能抛出一个异常对象,而throws能够抛出多个异常类

通常状况下throw和try{}catch(){}或throws一块儿使用,若是抛出的是运行时异常对象,也能够单独使用。

  • 计算机的时间是从什么时刻开始算起的?
  • java中实现多态的机制是什么?

靠的是父类或接口的引用指向子类或实现类的对象,

调用的方法是内存中正在运行的那个对象的方法。

  • Collection框架中实现比较要实现什么接口

在Java中,要想跳出多重循环,能够在外面的循环语句前定义一个标号,而后在里层循环体的代码中使用带有标号的break 语句,便可跳出外层循环

设置参数,使得外层的循环条件表达式的结果能够受到里层循环体代码的控制;

Servlet的四个做用域及其做用域大小排序?

  • 如何去除集合中重复的元素

有助于实施访问权限的控制

  • 用一条SQL语句删除一张表中的两条数据

答:实例 初始 过滤 销毁

  • 请简述一下 Ajax 的原理及实现步骤

HTTP协议的异步通讯

|和&,0和1相或为1,相与为0,0和0相与相或都为0,1和1相与相或都为1。

&&和||,真&&假为假,真||假为真。假和假相或相与都为假。真和真相与相或都为真。

  • 解析xml的几种方式及其区别

      造成了树结构,有助于更好的理解、掌握,且代码容易编写。

      解析过程当中,树结构保存在内存中,方便修改。

      因为文件是一次性读取,因此对内存的耗费比较大。

      若是XML文件比较大,容易影响解析性能且可能会形成内存溢出。

      采用事件驱动模式,对内存耗费比较小。

      适用于只处理XML文件中的数据时。

      编码比较麻烦。

      很难同时访问XML文件中的多处不一样数据。

  • Java类能不能多继承,接口能不能多继承

Java类不能多继承,接口能够多继承

  • 什么是关键字,有什么特色

Java的关键字对Java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用做变量名、方法名、类名、包名和参数。
关键字是电脑语言里事先定义的,有特别意义的标识符,有时又叫保留字,还有特别意义的变量。
Java语言规定关键字不能做为标识符。目前共有50个Java关键字

抽象类能够写抽象方法,也能够写非抽象方法。

抽象类的构造方法不是来实例化的,而是给子类调用的。

隐藏属性,提供公共的方法给调用者,并进行有效验证!

提升代码的安全性,提升代码的复用性

高内聚:封装细节,便于修改内部代码,提升可维护性

低耦合:简化外部调用,便于调用者使用,便于扩展和写做。

为了维护hashCode()方法的equals协定,该协定指出:若是根据 equals()方法,两个对象是相等的,那么对这两个对象中的每一个对象调用 hashCode方法都必须生成相同的整数结果;而两个hashCode()返回的结果相等,两个对象的equals()方法不必定相等。

在重写父类的equals()方法时,也重写hashcode()方法,使相等的两个对象获取的HashCode值也相等,这样当此对象作Map类中的Key时,两个equals为true的对象其获取的value都是同一个,比较符合实际。

  • 抽象方法可不能够被继承
  • Java线程具备五中基本状态

不能够,静态方法不能够重写

使用EL对JSP输出进行优化,可使得页面结构更加清晰,代码可读性高,也更加便于维护。

另外一个是“xyz”对象,xyz在一个字符串池中,s这个对象指向这个串池.

被final修饰的类不能被继承

一个线程只能属于一个进程,而一个进程能够有多个线程,但至少有一个线程。线程是操做系统可识别的最小执行和调度单位。

资源分配给进程,同一进程的全部线程共享该进程的全部资源。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。可是每一个线程拥有本身的栈段,栈段又叫运行时段,用来存放全部局部变量和临时变量。

处理机分给线程,即真正在处理机上运行的是线程。

线程在执行过程当中,须要协做同步。不一样进程的线程间要利用消息通讯的办法实现同步。

  • 怎么在真机和虚拟机之间切换

当对象被建立时,就会在jvm的堆区拥有一块内存空间,在jvm的声明周期中,java程序会陆续的建立无数个对象,假如全部的对象都永久占用内存,那么内存空间有可能很快被消耗光,最后引起内存空间不足的错误,所以必须采用一种措施来及时回收这些无用的对象内存,以保证内存的可重复使用,这种技术就是gc

  • Jvm加载class文件的原理机制

Java语言是一种具备动态性的解释型语言,类(class)只有被加载到JVM中后才能运行。当运行指定程序时,JVM会将编译生成的.class文件按照需求和必定的规则加载到内存中,并组织成为一个完整的Java应用程序。这个加载过程是由类加载器来完成的,具体来讲,就是由ClassLoader和它的子类来实现的。类加载器自己也是一个类,其实质是把类文件从硬盘读取到内存中

  • Java中++操做线程安全吗

在Java语言中,++i和i++操做并非线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而java.util.concurrent.AtomicInteger是一个提供原子操做的Integer类,其提供了线程安全且高效的原子操做,是线程安全的。

  • 说出Object中四种方法

直接将包装类对象赋值给相应的基本数据类型的变量过程就是自动拆箱

  • 组成JDBC经常使用的两个jar包
  • 原生jdbc的链接有哪几个步骤

执行sql处理结果集,若是有参数就设置参数。

关闭结果集,关闭会话,关闭资源。

继承Thread类(真正意义上的线程类),是Runnable接口的实现。

实现Runnable接口,并重写里面的run方法。

  • 多线程里什么是并行,并发

 并发性:又称共行性,是指处理多个同时性活动的能力,。

 并行:指同时发生两个并发事件,具备并发的含义。并发不必定并行,也能够说并发事件之间不必定要同一时刻发生。 

  • 两个不等的对象有没有可能有相同的hashcode

修饰的类不能被继承,修饰的方法不能被重写,修饰的变量是常量

  • Java中用到线程的调度算法是什么

抢占式算法。一个线程用完CPU以后,操做系统会根据线程优先级、线程饥饿状况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。

  • 怎么判断一个对象属于某个类
  • 做用域中设置和获取属性的方法
  • 数组是否是一个对象,其大小可不能够任意改变
  • 迭代器和列表迭代器的区别

在List集合有一个独特的迭代器ListIterator,它有本身的对集合操做修改的方法,能够在集合进行迭代过程当中容许操做修改

同步方法,同步代码块,使用对象锁

规定元素的额外信息(可在工具提示中显示)

若是a 和b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,因此一般须要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,因此能够用于两个不一样对象,可是包含的字母相同的比较。

至关于直接定义了一个”abcd”的字符串,因此只建立一个对象 。

  • CSS 都有哪些选择器?

派生选择器(用 HTML 标签申明)

类选择器(用一个样式类名申明)

属性选择器(用 DOM 的属性申明,属于 CSS2,IE6 不支持,不经常使用,不知道就算了)

除了前 3 种基本选择器,还有一些扩展选择器,包括

后代选择器(利用空格间隔,好比 div .a{ })

群组选择器(利用逗号间隔,好比 p,div,#a{ })

  • 咱们能将 int 强制转换为 byte 类型的变量吗?若是该值大于 byte 类型的范围,将会出现什么现象?

是的,咱们能够作强制转换,可是 Java 中 int 是 32 位的,而 byte 是 8 位的,因此,若是强制转化是,int 类型的高 24 位将会被丢弃,byte 类型的范围是从 -128 到 128。

  • 如何将两个表中知足链接条件的行组合起来做为结果集?

能够经过内联或者外联。

抽象类中除了能写抽象方法还能写非抽象方法;而接口中在jdk1.7以前只能写抽象方法

抽象类中的属性能够是常量也能够是变量;而接口中属性都是静态的常量

抽象类中能够编写构造方法,该构造方法是给子类调用的;而接口中不能编写构造方法

抽象类中能够编写代码块;而接口中不能够

抽象类只能实现单继承,没有多继承;而接口便可单继承 也能够多继承,这样弥补了class的单继承的不足

下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最新版本,去掉了EJB 2.x等无用内容,补充了数据结构和算法相关的题目、经典面试编程题、大型网站技术架构、操作系统、数据库、软件测试、设计模式、UML等内容,同时还对很多知识点进行了深入的剖析,例如hashCode方法的设计、垃圾收集的堆和代、Java新的并发编程、NIO.2等,相信对准备入职的Java程序员一定有所裨益。

Java程序员面试题集(1-50)

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

答:面向对象的特征主要有以下几个方面:

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

2)继承:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java与模式》或《设计模式精解》中关于桥梁模式的部分)。

3)封装:通常认为封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。

4)多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当A系统访问B系统提供的服务时,B系统有多种提供服务的方式,但一切对A系统来说都是透明的(就像电动剃须刀是B系统,它的供电系统是B系统,B系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A系统只会通过B类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1. 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2. 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

类的成员不写访问修饰时默认为default。默认对于同一个包中的其他类相当于公开(public),对于不是同一个包中的其他类相当于私有(private)。受保护(protected)对子类相当于公开,对不是同一包中的没有父子关系的类相当于私有。

3、String 是最基本的数据类型吗?

Language》一书的附录中给出了一个Java关键字列表,其中有goto和const,但是这两个是目前无法使用的关键字,因此有些地方将其称之为保留字,其实保留字这个词应该有更广泛的意义,因为熟悉C语言的程序员都知道,在系统类库中使用过的有特殊意义的单词或单词的组合都被视为保留字)

答:Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入不是对象的基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的封装类就是Integer,从JDK 1.5开始引入了自动封箱/解封箱机制,使得二者可以相互转换。

Java 为每个原始类型提供了封装类:

答:&运算符有两种用法:(1)按位与;(2)逻辑与。&&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。

补充:如果你熟悉JavaScript,那你可能更能感受到短路运算的强大,想成为JavaScript的高手就先从玩转短路运算开始吧。

9、解释内存中的栈(stack)、堆(heap)和静态存储区的用法。

通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间;

而通过new关键字和构造器创建的对象放在堆空间;

程序中的字面量(literal)如直接书写的100、“hello”和常量都是放在静态存储区中。

栈空间操作最快但是也很小,通常大量的对象都是放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用。

上面的语句中str放在栈上,用new创建出来的字符串对象放在堆上,而“hello”这个字面量放在静态存储区。

补充:较新版本的Java中使用了一项叫“逃逸分析“的技术,可以将一些局部对象放在栈上以提升对象的操作性能。

答:早期的JDK中,switch(expr)中,expr可以是byte、short、char、int。从1.5版开始,Java中引入了枚举类型(enum),expr也可以是枚举,从JDK 1.7版开始,还可以是字符串(String)。长整型(long)是不可以的。

12、用最有效率的方法计算2乘以8?

答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)。

14、在Java 中,如何跳出当前的多重嵌套循环?

答:在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环。(Java中支持带标签的break和continue语句,作用有点类似于C和C++中的goto语句,但是就像要避免使用goto一样,应该避免使用带标签的break和continue,因为它不会让你的程序变得更优雅,很多时候甚至有相反的作用,所以这种语法其实不知道更好)

答:构造器不能被继承,因此不能被重写,但可以被重载。

code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。

Java》、《Java编程思想》以及《重构:改善既有代码质量》是Java程序员必看书籍,如果你还没看过,那就赶紧去买一本吧)中是这样介绍equals方法的:首先equals方法必须满足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)、传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null值的引用x,x.equals(null)必须返回false。实现高质量的equals方法的诀窍包括:1. 使用==操作符检查“参数是否为这个对象的引用”;2. 使用instanceof操作符检查“参数是否为正确的类型”;3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;4. 编写完equals方法后,问自己它是否满足对称性、传递性、一致性;5. 重写equals时总是要重写hashCode;6. 不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉@Override注解。

答:String 类是final类,不可以被继承。

补充:继承String本身就是一个错误的行为,对String类型最好的重用方式是关联(HAS-A)而不是继承(IS-A)。

18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对象的引用是永远不会改变的。C++和C#中可以通过传引用或传输出参数来改变传入的参数的值。

1.5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer略高。

20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性

重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;

重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

补充:华为的面试题中曾经问过这样一个问题:为什么不能根据返回类型来区分重载,说出你的答案吧!

21、描述一下JVM 加载class文件的原理机制?

答:JVM 中类的装载是由类加载器(ClassLoader) 和它的子类来实现的,Java中的类加载器是一个重要的Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。

1.由于Java的跨平台性,经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,通常是创建一个字节数组读入.class文件,然后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,所以此时的类还不可用。当类被加载后就进入连接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;2如果类中存在初始化语句,就依次执行这些初始化语句。

2.类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从JDK 1.2开始,类加载过程采取了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其他的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用。下面是关于几个类加载器的说明:

a)Bootstrap:一般用本地代码实现,负责加载JVM基础核心类库(rt.jar);

c)System:又叫应用类加载器,其父类是Extension。它是应用最广泛的类加载器。它从环境变量classpath或者系统属性java.class.path所指定的目录中记载类,是用户自定义加载器的默认父加载器。

22、char 型变量中能不能存贮一个中文汉字?为什么?

答:char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16bit),所以放一个中文是没问题的。

补充:使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是Unicode,当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以Java中有字节流和字符流,以及在字符流和字节流之间进行转换的转换流,如InputStreamReader和OutputStreamReader,这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务。

抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。

一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。

接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法

抽象类中的成员可以是private、默认、protected、public的,而接口中的成员全都是public的。抽

象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量

有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

答:Static Nested Class是被声明为静态(static)的内部类,它可以不依赖于外部类实例被实例化。而通常的内部类需要在外部类实例化后才能实例化,其语法看起来挺诡异的,如下所示。

25、Java 中会存在内存泄漏吗,请简单描述。

答:理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收也会发生内存泄露。一个例子就是Hibernate的Session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象。下面的例子也展示了Java中发生内存泄露的情况:


上面的代码实现了一个栈(先进后出(FILO))结构,乍看之下似乎没有什么明显的问题,它甚至可以通过你编写的各种单元测试。然而其中的pop方法却存在内存泄露的问题,当我们用pop方法弹出栈中的对象时,该对象不会被当作垃圾回收,即使使用栈的程序不再引用这些对象,因为栈内部维护着对这些对象的过期引用(obsolete reference)。在支持垃圾回收的语言中,内存泄露是很隐蔽的,这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响,极端情况下会引发Disk Paging(物理内存与硬盘的虚拟内存交换数据),甚至造成OutOfMemoryError。

26、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?

答:都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

27、静态变量和实例变量的区别?

答:静态变量也称为类变量,属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。

28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,然后在调用静态方法时可能对象并没有被初始化。

29、如何实现对象克隆?

2.实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下。

30、GC 是什么?为什么要有GC?

答:GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()

垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低优先级的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。在Java诞生初期,垃圾回收是Java最大的亮点之一,因为服务器端的编程需要有效的防止内存泄露问题,然而时过境迁,如今Java的垃圾回收机制已经成为被诟病的东西。移动智能终端用户通常觉得iOS的系统比Android系统有更好的用户体验,其中一个深层次的原因就在于Android系统中垃圾回收的不可预知性。

补充:垃圾回收机制有很多种,包括:分代复制垃圾回收、标记垃圾回收、增量垃圾回收等方式。标准的Java进程既有栈又有堆。栈保存了原始型局部变量,堆保存了要创建的对象。Java平台对堆内存回收和再利用的基本算法被称为标记和清除,但是Java对其进行了改进,采用“分代式垃圾收集”。这种方法会跟Java对象的生命周期将堆内存划分为不同的区域,在垃圾收集过程中,可能会将对象移动到不同区域:

  • 伊甸园(Eden):这是对象最初诞生的区域,并且对大多数对象来说,这里是它们唯一存在过的区域。
  • 幸存者乐园(Survivor):从伊甸园幸存下来的对象会被挪到这里。
  • 终身颐养园(Tenured):这是足够老的幸存对象的归宿。年轻代收集(Minor-GC)过程是不会触及这个地方的。当年轻代收集不能把对象放进终身颐养园时,就会触发一次完全收集(Major-GC),这里可能还会牵扯到压缩,以便为大对象腾出足够的空间。

与垃圾回收相关的JVM参数:

答:两个对象,一个是静态存储区的"xyx",一个是用new创建在堆上的对象

答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类可继承具体类,但前提是具体类必须有明确的构造函数。

33、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?

答:可以,但一个源文件中最多只能有一个公开类而且文件名必须和公开类的类名完全保持一致。

答:可以继承其他类或实现其他接口,在Swing编程中常用此方式来实现事件监听和回调。

35、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

答:一个内部类对象可以访问创建它的外部类对象的成员,包括私有成员。

答:(1)修饰类:表示该类不能被继承;(2)修饰方法:表示方法不能被重写;(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

37、指出下面程序的运行结果:


答:执行结果:1a2b2b。创建对象时构造器的调用顺序是:先初始化静态成员,然后调用父类构造器,再初始化非静态成员,最后调用自身构造器。

38、数据类型之间的转换:

1)如何将字符串转换为基本数据类型?

2)如何将基本数据类型转换为字符串?

2)一种方法是将基本数据类型与空字符串(””)连接(+)即可获得其所对应的字符串;另一种方法是调用String 类中的valueOf(…)方法返回相应字符串

// TODO 自动生成的方法存根

39、如何实现字符串的反转及替换?

答:方法很多,可以自己写实现也可以使用String或StringBuffer / StringBuilder中的方法。有一道很常见的面试题是用递归实现字符串反转,代码如下所示:

40、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?

1)如何取得年月日、小时分钟秒?

2)如何取得从1970年1月1日0时0分0秒到现在的毫秒数?

3)如何取得某月的最后一天?

答:操作方法如下所示:

1)创建java.util.Calendar 实例,调用其get()方法传入不同的参数即可获得参数所对应的值

2)以下方法均可获得该毫秒数:

42、打印昨天的当前时刻。

答:JavaScript 与Java是两个公司开发的不同的两个产品。Java 是原Sun 公司推出的面向对象的程序设计语言,特别适合于互联网应用程序开发;而JavaScript是Netscape公司的产品,为了扩展Netscape浏览器的功能而开发的一种可以嵌入Web页面中运行的基于对象和事件驱动的解释性语言,它的前身是LiveScript;而Java 的前身是Oak语言。

下面对两种语言间的异同作如下比较:

1)基于对象和面向对象:Java是一种真正的面向对象的语言,即使是开发简单的程序,必须设计对象;JavaScript是种脚本语言,它可以用来制作与网络无关的,与用户交互作用的复杂软件。它是一种基于对象(Object-Based)和事件驱动(Event-Driven)的编程语言。因而它本身提供了非常丰富的内部对象供设计人员使用;

2)解释和编译:Java 的源代码在执行之前,必须经过编译;JavaScript 是一种解释性编程语言,其源代码不需经过编译,由浏览器解释执行;

3)强类型变量和类型弱变量:Java采用强类型变量检查,即所有变量在编译之前必须作声明;JavaScript中变量声明,采用其弱类型。即变量在使用前不需作声明,而是解释器在运行时检查其数据类型;

补充:上面列出的四点是原来所谓的标准答案中给出的。其实Java和JavaScript最重要的区别是一个是静态语言,一个是动态语言。目前的编程语言的发展趋势是函数式语言和动态语言。在Java中类(class)是一等公民,而JavaScript中函数(function)是一等公民。对于这种问题,在面试时还是用自己的语言回答会更加靠谱。

答:assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后, assertion检查通常是关闭的。在实现中,断言是一个包含布尔表达式的语句,在执行这个语句时假定该表达式为true;如果表达式计算为false,那么系统会报告一个AssertionError。

Expression2 可以是得出一个值的任意表达式;这个值用于生成显示更多调试信息的字符串消息。

断言在默认情况下是禁用的,要在编译时启用断言,需使用source 1.4 标记:

要在系统类中启用断言,可使用-esa 或者-dsa 标记。还可以在包的基础上启用或者禁用断言。可以在预计正常情况下不会到达的任何位置上放置断言。断言可以用于验证传递给私有方法的参数。不过,断言不应该用于验证传递给公有方法的参数,因为不管是否启用了断言,公有方法都必须检查其参数。不过,既可以在公有方法中,也可以在非公有方法中利用断言测试后置条件。另外,断言不应该以任何方式改变程序的状态。

答:Error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception 表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。

46、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?

答:会执行,在方法返回调用者前执行。Java允许在finally中改变返回值的做法是不好的,因为如果存在finally代码块,try中的return语句不会立马返回调用者,而是记录下返回值待finally代码块执行完毕之后再向调用者返回其值,然后如果在finally中修改了返回值,这会对程序造成很大的困扰,C#中就从语法上规定不能做这样的事。

// TODO 自动生成的方法存根

答:Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在Java 中,每个异常都是一个对象,它是Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。Java 的异常处理是通过5 个关键词来实现的:try、catch、throw、throws和finally。一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throw)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理;try用来指定一块预防所有“异常”的程序;catch 子句紧跟在try块后面,用来指定你想要捕捉的“异常”的类型;throw 语句用来明确地抛出一个“异常”;throws用来标明一个成员函数可能抛出的各种“异常”;finally 为确保一段代码不管发生什么“异常”都被执行一段代码;可以在一个成员函数调用的外面写一个try语句,在这个成员函数内部写另一个try语句保护其他代码。每当遇到一个try 语句,“异常”的框架就放到栈上面,直到所有的try语句都完成。如果下一级的try语句没有对某种“异常”进行处理,栈就会展开,直到遇到有处理这种“异常”的try 语句。

48、运行时异常与受检异常有何异同?

答:异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。异常和继承一样,是面向对象程序设计中经常被滥用的东西,神作《Effective Java》中对异常的使用给出了以下指导原则:

  • 不要将异常处理用于正常的控制流(设计良好的API不应该强迫它的调用者为了正常的控制流而使用异常)
  • 对可以恢复的情况使用受检异常,对编程错误使用运行时异常
  • 避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发生)
  • 每个方法抛出的异常都要有文档
  • 不要在catch中忽略掉捕获到的异常

49、列出一些你常见的运行时异常?

final:修饰符(关键字)有三种用法:

  1. 修饰类,final,只读,不能被继承,因此它和abstract是反义词。
  2. 变量声明,final,只读,保证不可改变。
  3. 声明方法,final,只读,不能在子类中被重写。

finally:通常放在try…catch的后面构造总是执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。

finalize:Object类中定义的方法,Java中允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize() 方法可以整理系统资源或者执行其他清理工作。

我要回帖

更多关于 若有定义:int a[3][4] 的文章

 

随机推荐