自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

孟帅的成长博客

积累点滴的进步

  • 博客(121)
  • 资源 (1)
  • 收藏
  • 关注

原创 个人博客

我已开通个人博客,欢迎访问。

2019-03-18 19:52:34 224

原创 Java总结——类与对象

基本数据类型与对象        Java是面向对象的语言,所以光有基本数据类型是不够的,对象才是主角。基本数据类型的存在,一方面是向计算机本身物理结构的妥协,另一方面是为了构造对象。        编程语言所面对的问题和事物是复杂的,...

2019-08-18 20:43:51 196

原创 Java漫谈(四)

命名空间包名    Java代码里面的类写多了,自然会遇到重名的问题,尤其是涉及到多人协作的时候。比如,两个人都想给自己的类命名为“Apple”,那么第三个人调用“Apple”这个类的时候,到底调的是哪个呢?    这就是命名冲突,Java给出的解决方案是引入包名,也就给类名加个前缀,如:com.Demo2。Demo2类的包名就是com,类名和包名之间用点号隔开。这时候“类名”就有了两个不同...

2019-03-18 19:48:53 333

原创 Java总结——数据类型

基本数据类型与引用类型        Java是面向对象的语言,在java中一切都可以视为对象。然而,为什么却会引入基本数据类型这样一个明显不是对象的元素呢?个人觉得有两个方面的原因:一是逻辑上的必然结果;二是对计算机本身结构的妥协。      &nbsp...

2019-03-18 19:47:34 210

原创 Java漫谈(三)

问题    接上一篇文章中提到的问题:为什么java要求每个.java文件中最多只能有一个public类,并且文件名称还要和这个public类的名字保持一致呢?这个问题其实可以分为三个子问题:    1. 为什么要以类名来命名.java文件?    2. 为什么要以public类来命名.java文件?    3. 为什么一个.java文件只能存在一个public类?    第三个问题略显...

2018-12-05 10:20:20 184

原创 Java漫谈(二)

