原标题:分享些Java的练习题和面试题
1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
答:可以包括 但公共类只能有一个、且与源文件名相同
2、Java有没有goto?
答:有、但是是作为保留字存在的。
3、说说&和&&的区别。
答:在java中,这两个符号都属于逻辑运算符与的操作。但&&表示的是短路运算,所谓的短路运算是,与运算中,两边的表达式的布尔值,如果有一个为假,另外一个就不需要进行判断了。最为常见的地方是,if(o!=null&&o.equals(s)) 如果第一个为false 那么不会对第二个式子判断,但如果是非短路运算符& 会对第二个判断,但此时o为空,会抛出NullPointerExcetption异常
而&还有取地址的作用 常用来对一个整数的后四bit位计算(常和ox0f进行运算)。
4、在JAVA中如何跳出当前的多重嵌套循环?
答:关键字 常见的有return、ok标号和break。用法上:ok是使用带有ok标号的break语句 我最常用的不是这一种,而是return和让外层的循环条件表达式的结果可以受到内层循环代码的控制。
5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?
答:可以作用在byte、short、int、char(及以上四种的包装类)7.0之后支持String 和枚举.可以理解为 expression值只能是整型表达式和枚举常量
6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
答:错误在于s1+1是一个短整型和一个1相加 1作为字面值是byte、short、int通用的,但在进行刚才的加法运算时,会被认为是一个整型。整型和短整型相加会出现自动类型提升。将提升后的整型值赋值给一个短整型会报错 而直接给short赋值一个1不会被认为是整型,只有在加法运算时会。但s1+=1;这中写法形式也不会出现自动类型提提升
7、char型变量中能不能存贮一个中文汉字?为什么?
答:可以。Char中放入的字符是以unicode编码方式存入的。 Unicode编码是包含汉字的。但如果字符集没有的话。自然是不能存储的。
8、用最有效率的方法算出2乘以8等于几?
答:位运算 左移动几位相当于乘以2的几次方 右移动几位相当于除以2的几次方
9、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?
答:是引用不能变。所以将对象作为实参时,有些人希望在形参上加修饰符final也是可以改变值的。我目前见过final用的最爽的地方就是单例模式中的饿汉式模式 当出现时间片结束时,纵然没有new完对象,再返回时,也不会new出新对象。
10、"=="和equals方法究竟有什么区别?
答:这两个方法的区别主要是针对对象类型 ==表示两个对象的引用是否相同 equals表示两个对象的内容是否相同。Equals常用在String的比较中,另外所有的对象都是继承自object类,equals方法是该类的一个方法,换句话说,所有的类都具备这个方法,当对两个对象调用equals比较时,如果没有Override的方法,那么就会调用object的方法,而object中的Equals方法默认是使用==的。
11、静态变量和实例变量的区别?
答:概念上,两种变量都是一个类的成员变量,只不过两种变量的修饰符一个有static一个没有。出现时机上:静态变量的是出现在类加载时,也就是说,当对象没有出现时,它就已经出现了,实例变量的出现是对象出现时的。所属范围上说,静态变量它是属于类,所有对象的,并不是一个单独对象的属性。而实例变量是仅属于一个对象的。
是否可以从一个static方法内部发出对非static方法的调用?
12、答:不可以。Static方法是属于一个类的,不需要创建对象,而非static是属于一个对象的,对象没有创建,它是没有出现的,所以当我们用static调用非static方法时,对象可能还没有出现。
13、Integer与int的区别
答:区别是integer是对象类型,int是基本类型。Integer是为了将int对象化而设计出来的,它支持int的语法操作,包括直接赋值,自增运算等等由于int等基本类型是有默认值的,我们无法判断出是否有赋值的情况。例如一个学生有一门成绩是一个整型值,我们就无法得到他缺考的情况。
14、Math.round(11.5)等于多少? Math.round(-11.5)等于多少?
答:Math.round方法是对数进行四舍五入的操作。就是将值加上0.5在向下取整。而直接的向上和向下取整是使用math的ceil和floor的方法
15、请说出作用域public,private,protected,以及不写时的区别?
答:不写时,默认关键字是default。这四个关键字,从修饰对象和修饰范围上说。
修饰对象上:public 可以修饰类,方法、构造方法和属性。Private可以修饰方法和属性、构造方法 default可以修饰类、方法和属性、构造方法。Protected可以修饰、构造方法、方法和属性。
修饰范围:public是本包和导入包均可见 private是本类可见 default是本包可见protected是对继承体系可见(本包和导入包的子类型)
16、Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型?
答:OverLoad是重载。Override是重写。Override是发生在继承体系中,子类对父类的方法进行重写,语法要求是:返回值,方法名,参数列表要一致,修饰权限要高于父类,抛出被父类更安全、更具体的异常,至少是相同的。比如抛出父类异常的子异常。
OverLoad是本类中,同一方法的不同实现,它要求方法名相同。参数列表不同(个数,顺序,类型),返回值不做要求,但最好不同,因为我们在调用方法是常常不接收返回值,如果这种情况出现,而重载的方法的仅仅是返回值不同的话,编译器会分不出调用哪个方法。但5.0后返回值可以不同在异常时常用。即在返回值、异常和返回类型上有重载。方法的异常类型和数目不会对重载有影响。
而以上两种如果原方法都是private的话,那么新的方法都可以视为写了一个新方法,所以没有重载和重写的概念在里头了。
17、构造器Constructor是否可被override?
答:构造器不能被继承,所以不能重写,但可以重载。
18、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?
答:接口可以继承接口,抽象类可以实现接口,抽象类可以继承具体的类,抽象类可以有静态的main方法。抽象类不可以实例化和拥有abstract的方法。
19、面向对象的特征有哪些方面?
答:封装、多态、继承、抽象。
20、java中实现多态的机制是什么?
答:父类或者接口的引用可以指向子类或者实现类的对象。在编译时,分析引用变量中的类型方法,运行时绑定实际的类。
21、abstract class和interface有什么区别?
答:interface是特殊的抽象类。Abstract类包含抽象方法,没有抽象静态方法可以有普通方法和构造方法,但不能有抽象构造方法,没有构造方法。不能被实例化,只能被继承。
Interface中,所有的抽象方法是公开,抽象的,属性时公开、静态、常量的。且没有构造方法。
23、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
24、什么是内部类?Static Nested Class 和 Inner Class的不同。
25、内部类可以引用它的包含类的成员吗?有没有什么限制?
答:可以,但要求是用final修饰的。
26、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
答:可以,没有问题。而且必须是某个类的子类或者接口的实现类。
27、String是最基本的数据类型吗?
答:不是,String是较为常见的对象类型。而基本类型只有八种:byte,short,int,long,char,boolean,double,float。
28、String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有?
答:没有,这个过程实际上是创建了新的对象,将s的引用指向了一个新的对象。String是一个不可变的类immutable。
29、是否可以继承String类?
答:不可以。它是一个final类,是不能被继承的。
30、String s = new String("xyz");创建了几个对象? 二者之间有什么区别?
答:如果“xyz”是第一次出现,那么应该是两个对象,如果已经出现过,应该是一个对象。New出现的地方一定会有一个对象。而“xyz”的出现也会生成一个对象,放入到串池中,以方便下次使用。
31、String 和StringBuffer的区别
答:构造方式不同,String是提供数值不可改变的,而StringBuffer字符可以改变的。StringBuffer的出现是为了解决String在做字符串连接时,造成的过多内存消耗。仅仅通过一个StringBuffer对象就可以完成字符串连接。而不是想String一样,每进行一次字符串连接就开辟一个空间存放对象。
32、如何把一段逗号分割的字符串转换成一个数组?
答:直接调用String类中的静态方法Spilt(“,”);这个方法是将字符串按照指定的字符进行劈分。
33、数组有没有length()这个方法? String有没有length()这个方法?
答:数组中是属性,数组中表示数组元素的个数,String中表示字符的个数。
34、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";
答:7个。每一个字符是一个对象,运算时,+号左边是一个新的对象
35、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后?
答:finally中的语句是在try语句结束前执行的,当try中要结束时。会跳到finally中执行里边的语句,是在return之前。如果finally中也有return那么不会再回去执行try语句。
36、final, finally, finalize的区别。
答:final是修饰符 用来对方法,类和变量修饰的,修饰的方法不能被重写,只能继承,修饰的类不能被继承,变量时常量,一旦赋值不可更改。Finally是try语句的一部分,主要用来对资源进行回收的,权限大于try和Catch,finalize是Object的方法,是对内存中垃圾资源回收的,有JVM调用。
37、运行时异常与一般异常有何异同?
答:异常分为两类:已检查异常和未检查异常。前者是无法避免但可以处理的属于一般异常。常见的有EOFException。而未检查异常是可以避免,可以处理的。是运行时异常。常见的有NullPointerException。异常表示程序运行时出现的非正常情况。运行时异常,表示JAVA虚拟机的通常操作中可能遇到的情况。是一种常见的异常。Java虚拟机要求必须抛出非运行的异常。而对运行异常不做要求。
38、error和exception有什么区别?
答:error是错误,往往是系统原因,不可避免,无法处理。而Exception是程序运行中出现的非正常情况。往往是由于设计和实现的问题,人为因素较大。
39、Java中的异常处理机制的简单原理和应用。
答:异常是指程序运行过程中出现的非正常情况。现实生活中,一个异常包含许多信息,JAVA将其抽象出来形成一个类,不同的类用来表示不同的异常。所有异常的根类是throwable。下有两个子类error和exceptione。Error往往是程序无法克服和恢复的错误,通常会死掉。而excepiton中异常也分为两类,未检查异常和已检查异常。已检查异常是由于程序环境发生变化,是用户能够解决,但忽略的。例如网线断了,磁盘空间不够等等。对这种异常是要处理或者抛出的。以防程序中断。未检查异常是设计者设计和实现不全面导致的,不要求抛出或者处理。
40、请写出你最常见到的5个runtime exception。
答:NullPointerExcepiton ClassCastException
41、JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
答:throws是将异常抛给上一级调用者,throw是将异常抛出,try-catch-finally一般一起使用,用来捕捉处理异常,finally最后用来对资源回收。Try中的异常抛出会被catch捕捉并进一步处理。
42、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?
答:两种方法,一种是继承thread的子类,一种是实现runnable接口的类。通过实例化这两个对象来实现一个进程。而修饰同步方法的关键字是Synchronized。用来枷锁的。
43、sleep() 和 wait() 有什么区别?
答:首先方法属于这不同,sleep是属于thread。Wait是属于object()。如果不考虑thread的父类也是object。第二是放锁:sleep只是将cpu交出,进入阻塞。Wait也是将cpu交出,但同时也会释放锁。
44、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
答:同步是线程间数据共享。一个数据被一个线程使用但同时也被另外一个线程使用就要用到同步。异步是一个对象在调用一个方法时会等很长时间,这是就需要异步的处理了。
45、多线程有几种实现方法?同步有几种实现方法?
答:有两种实现多线程的方法 分别是实现thread和runnale接口,同步也有两种使用synchronized关键字和notify和wait方法。
46、启动一个线程是用run()还是start()?
答:调用start方法。是线程进入就绪状态。以后可以被调用为运行状态。一个必须关联具体执行的代码,而run中放入的就是要具体执行的代码。
47、介绍Collection框架的结构
答:List Map ArrayList Set Vector LinkedList HashSet LinkedSet SortedSet treeSet HashMap linkedMap SortedMap treeMap hashtable properties
48、Collection框架中实现比较要实现什么接口
答:comparable
49、ArrayList和Vector的区别
答:版本不同,前者线程不安全,后者线程安全。
50、HashMap和Hashtable的区别
答:版本不同,前者线程不安全,后者线程安全。
51、List 和 Map 区别?
答:一个存放单列数据的集合,一个是存放键值的。
52、List, Set, Map是否继承自Collection接口?
答:List set是 Map不是
53、List、Map、Set三个接口,存取元素时,各有什么特点?
答:list存放元素不要求元素有顺序 可以重复 set没有重复值 map存放的元素是键值。
54、说出ArrayList,Vector, LinkedList的存储性能和特性
答:ArrayList 底层是以数组的形式存储的 所以特性是遍历查询较快
linkedList底层是以链表形式存储的所以特性是插入删除较快
Vector每个方法都使用了synchronized方法 是一个线程安全的类 但却影响了效率。
55、去掉一个Vector集合中重复的元素
答:可以充分利用hashSet类。
56、Collection 和 Collections的区别。
答:collections是collection的一个工具类 帮助collection完成一些功能,例如反转,倒叙和排序等等
57、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
答:是使用equals来判断的 hashSet中是使用hashCode和equals结合判断的。==是不行的之前已经说过==表示的是两个对象的引用是否相同。而内部判断是add方法中自动调用的。
58、你所知道的集合类都有哪些?主要方法?
答:集合容器用来储存,管理对象的对象
Collection
接口特点: 元素是Object
常用方法:
add(Object o):将对象o添加到集合中
addAll(Collection c):将集合c中所有的元素添加到集合中
clear():清空集合
contains(Object o):判断集合中是否存在元素o
remove(Object o):从集合中删除元素o
size():返回集合的长度
toArray():将集合转为数组
遍历:
迭代遍历 for-each
实现类:无
List Collection的子接口
接口特点: 元素是Object 有顺序(下标) 元素可以重复
常用方法:
add(int pos,Object o):将对象o插入到pos下标
get(int pos):获得pos下标的元素
indexOf(Object o):获得o在集合中的下标
remove(int pos):删除pos下标的元素
set(int pos,Object o):将pos下标位置替换为对象o
遍历:
1.下标遍历
2.迭代遍历 for-each
实现类:
1. ArrayList 数组实现查询快 增删慢 1.2 线程不安全快
2. LinkedList 链表实现查询慢 增删快
3. Vector 数组实现 1.0 线程安全慢
泛型:JDK5.0
用在集合上:实现类型安全的集合,指定集合中元素的类型
Collections 工具类
reverse(List list):将list中的元素反转排列
shuffle(List list):将list中的元素随机打乱次序
sort(List list):为list中的元素排序元素要实现Comparable接口,实现排序规则
Set Collection的子接口
接口特点: 元素是Object 无顺序元素内容不可重复
常用方法: 无
遍历: 迭代遍历 for-each
实现类:
HashSet
自定义的对象放入HashSet,为了元素内容不重复,应该:
1)覆盖hashCode()方法,保证内容相同的对象返回相同的int
为了提高效率, 尽量保证内容不同的对象返回不同的int
2)覆盖equals()方法,保证内容相同的对象返回true
LinkedHashSet HashSet的子类维护元素添加到集合中的顺序
TreeSet SortedSet(Set的子接口)的实现类自动排序
Map
接口特点:
元素是键值对(key-value) key:无顺序 不可重复 唯一 value:可以重复
常用方法:
put(K key,V value):把key-value放入Map 如果key已存在,新的value替换旧的value
get(K key):通过key查找对应的value
remove(K key):删除key所对应的键值对
size():返回Map中键值对的数量
containsKey/containsValue : 判断Map中是否存在key/value
clear():清空Map
遍历:
键遍历 keySet() 返回Map中所有key的集合 Set
值遍历 values() 返回Map中所有value的集合 Collection
实现类:
HashMap 1.2 线程不安全 快允许用null作为key或者value
LinkedHashMap HashMap子类维护元素添加到Map中的顺序
TreeMap SortedMap(Map的子接口)的实现类自动对key排序
Hashtable 1.0 线程安全慢不允许用null作为key或者value
Properties Hashtable子类 key和value都是String 用于读取配置文件
59、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
答:对的,equals和hashcode可以是子类重写的,重写的标准完全有子类决定,完全可能出现不同的hashcode。 另外,hashcode一般用在hashMap hashSet中,此时有可能相同。不在这两个的时候,可能完全不同。
60、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
答:子类重写了就使用子类的,没写就使用父类的。有异常,父类和子类只有一个能实现。
61、java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?
答:从方向上分为输入流和输出流,从数据单元上说分为字节流和字符流,从功能上说分为分为节点流和过滤流。字节流的抽象父类是inputStream/OutputStream 字符流的抽象父类是:inputStreamreader/outPutStreamwriter.
62、字节流与字符流的区别
答:处理对象不同,字节流可以处理任何文件,而字符流主要处理文本文件。字符流处理文本文件时需要注意文本的编码格式。
63、什么是java序列化,如何实现java序列化?或者请解释Serializable接口的作用。
答:在JAVA中,要将一个对象进行读入或者输出操作,这个过程中,就要将对象序列化以便完成这个过程。实现序列化要实现一个JAVA提供的接口serializable接口,这是一个空接口,但实现这个接口的对象都可以实例化。对于被transient关键字修饰的属性除外。
64、描述一下JVM加载class文件的原理机制?
答:java的类加载是又一个类classloader和它的子类完成的,这个类本身是作为一个系统组件存在的,主要负责在运行过程中装入和查找文件。
65、GC是什么? 为什么要有GC?
答:是System提供的一个静态方法,也是用来对垃圾回收的。它可以理解为用户手动调用垃圾回收器回收垃圾。
66、垃圾回收器的基本原理是什么?垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
答:垃圾回收期一般是当内存快要消耗光的时候,垃圾回收器就回调用finalize()方法的。主动调用是使用System.GC的方法。
67、java中会存在内存泄漏吗,请简单描述。
答:内存泄露可以理解为有对象没有释放,有引用还在指向它,造成我们觉得内存有丢失的现象。我们常会遇到的一个例子就是:HashSet的使用中,我们常常remove一个对象,
但这个对象的hashCode我们常常是自己重载的,如果出现移除之前和添加之后,对参与hashCode的属性进行了更改,那么实际上我们并没有移除掉这个对象,它就一直存在,造成了内存泄露。
不关流的时候,可能造成内存泄露。但这个泄露可能是系统资源没被释放。
例如:用java生成一个windows窗口,实际上这时在内存中有两个对象,java的对象被释放掉了,但内存中的windows资源并没有被释放掉。造成内存泄露。
责任编辑: