java
拒绝内卷007
大龄码农
展开
-
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 评论 -
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 阅读 · 0 评论 -
学习java的一点心得(三)
C语言要为不同的平台生成不同的二进制代码,这就是不能跨平台——编译后的二进制代码在各个平台无法通用、兼容。对比Java,它生成的二进制代码在哪个平台都是一样的,只要这个平台安装了jvm,代码就能运行。综上,一个java文件中最多只能有一个类被public修饰,如果存在其它的类,这些类的访问权限只能是default;如果有一个类被public修饰了,那么文件名必须跟这个类名保持一致。原创 2017-08-04 16:09:19 · 313 阅读 · 0 评论 -
记一次阿里面试
过了电面,但是现场面试时遇到一个变态面试官,挂了。当然也确实是自己实力还不够,他问了很多数据库事务的问题,问我有没有研究过某个rpc框架的源码。最后是一道多线程编程题,我太紧张没有想出来。回家之后静下心来想,其实也不难。。问题:实现一个计税接口ITaxService方法 List getRate(List list); list参数中的元素最大有99个。这个接口方法内部需要调用TaxRa原创 2017-07-29 13:03:06 · 942 阅读 · 0 评论 -
Java基础之方法的重载与覆盖
但是这么做却是危险的:子类中存在两个签名完全一样的方法可以被调用。那么发生调用的时候,到底调用的是哪一个呢?大家也都知道java的方法调用是后期绑定,也就是运行时根据对象的实际类型做选择,而不是根据对象的声明类型。所以,这种情况下,调用的其实是子类的方法。也就是说,父类的重名方法被隐藏了——无法通过子类调用。在子类内部,要调用父类的这个重名方法,只能通过super加以区别;而在其他类中,通过子类的对象,调用的永远是子类的方法。所以当不小心覆盖父类的某个方法,而在代码中通过子类对象调用父类的这个方法,那么程序原创 2017-12-03 00:52:56 · 500 阅读 · 0 评论 -
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 阅读 · 0 评论 -
JVM类加载器与双亲委派模型(一)
(1)动态加载 类加载器是 Java 语言的一个创新,也是 Java 语言流行的重要原因之一。它使得 Java 类可以被动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 就出现了,最初是为了满足 Java Applet 的需要而开发出来的。Java Applet 需要从远程下载 Java 类文件到浏览器中并执行。这段话是从IBM网站上摘抄的一段,核心意思是说,Ja原创 2018-01-24 11:01:25 · 302 阅读 · 0 评论 -
JVM类加载器与双亲委派模型(二)
(7)URLClassLoader类前面说到,ClassLoader这个顶级父类只是定义好了双亲委派模型的工作机制;但是ClassLoader是个抽象类,无法直接创建对象,所以需要由继承它的子类完成创建对象的任务。子类需要自己实现findClass方法,并且在实例化时指定parent属性的值。如果parent设为null,则意味着它的父“类加载”是启动类加载器。继承体系如下:URLClassLoa...原创 2018-03-12 01:25:56 · 293 阅读 · 0 评论 -
Java漫谈(一)
Java以及编程语言 狭义上说,java是一门计算机编程语言。这句话包含两个要点: 1. java是一门语言,这种语言可以被人类识别、书写; 2. 这门语言最终要应用到计算机。 关于第一点,java这门语言有着自己特殊的语法,非专业的人也许能看懂每个单词,但是单词连成一句话就不理解了,这需要训练;关于第二点,大家都知道计算机只认识0和1,不认识人类的语言,那么jav...原创 2018-11-19 09:44:17 · 239 阅读 · 0 评论 -
Java漫谈(二)
类名 Java编译器的设计与java源代码的语法结构是相辅相成的,先有语法,再有编译器。大家都知道,java是以类为单位进行组织的,类是java对世界的抽象描述,Java程序的运行其实就是多个类之间的相互调用。表现在源码上,java的语法规定,用class关键字声明一个类,如下所示:class Demo { public static void main(String[] arg...原创 2018-11-27 16:47:41 · 474 阅读 · 0 评论 -
Java漫谈(三)
问题 接上一篇文章中提到的问题:为什么java要求每个.java文件中最多只能有一个public类,并且文件名称还要和这个public类的名字保持一致呢?这个问题其实可以分为三个子问题: 1. 为什么要以类名来命名.java文件? 2. 为什么要以public类来命名.java文件? 3. 为什么一个.java文件只能存在一个public类? 第三个问题略显...原创 2018-12-05 10:20:20 · 184 阅读 · 0 评论 -
Java总结——数据类型
基本数据类型与引用类型 Java是面向对象的语言,在java中一切都可以视为对象。然而,为什么却会引入基本数据类型这样一个明显不是对象的元素呢?个人觉得有两个方面的原因:一是逻辑上的必然结果;二是对计算机本身结构的妥协。  ...原创 2019-03-18 19:47:34 · 210 阅读 · 0 评论 -
Java漫谈(四)
命名空间包名 Java代码里面的类写多了,自然会遇到重名的问题,尤其是涉及到多人协作的时候。比如,两个人都想给自己的类命名为“Apple”,那么第三个人调用“Apple”这个类的时候,到底调的是哪个呢? 这就是命名冲突,Java给出的解决方案是引入包名,也就给类名加个前缀,如:com.Demo2。Demo2类的包名就是com,类名和包名之间用点号隔开。这时候“类名”就有了两个不同...原创 2019-03-18 19:48:53 · 332 阅读 · 0 评论 -
Servlet总结(四)
Context是Host标签的子元素,后者代表一台主机,前者是这个主机上运行的Web应用。如果有多个应用,就要在Host中写入多个Context标签。Context标签最重要的的两个属性是docBase和path,前者代表Web应用根目录在服务器文件系统中的绝对路径;后者是提供给浏览器的访问路径:也就是浏览器通过Tomcat访问"/comet"为根路径的URL时,Tomcat就会去docBase所指定的文件夹中找资源。所以Context标签本质上是一个映射。原创 2017-05-09 00:59:39 · 414 阅读 · 0 评论 -
Servlet总结(二)
想要getCharacterEncoding不返回null,只能在后台手动调用setCharacterEncoding,但是必须在调用getWriter之前调用。这是为什么呢?为什么不是getInputStream呢?第一,设置字符编码必须在获取请求体之前,因为容器要根据字符编码去解析请求体,如果已经获取到了请求体,那显然再去设置字符编码就没意义了;第二,getInputStream方法获取的是字节流形式的请求体,就是一堆二进制,所以不需要字符编码解析,而getWriter获取的是字符流形式的请求体,这就需原创 2017-04-08 17:29:25 · 426 阅读 · 0 评论 -
Servlet总结(三)
这几个方法要在调用getWriter方法之前调用,当然更要在response被提交之前调用。因为getWriter获取的是字符流形式的响应体,而把响应体从二进制转换成字符流就需要字符编码,所以必须在这之前设置好。。。有时候响应体太大,肯定不会一次性发送给客户端,只能分割成小块一块一块发送。那么这个小块到底是多大,这就是bufferSize去定义了。容器应该会去内存申请一块bufferSize大小的内存,然后把响应体写入到其中,满了之后就发送给浏览器,然后继续存储下面的内容。原创 2017-04-17 18:37:13 · 342 阅读 · 0 评论 -
学习java的一点心得(一)
Java的策略是包机制:即每个类在逻辑上必须归属于某个包,然后以“包名.类名”来命名类。比如类Apple属于包package1,那么Apple类的全名就是“package1.Apple”。点号作为分隔符代表类与包之间的从属关系,在不引起冲突的场合可以直接引用Apple,但是在有冲突的情况下,必须使用类的全名“package1.Apple”。 接着只要给这个包取一个独一无二的名字,这样就可以防止冲突了。那么如何保证包名的独一无二呢?答案是域名!显然,全世界不可能有重复的域名,所以Java设计者建议Java程原创 2016-03-05 20:22:49 · 325 阅读 · 0 评论 -
学习java的一点心得(二)
虽然Java在设计的时候是从具体到抽象,即从一堆实体里面抽象出类;但是在使用的时候却是反其道而行之,从类扩展出一个个实体。这有点像神话故事中的造人:女娲先造出一个个模板,然后根据这些模板批量复制;或者就像亚当用自己的一条肋骨复制出夏娃,接着以他俩为模板造出全人类。。所以,Java编程的主要工作就是在定义模板——类,然后用这个模板生成对象,对象之间的交互就是解决问题的过程。原创 2016-03-06 23:03:28 · 451 阅读 · 0 评论 -
Java类及对象的初始化
Java中的变量初始化其实分为三种:自动初始化;指定初始化;构造方法初始化。自动初始化是指给变量分配了空间之后,要对这一块空间进行清零操作,因为这块空间还保留着以前的数据,而这些数据不是我们想要的,所以必须先将其清零。所谓清零,其实就是赋默认值,比如布尔类型设为false,int类型设为0,引用类型设为null等等。指定初始化是指在声明变量的同时为其赋值,比如:int a = 4; 这行代码的实际执行过程是这样的:先为a分配空间,接着清零,然后再赋值1。也就是说,无论怎样,自动初始化这个过程都是必不原创 2016-08-16 11:05:57 · 364 阅读 · 0 评论 -
Servlet的session理解
第一次请求到来的时候,sessionId应该是空的,因而也就不存在与其关联的Session对象。实际上,正常流程是,第一次请求的时候,服务器端的Servlet代码内调用了以下代码: request.getSession();有了这句代码,Tomcat才会建立一个Session对象,并为其生成一个Id值,同时在(给这个第一次请求的)响应中的Header部分,加入一个指令“set-cookie: jsessionid=XXXX” ,这里的XXXX就是在服务器生成的sessionId。有了这个指令,浏览器才会原创 2016-08-19 17:05:35 · 425 阅读 · 0 评论 -
Java中值传递与引用传递
引用类型的变量说穿了只是一个影子而已,如果方法能够直接改变本体,那么影子自然也会改变——但是影子仍然对应着原来的本体。Java只有对象的“指针”,并把它存储到引用类型的变量中,但是没有变量的“指针”。在调用Java方法时,传递给它的只是变量的副本(数值),不是变量本身(即地址或指针,Java没有机制传递这玩意儿),故Java(在方法调用时)只有值传递,没有所谓的引用传递。原创 2016-10-12 15:06:37 · 349 阅读 · 0 评论 -
JDBC事务
这里的关键就是con.setAutoCommit(false),因为在默认情况下,con的autoCommit属性值是true,这时候,stmt的每次execute都是一个独立的执行单元,数据库会自动帮它提交或回滚;但是如果想让两个execute绑定到一起成为一个执行单元,就必须先setAutoCommit(false)。当然,这时数据库不会在帮它们自动提交或回滚了,所以你自己必须加入相应的代码,即con.commit()和con.rollback()原创 2016-10-05 08:57:49 · 226 阅读 · 0 评论 -
Tomcat初探(一)
最后我们看看catalina.sh是如何被启动的:它是被exec命令启动的,且传入了两个参数,一个是start,这个参数意义很明显;那么第二个是啥意思?搜了一下,它也是一个shell内置变量,功能和“$*”类似,都代表传递给命令或脚本的所有参数,只是前者以数组的形式存储,而“$*”以字符串的形式存储。在这里的作用是把所有传递给startup.sh的变量全部给catalina.sh。原创 2016-12-18 11:07:54 · 2033 阅读 · 0 评论 -
Tomcat初探(二)
如果没有设置CATALINA_BASE这个环境变量,那么就把CATALINA_HOME的值给他。这两者有啥区别呢?后者显然指的就是安装目录,也就是bin目录所在的目录。我们知道,同一个tomcat实例上可以运行多个web应用,于是当tomcat起停的时候,这几个web应用都会受到影响。另外,这几个web应用还会共享同一个tomcat的配置(就是tomcat的server.xml文件)、工作目录work、日志记录等。有些时候,这时很不方便的,我们需要单独起停某个应用,或者需要对其使用的tomcat环境进行个性原创 2016-12-18 22:22:27 · 3097 阅读 · 0 评论 -
Java基本语法之构造方法
干嘛要弄这么个特殊的方法呢?官方的说法是为了保证类字段(数据成员或属性)的初始化。可以在构造方法内部对类的属性变量赋值,保证它们在被使用之前已经被恰当的初始化。但是,初始化类字段完全可以使用任意一个方法,一定要用构造方法吗?答案是否定的。我们完全可以在类中随便写一个方法,并在这个方法中初始化类字段。然而这需要我们自己去保证,每次创建完对象都回去调用这个自己写的方法。这就呵呵了,显然可操作性不强,估计没人能一直记得做这件事。而类字段的初始化又是很重要的,所以Java的设计者们就想了构造方法这个点子。原创 2017-02-09 11:38:36 · 3127 阅读 · 0 评论 -
Java基本语法之初始化
指定初始化其实是为我们提供了更多的选择,因为我们可能不喜欢编译器给字段的默认值。但是需要特别注意的是,即使有指定初始化,也不会省略默认初始化。也就是说,即使在声明字段的时候给字段赋了值,那么jvm的执行顺序也是先默认初始化,然后在赋与指定的值。static字段没有构造方法初始化。显然构造方法是针对对象的,而static字段不属于任何对象,不需要依赖对象而存在。你当然可以在构造方法中对static字段赋值,但是这已经不能叫初始化了,因为并不“初始”。那么,static和非static字段的关键区别在于执行原创 2017-02-15 16:19:47 · 626 阅读 · 0 评论 -
Java基础语法之this关键字与static关键字
类的非static字段是对象私有的,对象在堆上new出来的时候,就获取一块空间存放自己的数据,那么数据里面肯定包括字段的值。那么问题是,会不会还包括方法体的那些代码(编译后就是字节码,也就是指令)呢?进一步,类中定义的字段是对象私有的,但是方法呢?也是每个对象都存储一份?可是方法的逻辑其实都是一样的嘛,不同的只是传入的参数,有必要每个对象存一份吗?我的想法就是,方法体的代码可定都在方法区,那些逻辑或者说指令流都存放在类的方法区里,而方法区一个类就只有一块,类似于static变量,而不是对象那样每个一块地盘原创 2017-02-20 00:27:26 · 518 阅读 · 1 评论 -
Java基础语法之数组
加上方括号是为了区别原来的类型,本质上int和int[ ]是两个不同的类型,后者代表一个新的“数组类型”。“数组类型”加上引号是因为实际上不存在跟其名字所暗示的这么一个类,比如double[ ]也可以看作是一个“数组类型”,但是它和int[ ]却是不同的类型。。。好像有点绕,不过后面说到数组的底层实现时会更清晰一些,现在只需要把int[ ]看作一个类名即可。数组是有容量大小的,但是这个大小却不能在声明的时候指定,而只能在实际创建一个对象的时候指定。简单的说,这是因为每个“数组类型”的对象大小可能是不同的,原创 2017-02-26 12:21:54 · 326 阅读 · 0 评论 -
Servlet总结(一)
实际上,容器只会为每个servlet的实现类创建一个对象,只用这一个对象来应付所有访问它的请求。当不止一个请求时,为了效率必然要开启多线程。也就是说,到时会有多个线程在访问这个对象的service方法,如果在service方法中修改了private变量,那必然会造成数据不一致的问题;而如果把private变量设成同步的,又会造成效率的下降。所以就把初始化参数放到配置文件中。应用名后面一般不再有斜线,所以<url-pattern>标签的值往往以斜线开头,斜线后面的部分可以是一个正则表达式,比如/*代表任何路原创 2017-04-04 17:15:41 · 2234 阅读 · 0 评论 -
Java总结——类与对象
基本数据类型与对象 Java是面向对象的语言,所以光有基本数据类型是不够的,对象才是主角。基本数据类型的存在,一方面是向计算机本身物理结构的妥协,另一方面是为了构造对象。 编程语言所面对的问题和事物是复杂的,...原创 2019-08-18 20:43:51 · 196 阅读 · 0 评论