java 基础

Java 总结
⦁ 关键词及作用
abstract 表明类或者成员方法具有抽象属性
assert 用来进行程序调试
boolean 基本数据类型之一,布尔类型
break 提前跳出一个块
byte 基本数据类型之一,字节类型
case 用在switch语句之中,表示其中的一个分支
  
catch 用在异常处理中,用来捕捉异常
char 基本数据类型之一,字符类型
class 类
const 保留关键字,没有具体含义
continue 回到一个块的开始处
default 默认,例如,用在switch语句中,表明一个默认的分支
do 用在do-while循环结构中
double 基本数据类型之一,双精度浮点数类型
else 用在条件语句中,表明当条件不成立时的分支
enum 枚举
extends 表明一个类型是另一个类型的子类型,这里常见的类型有类和接口
final 用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变
finally 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块
float 基本数据类型之一,单精度浮点数类型
for 一种循环结构的引导词
goto 保留关键字,没有具体含义
if 条件语句的引导词
implements 表明一个类实现了给定的接口
import 表明要访问指定的类或包
instanceof 用来测试一个对象是否是指定类型的实例对象
int 基本数据类型之一,整数类型
interface 接口
long 基本数据类型之一,长整数类型
native 用来声明一个方法是由与计算机相关的语言(如C/C++/FORTRAN语言)实现的
new 用来创建新实例对象
package 包
private 一种访问控制方式:私用模式
protected 一种访问控制方式:保护模式
public 一种访问控制方式:共用模式
return 从成员方法中返回数据
short 基本数据类型之一,短整数类型
static 表明具有静态属性
strictfp 用来声明FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754算术规范
super 表明当前对象的父类型的引用或者父类型的构造方法
switch 分支语句结构的引导词
synchronized 表明一段代码需要同步执行
this 指向当前实例对象的引用
throw 抛出一个异常
throws 声明在当前定义的成员方法中所有需要抛出的异常
transient 声明不用序列化的成员域
try 尝试一个可能抛出异常的程序块
void 声明当前成员方法没有返回值
volatile
   表明两个或者多个变量必须同步地发生变化
while
   用在循环结构中 

二、部分关键字及方法原理
Foreach 实现原理
foreach之所以能工作,是因为这些集合类都实现了Iterable接口,该接口中定义了Iterator迭代器的产生方法,并且foreach就是通过Iterable接口在序列中进行移动

volatile实现原理
ArrayList 原理:
对于ArrayList而言,它实现List接口、底层使用数组保存所有元素。其操作基本上是对数组的操作。

LinkedList 原理
LinkedList是一个简单的数据结构,与ArrayList不同的是,他是基于链表实现的

Hashtable 原理
Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射。

HashSet 原理
HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个private static final Object PRESENT = new Object();。HashSet跟HashMap一样,都是一个存放链表的数组
copyOnWrite(包含CopyOnWriteArrayList,CopyOnWriteArraySet)
通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite容器也是一种读写分离的思想,读和写不同的容器

ConcurrentHashMap

通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同部分进行的修改。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

ConcurrentHashMap: 锁分段式技术,读是否加锁原因 迭代性强or弱
ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问

因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。
HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下

⦁ 设计模式
创建型模式
共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

工厂方法模式:一个接口,多个类实现,一个工厂生产器(返回类实例)
缺点:工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则
抽象工厂模式:一个接口,多个类实现,每个类都有一个工厂,该工厂实现工厂借口
优点:如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!
单例模式:实体类,构造方法私有化,对象静态修饰,通过静态方法创建或调用
优点:单例对象能保证在一个JVM中,该对象只有一个实例存在,减少内存开销
省去了new操作符,降低了系统内存的使用频率,减轻GC压力
有些类如交易所的核心交易引擎,控制着交易流程
注意:这样无线程安全,在创建该对象是加锁synchronized 
建造者模式:工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。工厂模式关注的是创建单个产品,而建造者模式则关注创建符合对象,多个部分
原型模式:该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象

结构型模式
共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
适配器模式:适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式
类的适配器模式:当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可
对象的适配器模式:当希望将一个对象转换成满足另一个新接口的对象时,可以创建一个Wrapper类,持有原类的一个实例,在Wrapper类的方法中,调用实例的方法就行
接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类Wrapper,实现所有方法,我们写别的类的时候,继承抽象类即可

装饰器模式:装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
场景:1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多相似的对象,不易排错!

代理模式:
代理模式就是多一个代理类出来,替原对象进行一些操作
场景:如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法:
1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。
2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。
优点:使用代理模式,可以将功能划分的更加清晰,有助于后期维护!
桥接模式:桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化

