一、JAVA SE (标准版,标准的应用开发,常服务于企业级的应用服务开发)
    JDK是开发环境:JAVA软件开发工具包,最常用的是编译和运行的工具
    JRE是运行环境
    JVM是JAVA虚拟机
  1、语法:
	1)标识符:命名规则:由大小写字母、数字、下划线和美元符号组成,不能以数字开头;JAVA是区分大小写的;
	2)关键字:
	3)常量:final,表示不能改变的数值;--------------------------------------------------------------------------------------------------------------------------------------------------
	4)数据类型:包括基本数据类型(byte、short、int、long、float、double、char、boolean)和引用数据类型
	    基本数据类型取值范围:
		byte:-128至127,占用1个字节(-2d的7次方到2的次方-1);
		short:-32769至32767,占用2个字节(-2的15次方到2的15次方-1);
		int:-2147483648至2147483647,占用4个字节(-2的31次方到2的31次方-1);
		long:-9223372036854774808至9223372036854774807,占用8个字节(-2的63次方到2的63次方-1);
		float:3.402823e+38 ~ 1.401298e-45(e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方)占用4个字节;
		double:1.797693e+308~ 4.9000000e-324 占用8个字节;
		boolean:true和false;
		char:占用2个字节,采用unicode编码,它的前128字节编码与ASCII兼容字符的存储范围在\u0000~\uFFFF,在定义字符型的数据时候要注意加'';--------------------------------------------------------------------------------------------------------------------------------------------------
	5)控制流程语句:
	    if条件语句(if\if..else\if..else if)
	    switch条件语句:switch-case,在每个case后得加上break,最后最好加上default;
	    while循环语句:满足条件则进行循环;
	    do whilt循环语句:与while的差别在于程序至少运行一次;
	    for循环语句:必须了解常用的foreach;
	    跳转语句:
		break:主要用于switch语句和循环结构中,退出当前循环结构,并接着执行循环结构下的语句;
		continue:跳过本次循环;
		return:终止所有的循环,若有返回值则返回对应的返回值;--------------------------------------------------------------------------------------------------------------------------------------------------
	6)随机数:
	    随机小数:Math.random()
	    随机整数:new Random().nextInt(int)
	  **比较两数大小:Math.max(a, b)取出a,b两数字中的最大值
	7)数组排序:
	    Arrays.sort(arrayName)
	    System.out.print(Arrays.toString(arrayName))--------------------------------------------------------------------------------------------------------------------------------------------------
	8)String类能否被继承:
	    String类不能被继承。因为String类有final修饰符,而JAVA中final修饰的类是不能被继承的,实现的细节不允许改变
	9)关于final修饰符:
	    final类不能够被继承;
	    final修饰的方法不能被子类的方法覆盖,但可以被继承;
	    final修饰的成员变量,通常表示常量,只能被赋值一次,赋值之后不再改变;
	    final不能用于修饰构造方法;
	    使用final的原因:一是把方法或变量锁定,防止任何继承类修改,二是高效(编译器在调用final方法时会转入内嵌机制,提高效率)
	10)String  StringBuffer  StringBuilder的比较:
	    String:不可变的字符序列(String不可变,线程对于堆中指定的String对象只能读取无法修改,无安全问题);
	    StringBuffer:线程安全的可变字符序列(效率高于String);
	    StringBuilder:非线程安全的可变字符序列;
	11)Arrays:此类包含用来操作数组(比如排序(7)和搜索)的各种方法
	    例:将字符串转List集合
		String str = "abcdef";
		String replace = str.replace("", ",");
		String end = replace.substring(1, replace.lastIndexOf(","));
		String [] arr = end.split(",");
		List<String> list = Arrays.asList(arr);
	****以上10)11)两点可以结合“JavaScript阅读摘要”中JS的String 和 Array进行对比阅读--------------------------------------------------------------------------------------------------------------------------------------------------
	12)****JAVA中创建实例的方式:
	    A.用new语句创建对象,此方式调用了构造函数;
		UserBean ub = new UserBean();
	-----------------------------------------------------------------------------------------------------------------------------
	    B.使用Class类的newInstance方法:
		UserBean ub2 = (UserBean) Class.forName("UserBean").newInstance();
	-----------------------------------------------------------------------------------------------------------------------------
	    C.使用Constructor类的newInstance方法:
		Constructor<UserBean> constructor = UserBean.class.getConstructor();
		UserBean ub3 = constructor.newInstance();
	-----------------------------------------------------------------------------------------------------------------------------
	    D.使用clone方法,用clone方法创建对象并不会调用任何构造函数:
		a.要clone的类中实现Cloneable接口并实现其定义的clone方法;
			public Object clone() throws CloneNotSupportedException{
				UserBean ub = null;
				ub = (UserBean) super.clone();
				return ub;
			}
		b.在要克隆的类中:
			UserBean ub4 = (UserBean) ub2.clone();//将ub2的对象克隆给ub4
		拷贝对象返回的是一个新对象,而不是一个引用;
		拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息
	-----------------------------------------------------------------------------------------------------------------------------
	    E.使用反序列化,不会调用任何构造函数,使用序列化克隆对象能达到深度克隆的效果:
		一个克隆工具类:
			public class CloneUtil {
	 			@SuppressWarnings("unchecked")
				public static <T extends Serializable> T clone(T obj){
	        			T cloneObj = null;
	        			try {
	           			 //写入字节流
	           				ByteArrayOutputStream out = new ByteArrayOutputStream();
	           				ObjectOutputStream obs = new ObjectOutputStream(out);
	            				obs.writeObject(obj);
	            				obs.close();
	           			 //分配内存,写入原始对象,生成新对象
	           				ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
	           			 	ObjectInputStream ois = new ObjectInputStream(ios);
	           			 //返回生成的新对象
	            				cloneObj = (T) ois.readObject();
	            				ois.close();
	        			} catch (Exception e) {
	            				e.printStackTrace();
	        				}
	        			return cloneObj;
	    				}
			}		UserBean ub5 = CloneUtil.clone(ub4);
