JAVA基础知识笔记整理【持续更新】

面向对象和面向过程的区别  : 【1】
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了;
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 
 
面向对象的特征
抽象:就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。 抽象并不打算了解全部问题, 而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。【不属于最重要的特征】
封装:是把过程和数据包围起来, 对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念, 即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
继承:是一种联结类的层次模型, 并且允许和鼓励类的重用, 它提供了 一种明确表述共性的方法。 对象的一个新类可以从现有的类中派生, 这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原 始类称为新类的基类 (父类) 。 派生类可以从它的基类那里继承方法和实例量,变 并且类可以修改或增加新的方法使之更适合特殊的需要。
多态:是指允许不同类的对象对同一消息作出响应。 多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

J2EE、J2SE、J2ME
标准版Java应用开发,主要是桌面软件开发,包括数据库连接、接口定义、输入/输出,网络编程等;
企业版Java应用开发,除了J2SE,还有网站开发,EJB、servlet、JSP、XML、事务控制;
微缩版嵌入式Java应用开发,手机、PDA、机顶盒、智能卡。

oracle与mysql的区别
1、主键。oracle一般用序列,mysql一般用自动增长类型auto increment;
2、单引号。oracle只能用单引号包起字符串,mysql可以也可以用双引号包起;
3、翻页机制。oracle比较繁琐,用ROWNUM,mysql用limit;
4、长字符串的处理。oracle中insert、update时最大可操作的字符串长度为4000单字节,更长的要用CLOB;
5、空字符串的处理。mysql非空字段可以为空,oracle则不能;
6、字符串的模糊查询。都使用 like '%字符串%' 格式,但是oracle的这种方法不能使用索引,速度较慢;
7、功能。oracle实现了sql中大部分功能,事务隔离级别、传播特性等等,而mysql还比较弱。

html
超文本标记语言, 标准通用标记语言 下的一个应用。
结构包括“头”部分(Head)、和“主体”部分(Body)

xml
可扩展 标记语言 标准通用标记语言 的子集,是一种用于标记电子文件使其具有结构性的 标记语言