类名    Java编译器的设计与java源代码的语法结构是相辅相成的,先有语法,再有编译器。大家都知道,java是以类为单位进行组织的,类是java对世界的抽象描述,Java程序的运行其实就是多个类之间的相互调用。表现在源码上,java的语法规定,用class关键字声明一个类,如下所示:class Demo { public static void main(String[] arg...

2018-11-27 16:47:41 475

原创 Java漫谈(一)

Java以及编程语言    狭义上说,java是一门计算机编程语言。这句话包含两个要点:    1. java是一门语言,这种语言可以被人类识别、书写;    2. 这门语言最终要应用到计算机。    关于第一点,java这门语言有着自己特殊的语法,非专业的人也许能看懂每个单词,但是单词连成一句话就不理解了,这需要训练;关于第二点,大家都知道计算机只认识0和1,不认识人类的语言,那么jav...

2018-11-19 09:44:17 239

原创 JVM类加载器与双亲委派模型(二)

(7)URLClassLoader类前面说到,ClassLoader这个顶级父类只是定义好了双亲委派模型的工作机制;但是ClassLoader是个抽象类,无法直接创建对象,所以需要由继承它的子类完成创建对象的任务。子类需要自己实现findClass方法,并且在实例化时指定parent属性的值。如果parent设为null,则意味着它的父“类加载”是启动类加载器。继承体系如下:URLClassLoa...

2018-03-12 01:25:56 293

原创 JVM类加载器与双亲委派模型(一)

(1)动态加载      类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java Applet 需要从远程下载 Java 类文件到浏览器中并执行。这段话是从IBM网站上摘抄的一段,核心意思是说,Ja

2018-01-24 11:01:25 302

原创 SpringBoot实践-导入jar包中的配置文件

事件起因:开发的项目需要依赖一个本地jar包,无法通过maven直接下载;而这个jar包中含有配置文件,在配置文件中定义了spring的bean,而我的项目需要用到这个bean。开发工具:IDEAJDK版本:1.7使用框架:SpringBoot、SpringMVC解决过程:1、首先需要在项目中引入这个本地的jar包,而且还要保持maven的pom.xml文件的一致与整洁。mav

2018-01-11 18:56:09 8330

原创 Java基础之方法的重载与覆盖

但是这么做却是危险的:子类中存在两个签名完全一样的方法可以被调用。那么发生调用的时候,到底调用的是哪一个呢?大家也都知道java的方法调用是后期绑定,也就是运行时根据对象的实际类型做选择,而不是根据对象的声明类型。所以,这种情况下,调用的其实是子类的方法。也就是说,父类的重名方法被隐藏了——无法通过子类调用。在子类内部,要调用父类的这个重名方法,只能通过super加以区别;而在其他类中,通过子类的对象,调用的永远是子类的方法。所以当不小心覆盖父类的某个方法,而在代码中通过子类对象调用父类的这个方法,那么程序

2017-12-03 00:52:56 500

原创 tomcat跨域的若干实现总结

1、tomcat级别这种方法是修改CATALINA_HOME/conf/web.xml文件,在其中添加如下配置: CorsFilter com.thetransactioncompany.cors.CORSFilter cors.allowed.origins *

2017-08-10 10:59:00 1240

原创 JDK日志框架源码分析(二)

但是刚才我们顺着static块的初始化代码一路走来,并没有其他和props有关的代码,也就是说getLevelProperty方法返回的值是null。此时尚未加载配置文件,希望落空。接着是loadLoggerHandlers方法,这里传入的三个参数分别是:rootLogger、“”和".handlers",这个方法也会用到props变量,但是此时这个变量还没有内容,所以实际上这个方法也是啥都没干。

2017-08-04 18:21:28 310

原创 学习java的一点心得(三)

C语言要为不同的平台生成不同的二进制代码,这就是不能跨平台——编译后的二进制代码在各个平台无法通用、兼容。对比Java,它生成的二进制代码在哪个平台都是一样的,只要这个平台安装了jvm,代码就能运行。综上,一个java文件中最多只能有一个类被public修饰,如果存在其它的类,这些类的访问权限只能是default;如果有一个类被public修饰了,那么文件名必须跟这个类名保持一致。

2017-08-04 16:09:19 313

原创 JDK日志框架源码分析(一)

第一步是加载系统属性java.util.logging.manager指定的类,该属性在启动java程序时指定,比如使用命令行就在java命令后面用这种形式:-java.util.logging.manager=xx从代码可以看出,只有在该系统属性指定的类没有加载成功时才会使用JDK本身的LogManager创建实例。这说明,JDK的日志框架允许使用其他的类作为LogManager,这显然考虑到了以后的可扩展性,比如Tomcat就没有使用JDK的LogManager而是使用了自己定义的;当然就算是自己定

2017-08-04 10:54:48 362

原创 记一次阿里面试

过了电面,但是现场面试时遇到一个变态面试官,挂了。当然也确实是自己实力还不够,他问了很多数据库事务的问题,问我有没有研究过某个rpc框架的源码。最后是一道多线程编程题,我太紧张没有想出来。回家之后静下心来想,其实也不难。。问题:实现一个计税接口ITaxService方法 List getRate(List list);  list参数中的元素最大有99个。这个接口方法内部需要调用TaxRa

2017-07-29 13:03:06 942

原创 JDK日志框架解读

这个配置文件是默认的,也就是你可以定义自己的个性化配置文件,然后在运行你的Java程序时,使用java.util.logging.config.file参数来指定文件的位置,logging.properties也给出了例子:java -Djava.util.logging.config.file=myfile 。配置文件是针对整个Java程序的,比如Tomcat就是一个java程序,在其上运行的各个Web应用只是这个程序的一部分,所以各个Web应用也将共享这个日志的配置。但是如果一个Web应用想拥有自己独特

2017-06-19 00:56:34 734 1

原创 Servlet总结(四)

Context是Host标签的子元素,后者代表一台主机,前者是这个主机上运行的Web应用。如果有多个应用,就要在Host中写入多个Context标签。Context标签最重要的的两个属性是docBase和path,前者代表Web应用根目录在服务器文件系统中的绝对路径;后者是提供给浏览器的访问路径:也就是浏览器通过Tomcat访问"/comet"为根路径的URL时,Tomcat就会去docBase所指定的文件夹中找资源。所以Context标签本质上是一个映射。

2017-05-09 00:59:39 414

原创 Servlet总结(三)

这几个方法要在调用getWriter方法之前调用,当然更要在response被提交之前调用。因为getWriter获取的是字符流形式的响应体,而把响应体从二进制转换成字符流就需要字符编码,所以必须在这之前设置好。。。有时候响应体太大,肯定不会一次性发送给客户端,只能分割成小块一块一块发送。那么这个小块到底是多大,这就是bufferSize去定义了。容器应该会去内存申请一块bufferSize大小的内存,然后把响应体写入到其中,满了之后就发送给浏览器,然后继续存储下面的内容。

2017-04-17 18:37:13 342

原创 Servlet总结(二)

想要getCharacterEncoding不返回null,只能在后台手动调用setCharacterEncoding,但是必须在调用getWriter之前调用。这是为什么呢?为什么不是getInputStream呢?第一,设置字符编码必须在获取请求体之前,因为容器要根据字符编码去解析请求体,如果已经获取到了请求体,那显然再去设置字符编码就没意义了;第二,getInputStream方法获取的是字节流形式的请求体,就是一堆二进制,所以不需要字符编码解析,而getWriter获取的是字符流形式的请求体,这就需

2017-04-08 17:29:25 426

原创 Servlet总结(一)

实际上,容器只会为每个servlet的实现类创建一个对象,只用这一个对象来应付所有访问它的请求。当不止一个请求时,为了效率必然要开启多线程。也就是说,到时会有多个线程在访问这个对象的service方法,如果在service方法中修改了private变量,那必然会造成数据不一致的问题;而如果把private变量设成同步的,又会造成效率的下降。所以就把初始化参数放到配置文件中。应用名后面一般不再有斜线,所以<url-pattern>标签的值往往以斜线开头,斜线后面的部分可以是一个正则表达式,比如/*代表任何路

2017-04-04 17:15:41 2234

原创 HTML之表单元素

表单元素主要包括三个标签:input、select、textarea。它们一般是作为form标签的内嵌元素出现的,form表单是网页向后端传输数据的最原始、最基础的办法,我们先看一个最简单的例子:。。。对于radio类型,首先需要提供多个input,他们的类型是radio,且name属性的值要一样;然后,要设置value属性,因为它不像text那么可以有文本输入作为值;最后,要给出提示语,但是提示语并不是单选框的一部分。

2017-03-28 19:08:32 293

原创 leetCode之Two Sum

本质上就是在第一次遍历的同时,把相关信息保存到其他地方,这里就是放到一个map里面。在原数组中key是数组下标,value是元素值;放到map中恰好反了过来,key成了元素值,而value是数组下标。遍历过的元素都被当成key存到map里,而对应的value就是它的下标。所以从第二个元素开始,只需要看看它和map中某个key的和是否为target就行,不行就把它存到map中,继续遍历。讲道理,这个方法,巧是巧,就是有点钻空子了。首先一点,我个人觉得在这种算法题中,最好不要使用Java的API,因为这

2017-03-16 14:51:54 273

原创 LeetCode之Number Complement

题设的要求就是把一个正数的各个二进制位取反,取反的意思就是0变1,1变0,比如101变成010,可以看出,取反之后与原数相加就是111。所以解题思路也很简单,就是找出这个和,减去原数就行了。问题在于如何找到这个和?因为不同的输入,对应的和的二进制中1的个数是不同的。然而可以确定的是,这个和的二进制位数和原数是一致的。所以只要求得原数的位数,就可以算出这个和。

2017-03-13 11:19:10 278

原创 LeetCode之Hamming Distance

看到异或运算的那一刹那我就傻眼了——有这么好用的办法为啥我就没想到呢?异或运算之后,我们只要数一数结果里面有多少个1就行了,因为只有两个数相同位的值不同结果才是1,这就是核心思路。然后就是如何去数结果里面1的个数,上述答案使用了32次循环,每次循环内比较xor的一个位和1的与运算,如下:1011 1001 11010000 0000 0001因为1之前的位全是0,所以和xor对应位的与运算结果必是0;这样xor和1的与运算结果其实是xor的最后一位和1的与运算结果,这办法聪明!

2017-03-06 16:15:29 1449

原创 Java基础语法之数组

加上方括号是为了区别原来的类型,本质上int和int[ ]是两个不同的类型,后者代表一个新的“数组类型”。“数组类型”加上引号是因为实际上不存在跟其名字所暗示的这么一个类,比如double[ ]也可以看作是一个“数组类型”,但是它和int[ ]却是不同的类型。。。好像有点绕,不过后面说到数组的底层实现时会更清晰一些,现在只需要把int[ ]看作一个类名即可。数组是有容量大小的,但是这个大小却不能在声明的时候指定,而只能在实际创建一个对象的时候指定。简单的说,这是因为每个“数组类型”的对象大小可能是不同的,

2017-02-26 12:21:54 326

原创 Java设计模式之单例模式

好吧,这才是本文的重点,一开始我也不明白,为什么要双重检查?第一次检查难道不够吗?下面就是我分析的过程:线程一执行到了第一次apple == null,为TRUE,将要执行下一句时,被线程二抢去时间片;线程二也执行到了第一次检查,然后为TRUE,但是它有幸继续下一步代码,获取到了锁,从而别的执行此段代码的线程等待,比如假设此时线程一抢到了时间片,它也该执行synchronized(Apple.class)时,发现已经有别的线程上锁了,所以只好等待;接着就是我的疑问了,既然此时线程二独占此段代码,为啥不

2017-02-26 01:14:50 365

原创 Java基础语法之this关键字与static关键字

类的非static字段是对象私有的,对象在堆上new出来的时候,就获取一块空间存放自己的数据,那么数据里面肯定包括字段的值。那么问题是,会不会还包括方法体的那些代码(编译后就是字节码,也就是指令)呢?进一步,类中定义的字段是对象私有的,但是方法呢?也是每个对象都存储一份?可是方法的逻辑其实都是一样的嘛,不同的只是传入的参数,有必要每个对象存一份吗?我的想法就是,方法体的代码可定都在方法区,那些逻辑或者说指令流都存放在类的方法区里,而方法区一个类就只有一块,类似于static变量,而不是对象那样每个一块地盘

2017-02-20 00:27:26 518 1

原创 Java基本语法之初始化

指定初始化其实是为我们提供了更多的选择,因为我们可能不喜欢编译器给字段的默认值。但是需要特别注意的是,即使有指定初始化,也不会省略默认初始化。也就是说,即使在声明字段的时候给字段赋了值,那么jvm的执行顺序也是先默认初始化,然后在赋与指定的值。static字段没有构造方法初始化。显然构造方法是针对对象的,而static字段不属于任何对象,不需要依赖对象而存在。你当然可以在构造方法中对static字段赋值,但是这已经不能叫初始化了,因为并不“初始”。那么,static和非static字段的关键区别在于执行

2017-02-15 16:19:47 626

原创 IDEA快捷键整理(随时更新)

alt+insert --> getter and setter代码目录树直接type --> 搜索匹配ctrl + alt + T --> try catchctrl + shift + space --> auto complemtionctrl + alt + B --> open implemetationctrl + w --> 逐层向外选中ctrl + P --

2017-02-09 15:17:37 698

原创 Java基本语法之构造方法

干嘛要弄这么个特殊的方法呢?官方的说法是为了保证类字段(数据成员或属性)的初始化。可以在构造方法内部对类的属性变量赋值,保证它们在被使用之前已经被恰当的初始化。但是,初始化类字段完全可以使用任意一个方法,一定要用构造方法吗?答案是否定的。我们完全可以在类中随便写一个方法,并在这个方法中初始化类字段。然而这需要我们自己去保证,每次创建完对象都回去调用这个自己写的方法。这就呵呵了,显然可操作性不强,估计没人能一直记得做这件事。而类字段的初始化又是很重要的,所以Java的设计者们就想了构造方法这个点子。

2017-02-09 11:38:36 3127

原创 Tomcat初探(二)

如果没有设置CATALINA_BASE这个环境变量,那么就把CATALINA_HOME的值给他。这两者有啥区别呢?后者显然指的就是安装目录,也就是bin目录所在的目录。我们知道,同一个tomcat实例上可以运行多个web应用,于是当tomcat起停的时候,这几个web应用都会受到影响。另外,这几个web应用还会共享同一个tomcat的配置(就是tomcat的server.xml文件)、工作目录work、日志记录等。有些时候,这时很不方便的,我们需要单独起停某个应用,或者需要对其使用的tomcat环境进行个性

2016-12-18 22:22:27 3097

原创 Tomcat初探(一)

最后我们看看catalina.sh是如何被启动的:它是被exec命令启动的,且传入了两个参数,一个是start,这个参数意义很明显;那么第二个是啥意思?搜了一下,它也是一个shell内置变量,功能和“$*”类似,都代表传递给命令或脚本的所有参数,只是前者以数组的形式存储,而“$*”以字符串的形式存储。在这里的作用是把所有传递给startup.sh的变量全部给catalina.sh。

2016-12-18 11:07:54 2033

原创 关于Web服务器与动态网页的一些思考

返回给客户端的数据是可以直接在代码中动态生成的,代码中可以设置条件,根据条件来生成不同的代码。但是对于内容都已经写死的HTML文件这恐怕是非常难办到的,总不能每个条件分支都对应一个HTML文件吧。。而且其实每个条件下,变动非常小,比如整体页面不变,只有上面的名字或电话号码变了,难道值当为此重复写N个HTML文件?所以这时用代码来搞事情的优势就很明显了,我们在代码里面想让它怎么输出就怎么输出。

2016-11-16 15:10:27 2017

原创 HTTP协议学习(下)

上篇文章中说过,协议第一版的时候,服务器只能回应HTML字符串。这显然无法满足需求,比如我们要欣赏苍老师的作品时,没有图片咋行?于是HTTP1.0增加了这个头字段,并且规定头信息必须是ASCII码,后面的数据可以是任何格式。Content-Type就是用来告诉浏览器响应体的数据是什么格式的,然后浏览器才知道怎么去解读。这个字段常见的值包括:text/plain、text/html、text/css、image/jpeg、image/png、application/javascript、applicatio

2016-11-01 19:09:30 652

原创 HTTP协议学习(上)

ET - get嘛,就是“获取”的意思,向服务器请求特定的、由URI标识的资源,但不会改变服务器的数据,仅仅是被动的接收。POST - 用于向指定URI提交数据,数据被包含在请求体中。正如上文所说,POST请求是在第二个版本中增加的,因为第一个版本中只有GET,浏览器只能被动接收服务器的数据;但一些场景下,需要浏览器主动向服务器发送数据,以对服务器产生影响。这就是POST方法的用途。

2016-10-30 23:05:10 1312

原创 Java中值传递与引用传递

引用类型的变量说穿了只是一个影子而已,如果方法能够直接改变本体,那么影子自然也会改变——但是影子仍然对应着原来的本体。Java只有对象的“指针”,并把它存储到引用类型的变量中,但是没有变量的“指针”。在调用Java方法时,传递给它的只是变量的副本(数值),不是变量本身(即地址或指针,Java没有机制传递这玩意儿),故Java(在方法调用时)只有值传递,没有所谓的引用传递。

2016-10-12 15:06:37 349

原创 JDBC事务

这里的关键就是con.setAutoCommit(false),因为在默认情况下,con的autoCommit属性值是true,这时候,stmt的每次execute都是一个独立的执行单元,数据库会自动帮它提交或回滚;但是如果想让两个execute绑定到一起成为一个执行单元,就必须先setAutoCommit(false)。当然,这时数据库不会在帮它们自动提交或回滚了,所以你自己必须加入相应的代码,即con.commit()和con.rollback()

2016-10-05 08:57:49 226

原创 Servlet的session理解

第一次请求到来的时候,sessionId应该是空的,因而也就不存在与其关联的Session对象。实际上,正常流程是,第一次请求的时候,服务器端的Servlet代码内调用了以下代码: request.getSession();有了这句代码,Tomcat才会建立一个Session对象,并为其生成一个Id值,同时在(给这个第一次请求的)响应中的Header部分,加入一个指令“set-cookie: jsessionid=XXXX” ,这里的XXXX就是在服务器生成的sessionId。有了这个指令,浏览器才会

2016-08-19 17:05:35 425

原创 Java类及对象的初始化

Java中的变量初始化其实分为三种:自动初始化;指定初始化;构造方法初始化。自动初始化是指给变量分配了空间之后,要对这一块空间进行清零操作,因为这块空间还保留着以前的数据,而这些数据不是我们想要的,所以必须先将其清零。所谓清零,其实就是赋默认值,比如布尔类型设为false,int类型设为0,引用类型设为null等等。指定初始化是指在声明变量的同时为其赋值,比如:int a = 4; 这行代码的实际执行过程是这样的:先为a分配空间,接着清零,然后再赋值1。也就是说,无论怎样,自动初始化这个过程都是必不

2016-08-16 11:05:57 364

信息检索导论

信息检索领域的好教材 这本书里面介绍了信息检索的基本概念和基本技术 通俗易懂 很好入门

2013-11-02

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除