2015-11-19 06:30:04
阅读( 180 )
1)请说出你所知道的线程同步的方法。
wait():使一个线程处于等待状态,并且释放所持有的对象的lock。
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
2)Start和run,Thread和Runnable
Thread是一个类,Runnable是一个接口。类里面有实现的方法,而Runnable只有抽象的接口而已没有实现的方法。其实Thread也是继承Runnable. start方法:用来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体, 它包含了要执行的这个线程的内容, run方法运行结束, 此线程终止, 而CPU再运行其它线程, 直接用run方法: 这只是调用一个方法而已, 程序中依然只有主线程–这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
3)常见的七种排序:
冒择插希快归堆;
冒泡:
选择:
插入:
快速:
4)java中实现多态的机制是什么?
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。
5)面向对象的特征有哪些方面
1.抽象:
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。
2.继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
3.封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
4. 多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
6)抽象类和接口有什么区别
接口可以多重继承 ,抽象类不可以
接口定义方法,不给实现;而抽象类可以实现部分方法
接口中基本数据类型的数据成员,都默认为static和final,抽象类则不是
7)error和exception有什么区别
error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。
exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。
8)给我一个你最常见到的runtimeexception
9)Overload和Override的区别
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
10)sleep()和wait()有什么区别?
搞线程的最爱sleep()方法是使线程停止一段时间的方法。在sleep时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级(b)正在运行的线程因为其它原因而阻塞。wait()是线程交互时,如果线程对一个同步对象x发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。
11)GC是什么?为什么要有GC
GC是垃圾收集器。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()Runtime.getRuntime()。gc()
12)HashMap和Hashtable的区别
都属于Map接口的类,实现了将惟一键映射到特定的值上。HashMap类没有分类或者排序。它允许一个null键和多个null值。Hashtable类似于HashMap,但是不允许null键和null值。它也比HashMap慢,因为它是同步的。
13)&和&&的区别
&是位运算符。&&是布尔逻辑运算符。
14)AnonymousInnerClass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?
匿名的内部类是没有名字的内部类。不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。
15)谈谈final,finally,finalize的区别。
16)类型转换(变态题)
int x=4;
System.out.println(“value is ” +((x>4)?99.9:9));
答案 9.0 ,问号表达式的后面两个条件有要求,因为前面的是float,所以后面转为float.
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
答案 1错2对,1因为向上转型了,最后导致类型不匹配错误 ,
因为s1的+=是一个操作符,能够自动转型,
short s1 = 1;
s1 = s1+1;这句话在c++里面可以的
System.out.println(5.0942*1000);
System.out.println(5.0943*1000);
System.out.println(5.0944*1000);的结果
答案 :5094.2 5094.299999999999 5094.400000000001
Int count=1;count+=count++;输出count=2;
Try{
System.exit(0);
}catch(Exception){
}finally{
System.out.println(“ok”);
}
——
Main(){
System.out.println(test());
}
Static void test(){
Try{
Return 0;
}catch(Exception e){
}finally{
System.out.println(“ddd”);
}
Return 1;
}
输出0;
17)Boolean类型
boolean a = false;
if (a = true){
System.out.println(true);
} else {
System.out.println(false);
}
结果为 true
18)常见修饰符
1.访问修饰符public,private.protected,缺省
2.Static,final,abstract,native,sychronized,transient,volatile,package
a)Sychronized:多线程的支持,当一个此方法被调用时,没有其它线程能够调用该方法,其它的synchronized方法也不能调用该方法,直到该方法返回
b)Transient:告诉编译器,在类对象序列化的时候,此变量不需要持久保存,主要是因为改变量可以通过其它变量来得到,使用它是为了性能的问题
c)Volatile:指出可能有多个线程修改此变量,要求编译器优化以保证对此变量的修改能够被正确的处理
d)Native:用该修饰符定义的方法在类中没有实现,而大多数情况下该方法的实现是用C、C++编写的。参见Sun的Java Native接口(JNI),JNI提供了运行时加载一个native方法的实现,并将其于一个Java类关联的功能
19)常见集合类的区别
2.ArrayList: 元素单个,效率高,多用于查询
2.Vector: 元素单个,线程安全,多用于查询
3.LinkedList:元素单个,多用于插入和删除
4.HashMap: 元素成对,元素可为空
5.HashTable: 元素成对,线程安全,元素不可为空
集合 : 集合对象:用于管理其他若干对象的对象
数组:长度不可变
List: 有顺序的,元素可以重复
遍历:for 迭代
排序:Comparable Comparator Collections.sort()
ArrayList:底层用数组实现的List
特点:查询效率高,增删效率低 轻量级 线程不安全
LinkedList:底层用双向循环链表 实现的List
特点:查询效率低,增删效率高
Vector: 底层用数组实现List接口的另一个类
特点:重量级,占据更多的系统开销 线程安全
Set:无顺序的,元素不可重复(值不相同)
遍历:迭代
排序:SortedSet
HashSet:采用哈希算法来实现Set接口
唯一性保证:重复对象equals方法返回为true
重复对象hashCode方法返回相同的整数
不同对象 哈希码 尽量保证不同(提高效率)
SortedSet:对一个Set排序
TreeSet:在元素添加的同时,进行排序。也要给出排序规则
唯一性保证:根据排序规则,compareTo方法返回为0,就可以认定两个对象中有一个是重复对象。
Map:元素是键值对 key:唯一,不可重复 value:可重复
遍历:先迭代遍历key的集合,再根据key得到value
HashMap:轻量级 线程不安全 允许key或者value是null
Hashtable:重量级 线程安全 不允许key或者value是null
Properties:Hashtable的子类,key和value都是String
20)链表的实现
2.package ChapterFive;
3.class Link {
4. public E data;
5. public Link next;
6. public Link(E data) {
7. this.data = data;
8. }
9.}
10.class LinkList {
11. public Link first;
12. //链表中数据项的个数
13. public int size;
14. public LinkList() {
15. first = null;
16. size = 0;
17. }
18. //在表头插入新的数据
19. public void insertFirst(E value) {
20. Link link = new Link(value);
21. link.next = first;
22. first = link;
23. size++;
24. }
25. //判断链表是否为空
26. public boolean isEmpty() {
27. return size == 0;
28. }
29. //删除表头
30. public Link deleteFirst() {
31. Link temp = first;
32. first = first.next;
33. size–;
34. return temp;
35. }
36. //输出链表中的所有数据
37. public void display() {
38. Link curr = first;
39. while (curr != null) {
40. System.out.print(curr.data + ” “);
41. curr = curr.next;
42. }
43. System.out.println();
44. }
45. //返回链表中数据项的个数
46. public int size() {
47. return size;
48. }
49. //获取从头至尾的第i个数据项
50. public Link get(int i) {
51. if (i > size() – 1 || i < 0)
52. try {
53. throw new IndexOutOfBoundsException();
54. } catch (Exception e) {
55. e.printStackTrace();
56. }
57. Link curr = first;
58. for (int n = 0; n < size(); n++) {
59. if (n == i)
60. return curr;
61. else
62. curr = curr.next;
63. }
64. return null;
65. }
66. //输出从头至尾的第i个数据项
67. public void remove(int i) {
68. if (i == 0)
69. deleteFirst();
70. else if (i == size() - 1)
71. get(i - 1).next = null;
72. else {
73. get(i - 1).next = get(i + 1);
74. }
75. size--;
76. }
77.}
78.
79.public class Link_list {
80. public static void main(String[] args) {
81. LinkList ll = new LinkList();
82. for (int i = 0; i < 10; i++) {
83. Long value = (long) (Math.random() * 100);
84. ll.insertFirst(value);
85. }
86. ll.display();
87. while (!ll.isEmpty()) {
88. ll.deleteFirst();
89. ll.display();
90. }
91. System.out.println(“Ok”);
92. }
93.}
分享给朋友:
亲~ 如果您有更好的答案 可在评论区发表您独到的见解。
您想查看更多的信息:
面试题