java知识总结上
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java知识总结上相关的知识,希望对你有一定的参考价值。
1.面向对象和面向过程的区别?
面向对象编程以提供对象的形式,对客户端程序员提供方法,屏蔽内部实现,对客户端程序员来说是透明的?,方法与数据之间进行封装。对事物进行对象化,更符合人类的认知
面向过程编程主要是提供各种方法来供人使用,方法与数据之间没有必然联系。?
2.面向对象的四个基本特性(抽象、封装、继承,多态)
继承:子类对父类的继承,很大程度上提高了代码的重用性?
封装:将数据与方法进行绑定,使得外界不能直接对数据进行操作?
多态:运行时多态和编译时多态?
运行时多态:通过引用所指的具体对象的方法,执行自己的方法。?
编译时多态:方法的重载?
3.Overload和Override的区别
重写是对于父子类而言,是子类对父类的方法的重写?
重载是对同一类而言,同一个类中同名方法根据参数的不同产生不同的行为?
4.构造器Constructor是否可被override
不可以被重写?
5.访问控制符public,protected,private,以及默认的区别
public :all?
protected:?同一个包下或者子类可以访问
private:同一类?
默认:包访问权限控制,同包?
6.是否可以继承String类
不可以,String是final类?
7.String和StringBuffer、StringBuilder的区别?
String是不可变字符串,StringBuilder和StringBuffer是可变的,StringBuilder不是线程安全的StringBuffer是线程安全的。
8.hashCode和equals方法的关系
当两个对象equals方法返回true时,两个方法的hashcode值就要相等否则将会产生效率问题
9.抽象类和接口的区别
抽象类中可以包含成员变量和成员方法以及抽象方法
接口中只能包含常量和抽象方法
10.自动装箱与拆箱
将基本类型数据与引用类型数据进行转换,是jdk1.5以后的特性
11.什么是泛型、为什么要使用以及泛型擦除
泛型的本质是参数化类型,泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。在没加入泛型前,参数都是object类型,容易引发ClassCastException。泛型是编译器认可的,但虚拟机并不认识,因此在编译期,编译器会将泛型转换为原始类型擦除是将泛型类型以其父类代替,如String 变成了Object等。其实在使用的时候还是进行带强制类型的转化,只不过这是比较安全的转换,因为在编译阶段已经确保了数据的一致性。
12.Java中的集合类及关系图
Collection:List,Set,Queue
Map:HashMap,HashTable
13.HashMap实现原理(看源代码)HashTable实现原理(看源代码)(看了大概)
14.HashMap和HashTable区别
HashMap是线程不安全的,但效率比HashTable高,HashMap允许有空值而HashTable不允许有空值
15.HashTable如何实现线程安全(看源代码,对可能引起线程安全问题的方法加了同步锁)ArrayList和vector区别(看源代码)(看了部分)
16.ArrayList和LinkedList区别及使用场景
ArrayList是基于数组的实现的,随机访问快,随机访问可达到O(1),增删元素消耗较大
LinkedList是基于链表实现的,增删元素块快,但访问元素需要遍历链表
17.Collection和Collections的区别
Collection是集合接口而Collections是集合的工具类,提供一系列基于Collection的操作
18.Concurrenthashmap实现原理(看源代码,锁部分理解有障碍,有待学习)
http://www.cnblogs.com/ITtangtang/p/3948786.html
通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。
有些方法需要跨段,比如size()和containsValue(),它们可能需要锁定整个表而而不仅仅是某个段,这需要按顺序锁定所有段,操作完毕后,又按顺序释放所有段的锁。这里“按顺序”是很重要的,否则极有可能出现死锁,在ConcurrentHashMap内部,段数组是final的,并且其成员变量实际上也是final的,但是,仅仅是将数组声明为final的并不保证数组成员也是final的,这需要实现上的保证。这可以确保不会出现死锁,因为获得锁的顺序是固定的。
19.Error、Exception区别
Error一般是重大错误,属于不可控的,大多是虚拟机上的问题,遇到这样的问题大多是让程序终止
Exception是指异常,异常的出现帮助程序员更好的发现潜在的问题,更好的编程。遇到Exception解决办法是捕获异常让程序继续运行下去
20.Unchecked Exception和Checked Exception,各列举几个
//Unchecked Exception包括Error和RuntimeException
//堆栈溢出,内存不足等error
运行时异常:空指针异常,数组越界,除数为零等
Checked Exception需要被try-catch异常处理块包围进行异常处理
21.java代理,jdk和cglib的动态代理
代理是一种设计模式,通过代理可以调用委托的具体方法,代理的作用:对其他对象提供一种代理以控制对这个对象的访问。
在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。
JDK的动态代理是通过接口的方式,而cglib动态代理的方式则是采用在运行时改变类的字节码的方式。
22.多线程的实现方式
继承Thread类,实现Runnable接口,线程池
23.线程的状态转换
可运行->运行态->阻塞
阻塞->可运行
运行->可运行
24.如何停止一个线程
Thread中自带的stop方法,但是该方法可能导致线程的死锁,所以不建议使用。
使用退出标志来结束线程
使用中断,当中断标志为true时退出线程(如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。
)所以不能单纯地依靠isIntrrupted方法退出线程
25.什么是线程安全
在多线程的环境下访问同一个代码块不会产生不同的结果,编写线程安全的代码依靠线程的同步。
26.如何保证线程安全
先来看为什么会出现线程不安全问题:
JVM有主内存(Main Memory)和工作内存(Working Memory),主内存就是平时所说的java堆内存,存放程序中所有的类实例、静态数据等变量,是线程共享的,而工作内存中存放的是从主内存中拷贝过来的变量以及访问方法所取得的局部变量,是每个线程独立所有的,其他线程不能访问。
通过锁机制来实现线程安全,synchronize同步锁,lock锁
27.synchronized和Lock的区别
Synchronized在效率上可能比不上lock,但代码也要注重一个方面就是可读性,Synchronized可读性较高,且不用自己释放锁,而lock则需要自己主动释放锁。
Lock可以解决忙等问题。因为synchronized加锁后如遇到阻塞或者sleep方法等不会主动释放锁,那么其他线程只能选择等待。
Lock中的lock方法当拿不到锁时会一直等待,而trylock则不是
1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;
2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;
3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;
4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
5)Lock可以提高多个线程进行读操作的效率
28.多线程如何进行信息交互
Wait方法让线程处于等待状态,并且释放锁,直到该对象的notify方法或notifyAll方法才会使得该处于等待的线程唤醒。
29.sleep和wait的区别(考察的方向是是否会释放锁)
Sleep方法不会释放锁,而wait方法则会释放锁
30.多线程与死锁
多线程访问顺序不当产生的死锁
31.如何产生死锁
1.资源不足
2.线程运行顺序不当
3.资源分配不当
32.什么叫守护线程,用什么方法实现守护线程
当前台线程运行结束,守护线程相应结束,守护线程用来给其他线程提供服务的。
在运行前设置setDaemon为true
33.Java线程池技术及原理
线程池通过预先创建一系列的线程,通过请求队列将任务交给线程,然后通过结果队列处理结果
线程池技术提高了线程的复用,但增加了死锁的风险,消耗了内存,请求过载以及线程泄露
34.java并发包concurrent及常用的类
concurrent类是用于并发编程的
35.volatile的使用
如果这些简单数据类型声明为volatile,对它们的操作就会变成原子级别的
当变量的值由自身的上一个决定时,如n=n+1、n++等,volatile关键字将失效,只有当变量的值和自身上一个值无关时对该变量的操作才是原子级别的,如n = m + 1,这个就是原级别的。所以在使用volatile关键时一定要谨慎,如果自己没有把握,可以使用synchronized来代替volatile。
以上是关于java知识总结上的主要内容,如果未能解决你的问题,请参考以下文章