--------------------------------------------------------------------------------------------------------------------------------------------------
==================================================================================================================================================
  2、面向对象:(属性——成员变量,是对象所具有的各种特征,方法是对象执行的操作;程序中没有变量引用该对象,则该对象生命周期结束)
	1)封装:高内聚低耦合,提高代码的重用性;
	2)多态:
	3)继承:
	    方法重写:方法名、参数列表、返回值类型和访问修饰符都一样,访问修饰符不允许缩小,重写是在子父类继承中;
	    方法重载:方法名相同,参数的个数和类型不同。返回值类型并不起到区别方法的作用,重载在同一个类中;
	4)abstract抽象:
	    抽象类:使用abstract修饰类,抽象类必须被继承,抽象类不能被直接实例化;
	    抽象方法:使用abstract修饰方法,抽象方法必须被重写,抽象方法只能声明不能实现,抽象方法的类必须是抽象类;
	5)接口和抽象类:
	    实现了接口的实现类必须全部实现接口中的方法;
	    接口是抽象类的延伸,JAVA中为了保证数据的安全性,因此不能多继承,但一个类可以有多个接口,弥补了不能多继承的缺点;

==================================================================================================================================================
  3、设计模式:
	1)工厂模式:
	2)单例模式:
		public class SingletonTest{
			private SingletonTest(){}
			//定义静态私有变量(不初始化,使用volatile保证多线程访问时instance变量的可见性)
			private static volatile SingletonTest instance;
			//定义一个共有的静态方法,返回该类型的实例
			public static SingletonTest getInstance(){
				//对象实例化是与否的判断(不使用同步代码块,instance不等于null时,直接返回对象,提高效率)
				if(instance == null){
					//使用同步代码块,保证多线程访问时对象在第一次创建后,不再重复创建
					synchronized(SingletTest.class){
						//未初始化则初始化对象
						if(instance == null){
							instance = new SingletonTest();
						}
					}
				}
				return instacne;
			}
		}
	3)适配器模式:
	4)观察者模式:
==================================================================================================================================================
  4、集合框架:
	1)collection:
	    vector:实现了Cloneable,重载了clone()方法,因此可以进行克隆;实现了RandomAccess接口,因此可以随机访问;实现了List;线程安全
	    ArrayList:擅长随机访问元素,在中间插入或移除元素较慢;非线程安全
	    LinkList:随机访问方面较慢;
	2)map:
	    HashMap:键值对、非线程安全
	    HashTable:键值对、线程安全,单线程环境下运行比HashMap慢
		**Hashtable并不能真正存储能对象,而只能存储对象的引用。这条原则对与Hashtable相 似的Vector, List, Map, Set等都是一样的
	3)set:不保存重复的元素
	    TreeSet:保存的元素是进行排序了的
	4)集合存取:
	    forEach:
	    Iterator:(迭代器,只能单向移动)
		List<pet> pets = Pets.arrayList(10);
		Iterator<pet> it = pets.iterator();
		whilt(it.hasNext){
			Pet p = it.next();
			syso(p.id());
		}		Set<String> keys = pets.keySet();
		Iterator it = keys.iterator();
		while(it.hasNext){
			String key = it.next();
			Pet p = pets.get(key);
			syso(p.getId());
		}