外观模式:外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口
优点:解耦
组合模式:组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便。
使用场景:将多个对象组合在一起进行操作,常用于表示树形结构中,例如二叉树,数等
享元模式:享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用
行为型模式
共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
策略模式:策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数
模板方法模式:
迭代子模式:
责任链模式:
命令模式:
备忘录模式:
状态模式:
访问者模式:
中介者模式:
解释器模式:
并发型模式和线程池模式


⦁ 多线程问题
1. 线程:

Thread和Runable区别和联系:
1. Thread和Runnable都可以实现多线程(废话) 
2.Thread是类,而Runnable是接口,这就是类和接口区别,类只能继承一次,而接口可以实现多个接口。 
3.Thread实现Runnable接口,这个可以查看Thread的源代码。 
4.最重要的分享资源功能,一般我们使用多线程就是快速解决资源问题。Runnable可以实现资源分享,类实现Runnable并不具备线程功能,必须通过new Thread(runabble子类)调用start()启动线程,所以我们通常new一个runnable的子类,启动多个线程解决资源问题。Thread是类所以我们每次new一个对象时候资源已经实例化了,不能资源共享,Thread类要实现资源共享,可以声明变量为static,类共享的可以解决。 
5.通过以上建议最好实现Runnable接口 实现多线程。

多次调用start方法:
1. 一个线程对象只能调用一次start方法.从new到等待运行是单行道,所以如果你对一个已经启动的线程对象再调用一次start方法的话,会产生:IllegalThreadStateException异常.

1. 线程池
可能存在的风险:1、死锁 2、资源不足 3、请求过多 4、并发错误 5、线程泄露

第一种:Executors.newCachedThreadPool();
优点:创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。
缺点:在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫痪

第二种: Executors.newFixedThreadPool(3)
FixedThreadPool是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源

第三种:Executors.newSingleThreadExecutor();
创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。如果这个线程异常结束,会有另一个取代它,保证顺序执行。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的


第四种: Executors.newScheduledThreadPool(5);
创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。

五、IO
IO有两种分法:按照阻塞或者按照同步。按照阻塞,有阻塞IO和非阻塞IO。按照同步就是同步IO或者异步IO。我们可以认为阻塞IO和同步IO相等,而非阻塞IO和异步IO不同
阻塞IO或者同步IO是指:IO的请求发出去之后,请求者一直在等待回复,当IO的数据回来到来之后,请求者就开始接受数据。阻塞的意思就是:IO请求发出去之后请求线程就停止在那里,一直等待数据到来。
非阻塞则是:IO请求发出去之后,会立刻收到回复,这个回复可能是IO可以立即进行,或者是无法进行IO的错误。所以非阻塞IO请求者必须一直调用那个API,一直到API返回可以进行IO的信号
异步IO:IO请求发出之后,后台会建立一个进程,处理IO,当IO都处理完之后,把处理完的数据交给IO的请求者。

六、框架
1 spring
2 hibernate
3 mybatis
七、Java虚拟机
八、数据库
九、数据结构和算法
附录
创建型
抽象工厂模式: http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html
工厂方法: http://www.cnblogs.com/java-my-life/archive/2012/03/25/2416227.html
建造者模式:  http://www.cnblogs.com/java-my-life/archive/2012/04/07/2433939.html
原型模式: http://www.cnblogs.com/java-my-life/archive/2012/04/11/2439387.html
单态模式: http://www.cnblogs.com/java-my-life/archive/2012/03/31/2425631.html
结构型
适配器模式: http://www.cnblogs.com/java-my-life/archive/2012/04/13/2442795.html
桥接模式: http://blog.csdn.net/jason0539/article/details/22568865
组合模式: http://blog.csdn.net/jason0539/article/details/22642281
外观模式: http://blog.csdn.net/jason0539/article/details/22775311
装饰者模式: http://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html
享元模式: http://www.cnblogs.com/java-my-life/archive/2012/04/26/2468499.html
代理模式: http://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html
行为型
责任链模式: http://blog.csdn.net/zhouyong0/article/details/7909456
命令模式: http://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html
解释器模式: http://www.cnblogs.com/java-my-life/archive/2012/06/19/2552617.html
迭代模式: http://www.cnblogs.com/java-my-life/archive/2012/05/22/2511506.html
中介者模式: http://blog.csdn.net/chenhuade85/article/details/8141831
备忘录模式: http://www.cnblogs.com/java-my-life/archive/2012/06/06/2534942.html
观察者模式: http://www.cnblogs.com/java-my-life/archive/2012/05/16/2502279.html
状态模式: http://www.cnblogs.com/java-my-life/archive/2012/06/08/2538146.html
策略模式: http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html
模板方法模式: http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.html
访问者模式: http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html

 

posted @ 2015-01-02 22:09  wangshunyao  阅读(187)  评论(0编辑  收藏  举报