- 博客(54)
- 资源 (1)
- 收藏
- 关注
原创 如何获取泛型的类型 以及instanceof的简单了解
一、instanceofa instanceof B:若a是B的一个实例对象,则a instaceof B返回true。所以一直误以为a,必须是由B a=new B()而来。instanceof在进行强转时可以避免错误。/** * 测试instanceof * @author tt * */public class Main { public static void main(Stri...
2018-05-14 20:48:30
7744
原创 Spring源码解析(一)
终于下定决心,啃spring源码,主要是通过源码了解spring底层机制,以及学习一下编码技巧,其中肯定会有错误,希望大家指正,一起学习。好了,开始进入正题。我们的源码学习就是从下面这行代码开始:BeanFactory bf=new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));首先通过ClassPathResource的...
2018-05-10 16:32:59
304
2
原创 cookie&session
会话技术:用户打开浏览器访问一个页面开始,多次访问页面,到最后关闭浏览器的过程称为一次会话。常见的会话技术:cookie和session一、cookiecookie是一种客户端技术,将数据保存到浏览器的内存中。【cookie的使用总结】(1)获得cookie:Cookie[] request.getCookies()(2)向浏览器回写cookie:response.addCookie(Cookie...
2018-04-29 21:41:43
322
原创 请求转发和重定向
请求转发和重定向的区别1.重定向是发送两次请求,请求转发是发送一次请求2.重定向的地址栏发生改变,请求转发的地址栏不发生改变3.重定向是向浏览器发出请求,请求转发是服务器内部转发4.重定向是response.sedRedirect("/项目名/路径") 请求转发是request.getRequestDispatcher("内部转发路径"),这个路径是指web.xml中配置的servlet路径5.重...
2018-04-27 15:40:38
306
1
原创 Servlet解读
每一个自定义的servlet都要继承HttpServlet,所以从HttpServlet开始。首先看一下Servlet的结构:从上图我们可以看出HttpServlet继承GenericServlet,GenericServlet实现了Servlet和ServletConfig接口。一、Servlet接口1.init(ServletConfig)这是Servlet的初始化方法,由服务器执行,init...
2018-04-26 16:59:13
233
原创 面试(五)
ArrayList源码 构造函数:带int参数的构造函数无参数构造数带ollection形参的构造函数通过上面三个构造函数可知,elementData都会被赋予一个空数组,但是不同的是无参数构造函数会被赋予DEFAULTCAPACITY_EMPTY_ELEMENTDATA,有参构造
2018-03-29 21:02:42
256
原创 面试(四)
ArrayList的elementData属性为什么用了transient修饰后,依然可以序列化,这样的好处?通过ArrayList源码可以看出ArrayList实现了Serializable接口,但是elementData数组确是transient修饰的。序列化即可以把内存里面的内容保存到磁盘上。transient表示它修饰的变量不会被保存到磁盘中去。下面来探讨一下为什么?先看一下下面的代码:S...
2018-03-22 13:20:52
202
原创 面试(三)
一、二分查找二分查找要求:(1)必须采用顺序存储结构 (2).必须按关键字大小有序排列static int findBinary(int[] a,int b){ int low=0; int high=a.length-1; int mid; while(low<=high){ mid=(low+high)/2; if(a[mid]==b){ return...
2018-03-22 09:50:21
289
1
原创 面试(二)
一、JMM与JVM1.JVM【Java Virtual Machine】jdk是开发java程序的用的开发包,jdk包括java运行环境jre;jre是java程序的运行环境;jvm虚拟机是java字节码的执行引擎,能够优化java字节码,使其转换成效率更高的机器指令,程序员编写的程序最终都需要在jvm上运行,jvm屏蔽了与具体操作系统平台的相关信息。jvm模型:(1)类装载子系统将class文件...
2018-03-21 14:58:32
209
原创 面试(一)
一、spring项目启动后的加载流程1.简单介绍controller:sturts2框架、springMVC框架【负责请求的转发和视图管理】service:spring框架【实现业务对象管理】dao:hiberbate、mybatis【数据对象的持久层】根据这几个框架组合的流行度,主要介绍SSM框架。当用户发出请求以后,springMVC进行解析,并调用相应的service,service则调用对...
2018-03-21 08:40:31
837
1
原创 类型信息
【前言】编程思想第二遍,第二遍开始整理,希望有更深的理解。前几天看了关于spring aop的讲解,了解到了aop的一种实现方式是通过jdk的动态代理实现的,于是又翻看了编程思想的第14章类型信息中相关内容,现在开始总结。【正文】运行时类型信息使得你可以在程序运行时发现和使用类型信息,即通过运行时类型信息程序能使用基类指针域引用来检查这些指针或者引用所指的对象的实际派生类型。本
2018-01-17 16:41:53
209
原创 Hibernate
1.hibernate是一个orm框架ORM是对象关系映射,实现面向对象编程语言里不同类型系统的数据之间的转换2.XML版每一个model对应一个.hbm.xml文件,这个文件可以帮我们自动的建表,插入字段数据等比如新建一个Student的model,就要对应写一个Student.hbm.xml(映射文件的配置)的文件,里面的配置如下:package表示我这个Student类所
2017-12-10 20:47:46
254
原创 关于struts2的大概
一、Struts2 MVC架构MVC:模型(model)-视图(view)-控制器(controller)。在MVC模式下,控制器接收了所有来自应用程序的请求后,调用模型去准备视图所需要的数据,然后视图使用由控制器提供的数据最终生成一个可视的响应。Struts2的MVC主要通过五个核心部分进行实现:(1)操作Actions(2)拦截器Interceptors(3)值栈Value S
2017-12-02 11:57:46
325
原创 JSP&Servlet实现学生信息管理
首先声明,通过这个项目主要是想来学习java开发一个小项目的流程,各种包等关于后端的开发,因此对于前端的样式设计等没有介绍,不过在这个项目中关于样式之类的设计用的是EasyUI框架,现在,GO!一、这个项目要实现什么?要完成一个项目,你必须先知道这个项目要干什么,要完成什么样的功能,需要什么样的数据,这样我们才能一步步的进行实现。今天要学习的这个项目是学生信息管理,两个功能:班级信息管理和
2017-11-24 14:18:20
12315
56
原创 基础构建模块
一、同步容器类同步容器类实现线程安全的方式是:将它们的状态封装起来,并且对每一个公有的方法都进行同步,使得每次只有一个线程能访问容器的状态。1.同步容器类的问题同步容器类是线程安全的,但是在并发的对容器进行复合操作时还需要额外的客户端加锁。容器上常见的复合操作:(1)迭代(2)跳转,即根据指定顺序找到当前元素的下一元素(3)条件运算,比如若没有则添加这类。同步容器类要通过自身的锁来保护
2017-11-13 15:04:11
311
原创 对象的组合
我们并不希望对每一次内存访问都要进行分析来确保程序是线程安全的,而是希望将一些现有的线程安全组件组合为更大规模的组件或者程序。一、设计线程安全的类1.在设计线程安全类的过程中,需要包含三个基本元素:(1)找出构建对象状态的所有变量(2)找出约束状态变量的不变性条件(3)建立对象状态的并发访问管理策略2.要分析对象的状态,首先从对象的域开始。如果对象中的所有的域都是基本变量,则这些域构成
2017-11-07 09:31:44
540
原创 对象的共享
本文主要介绍如何共享和发布对象1.Synchronized同步代码块不仅是确保以原子的方式执行操作,而且保证内存的可见性。我们不仅希望防止某个线程正在使用对象而另一个线程在同时修改对象状态,而且希望确保党一个线程对对象状态修改了以后,其他线程能看到发生的状态的变化。2.可见性在没有的同步情况下,编译器处理器以及运行时都有可能对操作的顺序进行一些意想不到的调整(重排序),因此在缺乏足够同
2017-11-06 11:59:33
397
原创 线程安全性
1.线程安全的代码其核心在于要对状态访问【对象的状态中指的是存储在实例或者静态域的数据,对象的状态可能还包括其他依赖对象的域,在对象状态中包含了任何可能影响其外部可见行为的数据】操作进行管理,特别是共享的【共享指的是变量可以由多个线程同时进行访问】和可变的【可变的指的是在其生命周期内可以发生变化】状态的访问。2.一个对象是否需要是线程安全的取决于它是否被多个线程访问。当多个线程同时访问一个可变
2017-11-06 09:22:18
277
原创 单例模式、工厂模式、抽象模式、模板方法模式
一:单例模式1.定义:单例模式确保某一个类智能创建一个对象。2.单例模式的实现主要是把构造器设置为private,外部通过Singleton.getInstance()来访问。通用类图:3.单例模式实现的三种方式:(1)立即加载/饿汉模式,即在调用方法前,实例已经被创建了,这个模式具有很好的并发性。public class Signleton {private stati
2017-10-14 09:57:37
881
1
原创 设计模式六大原则
软件设计最大的难题就是应对需求的变化,往往我们对这些变化不知所措。我们会遇到系统修改难或者扩展难、代码过分复杂而且重复代码多、公共代码不能复用、系统不够稳定,改完经常出错等一系列问题。如何实现系统的可扩展、可复用、灵活性好、维护性好等就需要好的设计模式了。今天首先介绍设计模式需要遵循的六大原则。第一:单一职责原则(SPR)
2017-10-12 09:56:00
3496
4
原创 Effective Java之创建和销毁对象
Effective Java这本书针对人群是对Java有一定的开发经验,至少对Java的整体结构是了解的,额,我属于比小白再高级点的,提前接触了这本书,有错误或者认识的不到位的欢迎指教,我也会随着时间的推移,不断地完善。今天要总结的是Effective Java的第二章创建和销毁对象。第一条:考虑使用静态工厂方法代替构造器之前的博客有说过,关于创建一个类的实例的方法,最常见的即利用构造
2017-10-10 09:09:31
340
原创 面向对象以及捕捉异常需要注意的问题
一、面向对象1.instanceof运算符instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类,用于判断前面的对象是否是后面的类或者其子类。当编译器编辑Java程序时,编译器无法检查引用变量的实际引用对象的类型,它只检查该变量的编译类型。对于强制转型要求如下(使用instanceof也是如此):☆在编译阶段,要想编译通过,则(1)被转型变量的编
2017-10-05 09:55:18
361
原创 关于Java表达式中的陷阱
一、字符串陷阱1.对于对象的创建方式(1)通过new关键字调用构造器创建Java对象:String a=new String("ltt")->此语句创建了两个Java对象即“ltt”这个直接量对应的字符串对象和new String构造器返回的字符串对象。(2)通过Class对象的的newInstance方法调用构造器创建Java对象。(3)通过Java的反序列化机制从IO流中恢复J
2017-10-03 08:35:12
321
原创 java垃圾回收机制
一、什么是垃圾回收机制java的垃圾回收机制是Java虚拟机提供的能力,用于在空闲时间以不定时的方式动态回收无任何引用的对象占据的内存空间。需要注意的是垃圾回收回收的是无任何引用的对象占据的内存空间,而不是对象本身。真正的垃圾回收机制不是立马回收,具体在什么时间开始是不确定的,这和抢占式的线程在发生作用时的原理一样。二、关于在讲解垃圾回收时会用到的一些概念1.强制垃圾回收。由于程序无法
2017-09-29 09:52:55
2032
原创 Map、Set和List的一些关联
三种集合的示意图如下:一、Map和SetMap集合的key具有的特征是无序不重复,如果将Map的所有key集中起来,那么这些key就组成了一个set集合,而且事实就是Map集合提供了如下方法来返回所有key组成的集合:可以看出keySet()的返回类型就是Set类型的。对于Map而言只要把所有的key集中起来,它就是一个set,这就是从Map到Set的转换,从Set到M
2017-09-27 14:27:18
358
原创 Java容器
Java集合类即Java容器。集合类和数组不一样,数组元素既可以是基本类型的数值,也可以是对象的引用变量,但是集合里只能保存对象的引用变量(则个问题下面还会详细的解释一下)。Java集合类主要是由两个接口派生而出:Collection和Map,这两个接口是Java集合框架的根接口,这两个接口还包括了一些子接口和实现类,容器类图如下:上图中蓝色背景的为接口,橘红背景的是我们经常是会用的类。下面我们会...
2017-09-26 14:07:01
266
原创 对象与内存控制
Java内存管理分为两个方面即内存分配和内存回收。内存分配特指创建Java对象时jvm为该对象在堆内存中所分配的内存空间;内存回收指的是当该Java对象失去引用变成垃圾时,jvm的垃圾回收机制自动清理该对象,并回收该对象所占用的内存。不能因为jvm内置了垃圾回收机制而认为java不存在内存泄漏,因此不能肆无忌惮的创建对象。一、实例变量和类变量1.java程序变量可分为成员变量和局部变量。
2017-09-24 14:24:04
237
原创 数组与内存控制
一、数组初始化1.数组初始化方式有两种:静态初始化:初始化时显示的指定每个元素的初始值。比如:int [] a=new int[]{1,2,3}或者int[] a={1,2,3}动态初始化:初始化时只指定数组长度,由系统分配初始值。比如:int[] a=new int[3]2.需要注意的问题(1)Java数组是静态的,即数组被初始化以后,数组的长度是不能改变的。(2)Jav
2017-09-23 20:02:17
279
原创 单例模式和多线程
单例类只能存在一个实例,单例类必须自己创建自己唯一的实例,单例类必须能给其他的所有对象提供这一实例。单例模式主要包括立即加载/饿汉模式、延迟加载/懒汉模式等。单例模式和多线程在一起时,就会出现问题,比如多个线程可以创建多个单例实例,这样是违背单例模型的初衷的。一、立即加载/饿汉模式1.立即加载即在调用方法前,实例已经被创建了,下面看一个实现立即加载和多线程的单例设计模式。MyO
2017-09-22 14:33:19
257
原创 定时器Timer
Timer类主要负责计划任务,即在指定时间执行某一个任务。TimerTask是一个抽象类,进行封装任务。创建一个Timer就是启动一个新的线程,默认的新启动的线程不是守护线程,它会一直运行,要使它变成守护线程,则Timer timer=new Timer(true)即可。一、schedule方法1.当执行任务的时间晚于当前的时间,则任务会等到执行任务的计划时间再运行。2.当执行任务
2017-09-21 17:15:47
317
原创 Lock使用----ReentrantRedWriteLock
ReentrantLock具有完全排斥他的效果,即同一个时间只有一个线程在执行。ReentrantRedWriteLock类是一种读写锁。顾名思义包括两个锁,一个是读操作相关的锁即共享锁,即同一时间允许多个线程进行读操作;另一个是写操作相关的锁即排它锁,即同一时间只允许一个线程进行写操作。读锁与写锁是互斥的,写锁与写锁是互斥的,读锁与读锁是共享的,非排斥的。读锁上锁:lock.read
2017-09-20 11:51:11
360
原创 Lock的使用---ReentrantLock
ReentrantLock类的作用如同Synchronized,旨在实现线程间的同步。一、初识ReentrantLockMyService.java/* * ReentrantLock实现同步 * lock.lock()持有锁 * lock.unlock():一个线程执行完了以后释放锁 * 结果都是分组输出的,但是哪个线程先输出是随机的 */public class MySer
2017-09-20 10:30:24
484
原创 ThreadLocal和InheritableThreadLocal的使用
一、ThreadLocalpublic class Run {public static void main(String[] args) throws InterruptedException{ for(int i=0;i<5;i++){ System.out.println("main="+Tools.t1.get()); Thread.sleep(100); } Thread
2017-09-18 16:57:12
493
原创 方法join的使用
很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往早于子线程结束之前结束。若抓线程想等子线程运行结束后再结束,就要用到join()了,join方法的作用是等待线程对象x的销毁。即使所属线程对象正常执行run()方法中的任务,而使当前线程无限期的受阻,等xi成
2017-09-18 16:09:04
497
原创 生产者/消费者模式
等待/通知模式最经典的案例即生产者/消费者模式。1.一生产与一消费:操作值2.多生产与多消费:操作值多生产与多消费有可能会造成假死,假死即线程进入warning等待状态。若全部线程进入warning状态,则整个项目处于停止状态。假死出现的原因即有可能连续唤醒同类,即生产者唤醒生产者,消费者唤醒消费者。解决假死的办法即把notify()改为notifyAll(),这样它的原理不光是通
2017-09-18 15:03:13
411
原创 使用wait/notify实现线程间通信
线程与线程之间不是独立的个体,他们彼此之间都是可以相互通信和协作的。比如有两个线程A和B,线程A做的是不断地对变量i进行累加,B做的通过while循环,当检测到i的值是10000时则打印出来,这样两个线程实现了通信,但是线程B不停地通过while语句轮询机制来检测某一个条件,这样会浪费CPU资源。因此我们需要一种机制来减少CPU的资源浪费而且还可以实现多个线程之间的通信,即“wait/notify
2017-09-18 13:27:40
928
原创 volatile关键字
关键字volatile的主要作用是使变量在多个线程间可见,强制从公共堆栈中取得变量的值,volatile就是解决私有堆栈中的值和公共堆栈中的值不同步的问题。synchronized和volatile比较:1.volatile是线程同步的轻量级实现,volatile只能修饰变量,synchronized可以修饰方法以及代码块。2.多线程访问volatile不会发生阻塞,而synchron
2017-09-14 17:24:49
252
原创 内置类与同步
一、内部类与静态内部类PublicClass.java/* * 内部类 * 若Run.java和PublicClass.java不在同一个包中,则需要把PrivateClass类声明成public。 * 在PrivateClass前面加上static即为静态内部类 * 静态内部类不能访问外部类的非静态对象 * 非静态内部类中不可以有静态成员。 * 静态类和方法属于类本身。 */
2017-09-14 16:44:52
372
原创 多线程之其他
一、数据类型String的常量池特性在JVM中具有String常量池缓存功能。将Synchronized(string)和String联合使用时,需要注意常量池带来的一些例外。当string的值都相等时,表明两个线程持有的是相同的锁,其中一个线程不停下来,另一个线程将永远不能被执行。因此大多数情况下,synchronized代码块不使用String作为锁对象,而改用其他,比如new Objec
2017-09-14 16:24:54
283
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人