==================================================================================================================================================
  5、网络通信编程:
	1)Socket:通信两端都有Socket;
	    客户端:
		Socket socket = new Socket("localhost", 10086);
		BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
		BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		writer.write(str);//客户端写出信息
		reader.readLine();//客户端读取信息,阻塞	    服务器:
		ServerSocket server = new ServerSocket(10086);
		Socket socket = server.accept();//获取连接
	2)IO:
	    InputStream:
	    OutputStream:
	3)线程:
	    在JAVA程序一启动时运行起来的线程叫做主线程;
	  **继承Thread类或实现Runnable接口实现run方法;
		Thread th = new Thread(线程类引用名);
		th.start();
	    状态:新建、就绪、运行、挂起、阻塞、睡眠(暂时中止线程的运行)、等待(必须使用notify来唤醒)、死亡;
	  **线程安全:同步锁synchronized(同步代码块的时候必须指明同步对象,一般为当前对象this)
	    join():当使用join()方法将线程A加入线程B中时,线程B会等待线程A执行结束后再接着继续执行B的线程;
	    守护线程:是在后台提供公共服务的线程(比如JAVA垃圾回收机制),只有在所有线程都退出的情况下,守护线程才会结束;
	    线程睡眠sleep():主要用于让线程暂停执行一段时间,当时间到后,线程会自动处于就绪状态准备运行;(推荐使用,移植性高)
	    线程让步yield():只是暂停一下,而且只有优先级与当前线程相同或更高的处于就绪状态的线程才有机会获得执行;
	    结束线程:stop()和destroy()  但不建议使用此方法来结束线程,应尽量让run()方法中正常运行结束;遇异常使用interrupt()方法中断运行;
	  **定时器线程TimerTask(结合Timer()使用):
		TimerTask time = new TimerTask() {
			@Override
			public void run() {

			}
		};
			Timer tim = new Timer();
			tim.schedule(time, 1000*3, 1000*5);//延迟3秒执行,每5秒执行一次
	    volatile修饰符:此修饰符声明的变量是易变的,每次运算结果都会存会内存,保持寄存器和内存里的变量值一致
	4)CS架构的:
	    服务器和客户端分摊工作;
	    服务器可以同时为多台客户端服务;
	    客户端可以同时访问服务器的相同数据;
	5)TCP与UDP区别:
	    TCP必须先建立连接,因此安全可靠,但效率低  Socket
	    UDP无需建立连接,不安全,效率高,但容易丢包  DatagramSocket与DatagramPacket
==================================================================================================================================================
  6、数据库:
	DAO:
	存储过程:
	数据库语句的优化:
	    尽量避免使用select * 返回无用的字段会降低查询的效率(解决办法:使用具体字段代替*)	
	    在表中建立索引,优先考虑使用where、groud by使用到的字段(CREATE INDEX indexName on tableName(columnName))
	    尽量别面使用in和not in,会导致数据库放弃索引进行全表扫描(解决办法:连续数值用between代替,子查询用exists代替)
		select * from t where id between 2 and 3;
		select * from t1 where exists(select * from t2 where t1.username = t2.username);
	    尽量避免使用or
	    尽量避免在字段开头使用模糊查询(如 selec * from t where username like '%a%')
	    尽量避免NULL值的判断(解决办法:给字段默认值)
	    尽量避免在where条件中等号的左侧进行表达式、函数的操作
==================================================================================================================================================
  7、JAVA中堆、栈、静态存储区:
	1)栈:存取的速度比较快,仅次于直接位于CPU中的寄存器
	    基本数据类型的变量和对象的引用都存放于栈当中;
	2)堆:可以动态的分配内存大小,堆数据在没有引用变量指向它的时候才变成垃圾
	    堆中存放由new创建的对象和数据,也就是主要用来存储对象。
	3)静态存储区:存储static声明的静态变量
	4)常量池:String的值在常量池中
	==================================================================================================================================================