css 层叠样式表:
是一种用来表现 HTML 标准通用标记语言 的一个应用)或 XML (标准通用标记语言的一个子集)等文件样式的计算机语言。
使用方式:内联方式(单个html元素中)、内部样式表(html头文件中)、外部样式表(外部css文件,html页面引入)。
选择器:元素选择器(<p><hi>)、类选择器(myclass{..})、id选择器(#h{})、选择器分组(多个选择器用逗号隔开)、派生选择器(通过上下文关系定义h1 span{})、伪类选择器(以:隔开,a:link{})。

javaScript
是一种基于对象和事件驱动的解释性脚本语言。
特点:1、可以使用任何文本编辑工具编辑;2、由浏览器内置的javascript引擎执行代码;3.适用于客户端数据计算、客户端表单合法性验证等。
内置对象:string/number/boolean/array/math/date/function/regexp

ajax
是一种用来改善用户体验的技术。
原理:在不销毁当前页面的情况下,使用XMLHttpRequest对象异步地向服务器发送请求。用户请求不会被打断,将返回的部分数据更新到页面。
如何获取ajax对象:获取XMLHttpRequest对象实例。
发送请求的过程(get/post):1、获取ajax对象实例;2、对ajax对象的onreadystatechange事件设置回调函数;3、调用XMLHttpRequest对象的open方法创建请求;4、调用ajax对象的send方法发送请求。
中文乱码:在请求资源路径和路径中的参数进行utf-8编码,可以用encodeURI(path)方法;在open方法后设置content-type的请求消息头。

jquery 【1】
一个优秀的javascript框架,一个轻量级的javascript库。核心理念:write less,do more
特点:1、兼容css3和各类浏览器;2、使用户更方便的处理html、事件、实现动画效果;3、使html页面代码和内容分离。

jsp 【】
是sun公司制定的一种服务端动态页面技术的组件规范。(以‘.jsp’为后缀,在文件中,主要是html和少量的Java代码)
内置对象:request(请求信息-用户请求期)/response(响应信息-页面执行器)/out(输出数据流-页面执行器)/session(会话-会话期)/application(全局的上下文-整个web应用运行期)/pageContext(jsp页面上下文-页面执行期)/page(jsp页面本身-页面执行期)/config(servlet配置对象-页面执行期)/exception(捕获网页异常-仅在错误页面)

spring 【1】
是一个开源的轻量级的应用开发框架,其目的是用户简化企业级应用程序开发,减少侵入。
帮助管理对象,使用基本的javaBean代替EJB(企业级javaBean),核心是IOC。其提供的IOC(控制反转)和AOP应用,可以将组件的耦合度将至最低,便于系统的维护和升级。
1、spring实现了工厂模式的工厂类(BeanFactory接口),程序中通常用到其子类Application Context。Spring相当于一个大的工厂类,在其配置文件中通过<bean>元素配置用于创建实例对象的类名和实例对象的属性。
2、Spring提供了对IOC良好支持,IOC[java反射思想的实现]是一种编程思想,能很好地实现模块间的解耦。也成为DI(依赖注入-java内省机制)
3、spring提供了对AOP技术的良好封装,AOP是面向切面编程,就是系统中有很多各不相干的类的方法,在这些方法中加入某些系统代码,例如加入日志、异常处理等,这种应用就是AOP。实现aop功能采用代理技术,客户端程序直接调用类。在spring配置文件中配置目标类和代理类即可实现代理和AOP功能。

springMVC  【1】
定义:是一种采用 MVC 架构模式的基于java的Web应用开发框架。(其实都是属于spring,spring mvc需要有spring的jar作为支撑才能跑起来)
 Model(模型):即处理业务逻辑的模块,每一种处理一个模块;(数据访问方法、dao方法、实体类)
 View(视 图): 负责页面显示,显示MODEL 处理结果给用户,主要实现数据到页面转换过程;(html/jsp)
 Control(控制): 负责每个请求的分发,把FORM 数据传递给 MODEL 处理,把处理结果的数据传递给 VIEW 显示。(servlet)

Spring MVC Framework流程 : 【】
当web程序启动的时候,ContextLoaderServlet会把对应的配置文件信息读取出来,通过注解去初始化控制器DispatchServlet. 而当接受到一个HTTP请求的时候, DispatchServlet会让HandlerMapping去处理这个请求.HandlerMapping根据请求URL(不一定非要是URL,完全可以自定义,非常灵活)来选择一个Controller. 然后DispatchServlet会在调用选定的Controller的handlerRequest方法,并且在这个方法前后调用这个Controller的interceptor(假如有配置的话),然后返回一个视图和模型的集合ModelAndView.框架通过ViewResolver来解析视图并且返回一个View对象,最后调用View的render方法返回到客户端

mybatis 【1】
是支持普通sql查询、存储过程和高级映射的优秀持久层框架。
特点:1、消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索;2、使用简单的XML或注解用于配置原始映射,记录接口和Java的普通对象映射或数据库中的记录。
(方便了修改、优化和统一浏览,但可读性很低,调试也非常困难,也非常受限。)
【MyBatis可以进行更为细致的SQL优化,可以减少查询字段。】

hibernate 【1】
是一个开源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以使用对象编程思维来操纵数据库。{还不来特}

mybatis与hibernate优缺点  【1】
Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

struts1 【1】
struts 1是基于mvc逻辑分层的web层开发框架。以ActionServlet作为核心控制器,由ActionServlet负责拦截用户的所有请求。 Struts 1框架有3个重要组成部分:Action、ActionForm和ActionForward对象。ActionForm必须实现ActionForm的基类,设计上并不是真正的POJO。

struts2 【】
struts2不是struts1的升级,而是继承的webwork的血统,它吸收了struts1和webwork的优势。
struts2 核心控制器是FilterDispatcher,Struts 2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。而Struts 2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action的execute方法来处理用户请求。显然,上面的处理过程是典型的AOP( 面向切面编程 )处理方式。

B/S和C/S 【1】
1、不需要安装客户端/必须安装客户端;
2、浏览器被闲置访问用户资源/安装客户端完全访问本地硬件资源;
3、大范围被使用/尽量避免强迫安装客户端。

设计模式 【】
创建型模式:
【简单工厂模式】
一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。
不修改代码的话,是无法扩展的。
【工厂模式】
定义一个用于创建对象的接口,让子类决定实例化哪一个类。
特点:将Java对象的调用者从被调用者的实现逻辑中分离出来,调用者只要关心被调用者必须满足的规则(接口),而不必关心实例的具体实现过程。提高了解耦。
区别:如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。
【抽象工厂模式】
为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
(区别
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)   
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族))

