
java
文章平均质量分 69
zdp072
Jim的IT专栏
展开
-
Java中的锁
前言Java中有很多的锁, 本文将对锁进行归纳总结, 便于自己以后学习理解。乐观锁和悲观锁乐观锁和悲观锁都是一种广义上的概念,在Java和数据库中都有对此概念的实际应用。悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。在Java中synchronized关键字和Lock的实现类都是悲观锁。乐观锁认为自己在使用数据的时候不...转载 2018-12-13 17:18:11 · 453 阅读 · 0 评论 -
Effective Java (6) - 消除过期的对象引用
一、引言很多人可能在想这么一个问题:Java有垃圾回收机制,那么还存在内存泄露吗?答案是肯定的,所谓的垃圾回收GC会自动管理内存的回收,而不需要程序员每次都手动释放内存,但是如果存在大量的临时对象在不需要使用时并没有取消对它们的引用,就会吞噬掉大量的内存,很快就会造成内存溢出。二、Java的垃圾回收机制Java中的对象是在堆中分配,对象的创建有2中方式:原创 2014-01-06 23:45:22 · 2183 阅读 · 0 评论 -
Apache FTPClient操作文件上传下载及公共类
我们在项目中可能需要使用ftp进行文件的上传、下载、获取服务器目录信息等相关操作,我们可以使用apache的FTPClient进行相关的操作,下面把相关公共方法与大家交流分享,每个方法前都有详细的注释进行讲解,不过在进行ftp测试的时候,我们需要配置一个ftp的服务器,进行文件的上传和下载,大家可以在网上找相关资料进行设置,把环境搭建好就可以进行我们的测试了:编写我们的FTPCongfig原创 2015-11-23 15:41:29 · 5070 阅读 · 0 评论 -
关于递归和循环
一. 递归的慢究竟慢在哪递归就是函数自己调用自己,函数每次调用的时候需要将以下内容存入递归栈:调用函数地址、形参、局部变量、返回值。所以如果递归调用了N次,那压栈操作要保存N * 调用函数地址、N * 局部变量、N * 形参、N * 返回值。这势必是影响效率的。二. 递归和循环的比较:递归和循环是两种不同的解决问题的思路,我们不能片面的说循环的效率一定会比递归高,下面我们做原创 2015-04-15 09:18:29 · 1424 阅读 · 1 评论 -
hashcode和equals
在java中,万物皆对象,所有的对象都继承于Object类,Object类有两个方法equals和hashCode。equals一般用来比较两个对象的内容是否相等,而hashCode一般用来提高容器的查询效率。 equals在没有重写的情况下和==是一样的,对于值类型,比较的是值,对于引用类型则比较的是对象的首地址。 hashCode我们一般很少直接使用,它返回的是一个原创 2015-03-10 21:38:51 · 892 阅读 · 0 评论 -
==和equals究竟有什么区别
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。(简单说就是变量指向的对象的内存地址是否相同) 如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();原创 2015-03-10 20:59:46 · 1355 阅读 · 0 评论 -
JAVA实现多文件压缩和解压缩
[使用java进行压缩和解压缩]亲测可用:import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.util.Enumeration;im原创 2015-03-10 17:14:09 · 9142 阅读 · 2 评论 -
Think in Java(十八):并发
1. 线程池CacheThreadPool:(建议使用)FixedThreadPool 使用有限的线程集来执行所提交的任务,可以限制线程的数量SingleThreadExecutor: 线程数量为1的FixedThreadPool 任何时刻都只有一个线程在运行2. yield:给线程调度机制一个暗示:你的工作已经做的差不多了,可以让别的线程使用CPU了不过这只是一个暗示,没有任何机制保证它将会被采纳3. join: 一个线程可以在其他线程之上调用join方法,其效果是等待一段时间直到第二个原创 2015-03-03 23:31:14 · 939 阅读 · 0 评论 -
Think in Java(十六):枚举类型
http://blog.youkuaiyun.com/zdp072/article/details/40401331原创 2015-03-03 23:23:49 · 641 阅读 · 0 评论 -
Think in Java(十七):注解
1.注解不支持继承,不能使用关键字extends来继承某个@interface。2.原创 2015-03-03 23:30:14 · 739 阅读 · 0 评论 -
Think in Java(十五):Java I/O系统
1. 字符流一般用来操作类似文本文件FileReader、FileWriter2. 字节流一般用于操作二进制文件,如图片、mp3等。FileInputStream、FileOutputStream3. 使用缓冲区读写大文件时可以提高效率。BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream原创 2015-03-03 22:50:45 · 613 阅读 · 0 评论 -
ConcurrentHashMap实现原理
ConcurrentHashMap是一个线程安全的Hashtable,它的主要功能是提供了一组Hashtable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候可以将锁的粒度保持的很小,不会对整个ConcurrentHashMap加锁。ConcurrentHashMap的内部结构:ConcurrentHashM原创 2016-04-30 21:21:00 · 537 阅读 · 0 评论 -
HashMap的工作原理
1. HashMap和哈希表HashMap本质上就是哈希表,其底层实现就是围绕哈希表展开的,哈希表的核心思想就是让key和存储位置建立一一对应关系,这样我们就可以通过key直接获得对应的value。好比我们可以通过索引可以直接获得数组中对应某个值一样,这种一一对应关系我们是通过哈希函数构造出来的。哈希函数实现方式:除留余数法 result = key MOD p;但是通过哈希函原创 2016-04-30 19:45:03 · 695 阅读 · 0 评论 -
Solr的安装及配置
1 Solr实现全文搜索1.1 Solr是什么?Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器。Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展,并对索引、搜索性能进行了优化。Solr是一个全文检索服务器,只需要进行配置就可以实现全文检索服务。1.2 Solr的安装及配置Solr的版本:原创 2016-06-25 19:56:59 · 5007 阅读 · 2 评论 -
Disconnected from remote host
使用xshell连接虚拟机的时候, 经常莫名其妙的出现Disconnected from remote host, 有时候第一次ok, 过了几秒特然又不行了, 一开始怀疑是不是防火墙的问题, 把防火墙关了还是不行, 百度了一下发现有可能是IP冲突了, 我的虚拟机设的IP为192.168.1.100, 把IP换成192.168.1.200就ok了。总结: 虚拟机IP尽量不要使用192.168.1...原创 2018-02-21 23:30:20 · 29995 阅读 · 2 评论 -
高效程序员的45个习惯
习惯三)对事不对人 主要精力要用于解决问题,而不是去评价团队他人。习惯四)排除万难 代码出现问题最好的办法是重构,但前提是你要理解它。习惯五)不断学习 迭代和增量式学习,每天计划用一点时间学习新技术,不需要很多时间,但需要经常进行。工作过程中遇到不熟悉的东西,可以先记下来,把它列入学习计划。 通过互联网社区了解最新的技术资讯。如饥似渴的阅读,找一些写的比较好的书,深入了解一门技术。...原创 2018-02-21 23:26:21 · 617 阅读 · 0 评论 -
分布式服务架构(原理、架构、实践)笔记
反模式永远不要在本地事务中调用远程服务, 在这种场景下如果远程服务出现了问题, 则会拖长事务, 导致应用服务器占用太多的数据库连接, 让服务器负载迅速攀升, 在严重的情况下回压垮数据库。NOSQLnosql完全不适合交易场景, 主要用来做数据分析、ETL、报表、数据挖掘、推荐、日志处理、调用链跟踪等非核心交易场景。最终一致性使用定时任务捞取未执行完的任务,继续执行未执行...原创 2018-02-11 16:08:05 · 815 阅读 · 0 评论 -
从零开始写Java Web框架笔记
关于表结构的设计1.建议表明与字段名均为小写,若多个单词使用下划线分割。 2.建议每张表都有唯一的主键字段,且字段名都为id,可使用自增主键。 3.数据类型尽可能统一,不要出现太多的数据类型。关于log4j的使用log4j.rootLogger=ERROR,console,file 上面的配置表示将日志级别设置为ERROR,并且提供两种日志appender,分别为consol...原创 2018-01-21 21:42:35 · 516 阅读 · 0 评论 -
cookie、session、sessionid 与jsessionid
cookie、session、sessionid 与jsessionid,要想明白他们之间的关系,下面来看个有趣的场景来帮你理解。我们都知道银行,银行的收柜台每天要接待客户存款/取款业务,可以有几种方案:1. 凭借柜台职员的记忆:由收柜台职员来为每位顾客办理存款/取款业务,单凭职员的记忆力,要记到每位顾客的相貌,并迅速知道顾客当前的存款以及存取的次数,每次存取的金额是多少。----原创 2015-02-11 22:07:24 · 1422 阅读 · 0 评论 -
JSTL实现递归展示树型结构数据
场景:一个树型结构的数据在数据库里映射为对象Tree(id, name, url....), Tree添加了一个自描述的属性List children从数据库中根据根节点,递归出树结构放到List treeList中,现在要求在显示中按层级显示:问题:因为未知树的层级是多少,JSTL中又不支持函数递归。解决方案:使用文件包括的形式的解决,虽然不太优雅,但是总算实现了。原创 2015-12-22 16:43:52 · 4511 阅读 · 0 评论 -
web.xml中url-pattern匹配规则
今天刚好要写一个验证用户是否登陆的过滤器,所以把web.xml中关于url-pattern的匹配规则重新熟悉了一下:一,servlet容器对url的匹配过程: 当 一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是 http://localhost/test/aaa.html,我的应用上下文是test原创 2015-01-05 10:42:12 · 1458 阅读 · 0 评论 -
JSTL标签之<fmt:formatDate/>使用介绍
一. 使用示例<fmt:formatDate value="${myDate}" type="both"/> 2004-5-31 23:59:59<fmt:formatDate value="${myDate}" type="date"/> 2004-4-1<fmt:formatDate value="${myDate}" type="time"/原创 2014-06-26 21:52:47 · 1909 阅读 · 1 评论 -
设置session超时的三种方式
1. 在容器中设置:如在tomcat-5.0.28\conf\web.xml中设置Tomcat默认session超时时间为30分钟,可以根据需要修改,负数或0为不限制session失效时间。 30 2.在工程的web.xml中设置 153.通过Java代码设置session.setMaxInactiveInterval(30*60);/原创 2016-06-21 16:42:53 · 26489 阅读 · 0 评论 -
IE11浏览器下导出Excel没有文件扩展名
使用poi,做传统的excel导出,然后想在浏览器中,让用户选择另存为,保存用户下载的xls文件,这个时候,可能的是在ie下出现乱码(ie,9,10,11),但在firefox,chrome下没乱码, 因此必须综合判断,编写一个工具类: response.setHeader("Cache-Control", "private"); response.setHeader("Pragm原创 2016-07-06 15:56:05 · 7525 阅读 · 3 评论 -
使用JavaMail发送邮件和接受邮件
一. 为什么要学习JavaMail为什么要学习JavaMail开发? 现在很多WEB应用在开发时都需要集成邮件发送功能,例如: 1. 给新注册的用户自动发送一封包含其注册信息的欢迎E-Mail。2. 给过生日的注册会员自动发送一封表示祝贺的E-Mail。3. 将网站的最新活动信息通过E-Mail发送给所有的注册会员。原创 2014-06-15 12:45:14 · 5174 阅读 · 1 评论 -
编写RESTful风格的程序
了解RESTREST是一种思想。REST式的web服务是一种面向资源的架构(ROA)资源操作:http://example.com/users/ -GET:获取一个资源 -POST:创建一个资源 -PUT:修改一个资源的状态 -DELETE:删除一个资源原始做法:http://127.0.0.1/user/query/1 GET根据用户id查询用户数据 http://127.0.0.1/u原创 2017-05-07 19:15:24 · 794 阅读 · 0 评论 -
Think in Java(十三):数组
1.数组的拷贝:System.arraycopy()public class CopyingArrays { public static void main(String[] args) { int[] i = new int[7]; int[] j = new int[10]; Arrays.fill(i, 47); Arrays.fill(j, 99); print(原创 2015-03-02 22:25:36 · 655 阅读 · 0 评论 -
Think in Java(十一):类型信息
1.所有的类都是对其第一次使用时,动态加载到JVM中的2.Java程序在它开始运行之前并非被完全加载,其各个部分是在必需时才加载的。 3.在进行类型转换前,如果不确定对象是什么类型,可以使用instanceof原创 2015-03-02 20:57:51 · 635 阅读 · 0 评论 -
一个data patch清晰的代码模板
一. 背景:今天公司上了一个项目,原创 2014-09-26 10:23:15 · 1784 阅读 · 0 评论 -
Effective Java (7) - 避免使用终结方法
一. 基本概念1. 所谓的终结方法其实是指finalize()。2. Java的垃圾回收机制只负责内存相关清理,其他资源的清理(释放文件、释放DB连接)需要程序员手动完成。3. 调用System.gc() 只是建议JVM执行垃圾回收(GC),但什么时候执行、是否要执行由JVM决定。4. 用户可以自己调用对象的finalize方法,但是这种调用是正常的方法调用,和对象的销毁过程无关。5. 如果一个类实现了finalize方法,那么当JVM执行垃圾回收的时候,该方法一定会被调用。原创 2014-10-28 16:30:11 · 1575 阅读 · 0 评论 -
SimpleDateFormat线程不安全及解决办法
一. 为什么SimpleDateFormat不是线程安全的?Java源码如下:原创 2014-11-12 15:47:34 · 13460 阅读 · 6 评论 -
Java enum枚举的用法
一. 出现背景:在JDK1.5之前,我们定义常量是这样的:public static final String RED = “RED”;在JDK1.5中加入了枚举类型,我们可以把相关的常量分组到一个枚举类中:public enum Color { RED, GREEN, BLUE;}使用的时候可以这样:Color c = Color.RED二. 枚举特点:1原创 2014-10-23 18:20:49 · 2666 阅读 · 0 评论 -
深入理解ThreadLocal
一. ThreadLocal是什么?ThreadLocal,顾名思义,它不是一个线程,而是线程的一个本地化对象。当工作于多线程中的对象使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的初始化变量副本。所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。从线程的角度看,这个变量就像是线程的本地变量,这也是类名中“Local”所要表达的意思。原创 2014-09-09 14:22:29 · 3218 阅读 · 1 评论 -
MD5和Base64
一. 简述MD5: 全称为message digest algorithm 5(信息摘要算法), 可以进行加密, 但是不能解密, 属于单向加密, 通常用于文件校验Base64: 把任意序列的8为字节描述为一种不易为人识别的形式, 通常用于邮件、http加密. 登陆的用户名和密码字段通过它加密, 可以进行加密和解密.二. 代码1. MD5:原创 2014-06-14 17:30:43 · 6576 阅读 · 0 评论 -
Effective Java (3) - 用私有构造器或者枚举类型强化Singleton属性
一、背景所谓的Singleton是指仅仅被实例化一次的类,Singleton通常被用来代表那些本质上唯一的系统组件。实现Singleton有以下三种方法:①. 私有构造器,公有静态final域。②. 私有构造器,公有静态工厂方法。③. 单元素枚举类型(首选)。二、私有构造器,公有静态final域public c原创 2013-12-22 23:50:18 · 1510 阅读 · 2 评论 -
Effective Java (2) - 遇到多个构造器参数时要考虑用构建器
一、背景对于有多个可选参数的类,我们一般通过什么办法传递参数呢?这里提供了三种办法:①. 重叠构造器模式②. JavaBeans模式③. Builder构建器模式下面我们来分析一下以上三种方法的优势及弊端。二、重叠构造器模式重叠构造器模式中第一个构造器中只有必要参数,第二个构造器有一个可选参数,第三个构造器中有两个可选参数,依次类原创 2013-12-22 22:00:05 · 1620 阅读 · 0 评论 -
Effective Java (1) - 考虑用静态工厂方法代替构造器
一、前言从今天开始计划用半个月的时间,写十篇读书笔记来记录阅读这本Java领域号称经典中的经典书籍-Effective Java(高效Java)过程中自己所思所想,以备以后查阅,同时分享出去也希望可以帮助到其他人,废话不多说,现在开始第一篇:创建和销毁对象。二、考虑用静态工厂方法代替构造器①. 一般我们有什么办法可以创建对象呢? 方法1: 使用类公原创 2013-12-21 21:33:57 · 6613 阅读 · 0 评论 -
Effective Java (5) - 避免创建不必要的对象
一、引子一般来说,最好能重用对象而不是每次需要的时候就创建一个相同功能的新对象,特别是当对象不可变时,它始终可以被重用的。重用对象对程序性能起到重要作用。二、重用不可变对象对于同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂方法而不是构造器,以避免创建不必要的对象。Boolean b1 = Boolean.valueOf("test原创 2013-12-25 23:56:26 · 1217 阅读 · 0 评论 -
Effective Java (4) - 通过私有构造器强化不可实例化的能力
一、背景对于有些工具类如java.lang.Math、java.util.Arrays等,它们只包含静态方法和静态域字段,对于这样的类实例化没有什么任何意义。但在实际使用中,如果不加任何特殊处理,这样的类还是可以像其他类一样可以被实例化。二、处理办法将构造函数设置为private,这样外部类无法实例化该类,同时在这个私有的构造函数中直接抛出异常,从而避免原创 2013-12-25 21:45:17 · 1680 阅读 · 0 评论 -
Java 时间戳和Date之间转换
一. 背景:在数据库中为了保证数据在取和存的过程中没有被其他人修改过,通常会加入一个控制版本的字段version,这个字段的值通常会使用时间戳,类似这样的格式:yyyy-MM-dd HH:mm:ss, 因为它具有惟一性,有些时候我们会涉及把时间戳传给其他的系统,那么用日期就不太方便,那就需要把它转成长整形,相当于一个token二. 代码:public class T原创 2014-10-16 10:46:09 · 3288 阅读 · 0 评论