二、JAVA EE (企业版,常用于开发企业级应用)   
  1、JSP:
	1)编译指令:<%@ %>
	    page指令:指定当前JSP的一些信息和设置
	    taglib指令:定义一个标签库及其自定义标签的前缀
	2)脚本元素:
	    代码段:<%  %>
	    声明:<%!  %>
	    表达式:<%=  %>
	3)注释:
	    <%--  --%>
	    <%/** 多行注释 **/>
	    <%// 单行注释 %>
	4)JSP九大内置对象:
	    out对象:用来向客户端输出数据类型内容,并管理应用服务器上的输出缓冲区;
	    page对象:本质上包含当前servlet接口引用的变量,可以看做是this变量的别名
	    request对象:客户端向服务器发出的请求;
	    response对象:服务器给客户端的回应,包含服务器向客户端做出的应答信息;
	    session对象:用于保存客户端信息而分配给客户的对象;
	    application对象:用来保存所有应用系统中的公有数据;
	    config对象:当一个servlet初始化时,容器把某些信息通过此对象传递给servlet
	    pageContext对象:提供存取所有关于JSP程序执行时期所要用到的属性方法
	    exception对象:异常对象,页面中生成此对象,并传送到page指令中设定的错误页面中,在此页面中处理异常对象
	5)四个作用域(存放数据的作用域):
	    page:在当前页面有效,只要页面跳转就失效;
	    request:请求到响应结束的整个过程有效。此过程中可使用forward方式转发多个JSP;
	    session:有效范围为当前会话,即浏览器打开到浏览器关闭的过程;
	    application:有效范围是整个WEB应用
==================================================================================================================================================
  2、Servlet:
	创建init:
	调用service(doGet\doPost)
	销毁destroy:
==================================================================================================================================================
  3、JQ:
	1)JQ对象和Dom对象的转换:
	    DOM对象转JQ对象:
		var obj = document.getElementById("id");
		var $obj = $(obj);
	    JQ对象转DOM对象:
		var $obj = $("#id");
		var obj = $obj.get(0);
	2)选择器:
	    类选择器:
	    层次选择器:
	    ID选择器:
	    元素过滤:
	    表单选择器:
	3)AJAX数据提交的方式:(默认为异步提交,要同步则async: false属性设置为false)
	    表单提交的两种方式:一是路径代参提交,二是表单提交数据;
	    AJAX两种提交数据的方式:get和post(post方法可传输大于2K的数据);
==================================================================================================================================================
  4、框架:
	1)MyBatis
	    使用事务:(MyBatis单独使用的情况,使用SqlSession来处理事务)
		private SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); ;
		SqlSession session = sqlSessionFactory.openSession(false);//打开事务,取消自动提交
		session.commit();//提交事务
	    Spring+MyBatis整合使用事务:
		A.在spring的配置文件中:
			<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
				<property name="dataSource" ref="dataSource" />  
			</bean>
			<tx:annotation-driven transaction-manager="transactionManager"/>
		B.在方法中添加注解:@Transactional--------------------------------------------------------------------------------------------------------------------------------------------------
	2)Struts2
	    A.配置web.xml
	    B.创建struts.xml
		<package name="" namespace="/" extends="json-default">
			<action name="" class="" method="">
				<result name="success" type="json">
				 	<param name="root">result</param>
				</result>
			</action>
		</package>
	    C.编写业务控制器Action类:
	    **传递参数到服务器:
		基本属性注入(Action中的成员属性名与前台页面name相同)
			Struts2会自动实例化Action类的成员属性,调用set方法赋值
		域模块注入:将表单中的数据封装成实体对象
			private User user;
			<input type="text" name="user.name"/>
	    **页面获取服务器参数:(使用EL表达式)
		取基本属性值:${属性名}
		取域模块对象值:${对象名.属性名}
		**取驱动模型对象值:${属性名}
			a. Action类实现ModelDriven接口,并实例化对象;
			b. 实现接口方法并返回实例对象;
			c. 页面上使用${属性名} 即可取得到值;
	    D.取得Session的推荐方法:实现SessionAware接口,返回类型为Map<String,Object>;
		其他方法:
			通过ActionContext.getContext().getSession()获得Session,返回类型为Map<String,Object>
			通过ServletActionContext.getRequest().getSession()获得Session,返回类型为HttpSession
	    E.六大核心组件:
		FC前段控制器、Action业务控制器、ValueStack:action与JSP数据交互的媒介、Interceptor拦截器、Result负责输出的组件、Tags标签--------------------------------------------------------------------------------------------------------------------------------------------------
	3)Spring(具体看Spring.txt)
	    A.IOC