单例模式:
单例是为了保证系统中只有一个实例,其关键点有5:
一.私有构造函数
二.声明静态单例对象
三.构造单例对象之前要加锁(lock一个静态的object对象)
四.需要两次检测单例实例是否已经被构造,分别在锁之前和锁之后。
eg:
public class Singleton {   
     private Singleton () {}                      //关键点0:构造函数是私有的
     private static Singleton single = null ;      //关键点1:声明单例对象是静态的
     private static object obj = new object ();
     public static Singleton GetInstance ()        //通过静态方法来构造对象
     {                         
         if ( single == null )                    //关键点2:判断单例对象是否已经被构造
         {                             
             lock ( obj )                            //关键点3:加线程锁
             {
               if ( single == null )                //关键点4:二次判断单例是否已经被构造
               {
                   single = new Singleton ();   
                 }
             }
         }     
         return single ;   
     }   
}
0.为何要检测两次?
如上面所述,有可能延迟加载或者缓存原因,造成构造多个实例,违反了单例的初衷。
1.构造函数能否公有化?
不行,单例类的构造函数必须私有化,单例类不能被实例化,单例实例只能静态调用
2.lock住的对象为什么要是object对象,可以是int吗?
不行,锁住的必须是个引用类型。如果锁值类型,每个不同的线程在声明的时候值类型变量的地址都不一样,那么上个线程锁住的东西下个线程进来会认为根本没锁,相当于每次都锁了不同的门,没有任何卵用。而引用类型的变量地址是相同的,每个线程进来判断锁多想是否被锁的时候都是判断同一个地址,相当于是锁在通一扇门,起到了锁的作用。

String/StringBuilder/StringBuffer区别:
1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

synchronized 与 Lock 两种的异同:
ReentrantLock 与synchronized有相同的并发性和内存语义,还包含了中断锁等候和定时锁等候,意味着线程A如果先获得了对象obj的锁,那么线程B可以在等待指定时间内依然无法获取锁,那么就会自动放弃该锁;
但是由于synchronized是在JVM层面实现的,因此系统可以监控锁的释放与否,而ReentrantLock使用代码实现的,系统无法自动释放锁,需要在代码中finally子句中显式释放锁lock.unlock();

如果你提交任务时,线程池队列已满。会时发会生什么?
如果一个任务不能被调度执行那么ThreadPoolExecutor’s submit()方法将会抛出一个RejectedExecutionException异常。

如果同步块内的线程抛出异常会发生什么?
无论你的同步块是正常还是异常退出的,里面的线程都会释放锁,所以对比锁接口我更喜欢同步块。[从是否释放锁角度回答]

写出3条你遵循的多线程最佳实践:
给你的线程起个有意义的名字:方便找bug或追踪,给线程起一个和它要完成的任务相关的名字;
避免锁定和缩小同步的范围:锁花费的代价高昂且上下文切换更耗费时间空间,尽量使用同步块控制;
多用同步类少用wait 和 notify:CountDownLatch, Semaphore, CyclicBarrier 和 Exchanger 这些同步类简化了编码操作,而用wait和notify很难实现对复杂控制流的控制。其次,这些类是由最好的企业编写和维护在后续的JDK中它们还会不断优化和完善;
多用并发集合少用同步集合:可扩展性更好,如ConcurrentHashMap。

Java中的fork join框架是什么?
是JDK7中出现的一款高效的工具,是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。fork join框架一个巨大的优势是它使用了工作窃取算法。

Java多线程中调用wait() 和 sleep()方法有什么不同?
wait 和 sleep都会造成某种形式的暂停。wait()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep()方法仅仅释放CPU资源或者让当前线程停止执行一段时间,但不会释放锁。

容器对于web.xml的加载过程?
context-param >> listener  >> fileter  >> servlet
  •  如何使用context-param中的内容
  1. 页面中${initParam.contextConfigLocation}
  2. Servlet中
String  paramValue =getServletContext().getInitParameter(" contextConfigLocation ")





未完待续。。。。。。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值