自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

WJK的前进之路!

十年饮冰,难凉热血!

  • 博客(104)
  • 资源 (2)
  • 收藏
  • 关注

原创 FASTJSON性能优化

##序列化 IdentityHashMap缓存各种序列化处理类,包括各种基本对象、集合对象、第三方对象、自定义对象,方便序列化处理类的快速查找、避免JavaBeanSerializer的反复创建。代码地址 使用ThreadLocal来存储序列化过程中不断append的字符串,减少内存分配和gc,从而提高性能。 用类StringBuilder方式进行字符串操作,配合ThreadLocal...

2018-11-20 10:44:35 1935

原创 第6条:消除过期的对象引用

当你从手工管理内存的语言(比如C或C++)转换到具有垃圾回收功能的语言的时候,程序员的工作会变得更加容易,因为当你用完了对象之后,它们会被自动回收。当你第一次经历对象回收功能的时候,会觉得这简直有点不可思议。这很容易给你留下这样的印象,认为自己不再需要考虑内存管理的事情了。其实不然。 考虑下面这个简单的栈实现的例子:public class Stack{ private Object

2017-12-18 20:34:12 252

原创 第5条:避免创建不必要的对象

一般来说,最好是重用对象而不是在每次需要的时候就创建一个相同功能的新对象。重用方式既更加快速,也更为流行。如果对象是不可变的(immutable)(见第15条),它就始终可以被重用。 作为一个极端的反面例子,考虑下面的语句:String s = new String("hello world"); // DON'T DO THIS! 该语句每次被执行的时候都创建一个新的String实例,

2017-12-18 20:25:12 270

原创 第4条:通过私有构造器来强化不可实例化能力

场景: 在创建工具类的时候,大部分是无需实例化的,实例化对它们没有意义。在这种情况下,创建的类,要确保它是不可以实例化的。存在问题: 在创建不可实例化的类时,虽然没有定义构造器。但是,客户端在使用该类的时候,依然可以实例化它。客户端,可以继承该类,通过实例化其子类来实现实例化;客户端可以调用默认的构造器来实例化该类。 要避免这个问题,使用的方式是,定义一个私有的构造器:p

2017-12-18 20:15:57 248

原创 第3条:用私有构造器或者枚举类型强化Singleton属性

采用私有构造器来强化Singleton属性 顾名思义,即我们需要定义一个private的构造器,但要注意一点,即使我们定义了私有的构造器,但是客户端还是可以借助AccessibleObject.setAccessible方法,通过反射来调用私有的构造器,因此,我们需要修改构造器来抵御这种工具,下面代码很好阐述了这个。public class Singleton { privat

2017-12-14 21:01:56 208

原创 第1条:考虑用静态工厂方法代替构造器

首先我们先看下一个类RandomIntBuilder,用来创建随机的Int整数public class RandomIntBuilder { private final int min; private final int max; public int next() {...}} 接下来我们来加入几个构造器来看看 复制代码public RandomIntBu

2017-12-14 20:29:45 234

原创 java.util.Collection包下各个类的特点汇总

java.util.Collection包下各类和接口的特点如下图(包含实现方式,特点,父子关系)文字版是这样的:java.util.Collection接口 Set接口 特点:没有重复元素,可以有null(最多一个),没有顺序 HashSet 实现:基于HashMap 特点:没有顺序,用equals()和hashCode()协同判断元素是否存在 L

2017-12-14 19:47:12 526

原创 第2条:遇到多个构造器参数时要考虑用构建器

术语: 重叠构造器(telescoping construct)模式:就是提供多个构造函数。 JavaBeans模式:这种模式实际上是先调用无参的构造函数来创建对象,然后再调用属性的setter方法来进行相应设置。 Builder模式:这种模式下不直接生成需要的对象,而是让客户端利用所有必要的参数调用构造器(或静态工厂方法)。得到一个builder对象,然后客户端在builde

2017-12-13 11:28:08 157

原创 ubuntu 16.04安装 navicat

1. 下载 navicat110_mysql_en.tar.gz 文件http://www.formysql.com/xiazai.html2. 下载后解压tar文件tar -zxvf /home/rain/download/navicat8_mysql_en.tar.gz 3. 解压后 进入解压后的目录运行命令:./start_navicat 4.安装完成但是发现中文界面乱码打开sta

2017-12-08 11:45:43 10738

原创 外观模式Facade(结构型)

1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。 例子1:一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计。2. 问题 为了降低复杂性,常常将系统划分为若干个子系统。但是如何做到

2017-12-03 19:57:12 143

原创 Hibernate与 MyBatis的比较

第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分。 Mybatis 是另外一种优秀的O/R mapping框架。目前属于apache的一个子项目。 MyBatis 参考资料官网:http://www.mybatis.org/core/zh/index.html

2017-12-01 21:03:36 151

原创 腾讯2017秋招笔试编程

第一题编码 假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, … …, b, ba, baa, baaa, baab, baac … …, yyyw, yyyx, yyyy 其中a的Index为0,aa的Index为1,aaa的Index为2,以此类推。 编写一个函数,

2017-09-03 22:51:33 464

原创 华为2016校园招聘上机笔试题

第一题:最高分是多少?题目 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩. 输入描述: 输入包括多组测试数据。 每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目。 学生ID编号从1编到N。 第二行包含N个整数,代表这N个学生的初始成绩

2017-08-30 15:12:46 1605

原创 搜狐2018研发工程师秋招笔试题

题目 有一间工厂生产的东西, 被包装在相同高度h 的正方形容器内, 但其面积大小分别有:1*1, 2*2, 3*3, 4*4, 5*5, 6*6等六种尺寸。这些产品总是用高度为h,面积为6*6的箱子打包后寄给客户。因为成本关系,当然希望将客户所订购的产品放在最少的箱子里寄出。请你写一个程式找出寄送这些产品最少需要多少个箱子,这可以使工厂节省下不少钱.思路 简单的暴力贪心算法,对不同的产品有

2017-08-29 09:40:12 504

原创 搜狐2017秋招研发工程师笔试题目

第一题:保留最大的数字题目 给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。 输入描述: 输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 1000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。 输出描述:

2017-08-28 15:47:08 941

原创 搜狐2016研发工程师编程试题

第一题:马戏团题目 搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演。考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等。 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题。小王觉得这个

2017-08-27 22:59:45 388

原创 Servlet 实现重定向几种方法

servlet重定向 在servlet/JSP编程中,服务器端重定向可以通过下面两个方法来实现: 运用javax.servlet.RequestDispatcher接口的forward方法, 或者运用javax.servlet.http.HttpServletResponse接口的sendRedirect方法。 要运用RequestDispatcher接口的forward

2017-08-23 16:00:17 1726

原创 Spring框架中获取连接池的四种方式

连接池概述 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。      数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来

2017-08-23 15:36:12 452

原创 之字形(Zigzag)遍历/打印/提取矩阵元素算法

题目: 输入一个M*N的矩阵,按之字形将矩阵元素提取/打印出来。 分析: 容易知道,对角线方向的行数(如<1,2>、<5,4,3>)为M+N,由于元素在对角线方向的奇数行和偶数行增大的方向正好相反,可由此入手,用一个变量s(0<s<M+N)记录对角线行数的序号,在奇偶行上分别控制序列移动和边界条件。需要注意的是到达对角线行终点后元素的移动方向,有两种情况——向下和向右,此处边界条件的

2017-08-17 09:47:09 1130 1

原创 Java多线程之锁优化策略

锁的优化策略 编码过程中可采取的锁优化的思路有以下几种: 1:减少锁持有时间 例如:对一个方法加锁,不如对方法中需要同步的几行代码加锁; 2:减小锁粒度 例如:ConcurrentHashMap采取对segment加锁而不是整个map加锁,提高并发性; 3:锁分离 根据同

2017-08-15 10:43:51 210

原创 java中volatile关键字的含义

在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized

2017-08-14 21:35:18 142

原创 Java自定义类加载器与双亲委派模型

双亲委派模型并不复杂。自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后copy一下就能用。但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制,这样显然不行。可是自定义类加载器又不经常用,时间久了容易忘记。相信你经常会记不太清loadClass、findClass、defineClass这些函数我到底应该重写哪一个?它们主要是做什么的?本文大致分析了各个函数的流程,目的就是让

2017-08-14 10:51:42 232

原创 Java的四种引用方式

java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象。 java对象的引用包括 强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型主要有两个目的: 第一是可以让程序员通过代码的方式决定某些对象的生命周期; 第二是有利于JVM进行垃圾回收。 下面来阐述一下这四种类型引用的概念:1.强引用

2017-08-10 21:43:30 364

原创 ThreadPool用法与优势

引言 合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。线程池的使用线程

2017-08-10 16:46:04 228

原创 java多线程之生产者消费者经典问题

今天研究了一下Java多线程,顺便写了一下多线程中的经典问题—–生产者消费者经典问题,参照了网上的各种写法之后自己写了一个,如下所示:/**生产者消费者问题,涉及到几个类 * 第一,这个问题本身就是一个类,即主类 * 第二,既然是生产者、消费者,那么生产者类和消费者类就是必须的 * 第三,生产什么,消费什么,所以物品类是必须的,这里是馒头类 * 第四,既然是线程,那么就不是一对一的

2017-08-10 14:31:57 237

原创 java线程同步:synchronized关键字,Lock接口以及可重入锁ReentrantLock

多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修改,就会导致修改的状态不一致.用一个实际的例子来说明线程同步的必要性:package cn.outofmemory.locks;public class LockDemo implements Run

2017-08-10 14:09:14 328

原创 CIDR与NAT

前言 IPv4由于最初的设计原因,长度只有32位,所以只提供了大约40亿个地址.这造成了IPv4地址耗尽的危机.随后,IPV6被设计出来了,并可以提供足够多了IP地址.但是IPV4和IPV6不兼容啊,所以IPV4向IPV6的迁移并不容易.一些技术,比如说这里要说的CINR和NAT,相继推广.这些技术可以缓解IPV4的稀缺状态,成就了IPV4一时的逆袭.CIDR CIDR(Class Int

2017-08-05 22:45:09 720

原创 简易的参数校验框架

简易的参数校验框架V1.0一、必要性在整个项目中,调用接口都需要对参数进行合法性判断,参数校验是必须的,且到处存在于我们的代码中(例如之前的代码中,在Service层中对接口的参数进行合法性检验),这样就会导致参数校验的代码和我们的业务逻辑代码混合在一起,以后如果业务需要改变的时候,则需要更改相应的参数校验代码,这就违背了:单一性原则、低耦合等设计原则。所以需要将参数校验和业务代码逻辑进行分离。二、

2017-08-02 21:31:08 1792

原创 剑指offer面试题目:不能被继承的类

题目 用C++写一个不能被继承的类,且能正常使用。分析 首先,不能被继承的类,也就是它的子类继承它后不能正常的实例化。其实,如果能考虑到这里,就很简单了:子类需要实例化父类,将父类的构造函数设为private,子类就无法实例化了。再进一步,子类的析构函数需要调用父类的析构函数,所以将父类的析构函数设为private也能解决我们的问题。 问题的后半句将难度提升了两个数量级:且能正常

2017-08-01 14:13:48 208

原创 剑指offer面试题目:不用加减乘除做加法

题目 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。分析 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2。 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。 同样我们可以

2017-08-01 10:37:12 199

原创 剑指offer面试题目:圆圈中最后剩下的数字(约瑟夫环)

题目 0,1,…n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字。分析 环形链表模拟圆圈 创建一个n个节点的环形链表,然后每次在这个链表中删除第m个节点; 可以用std::list来模拟环形链表,list本身不是环形结构,因此每当迭代器扫描到链表末尾的时候,需要将迭代器移到链表的头部。 分析每次被删除的数字的规律,

2017-07-31 21:52:57 284

原创 剑指offer面试题目:扑克牌中的顺子

题目 随机抽取扑克牌中的5张牌,判断是不是顺子,即这5张牌是不是连续的。其中A看成1,J看成11,Q看成12,K看成13,大小王可以看成任何需要的数字。分析 :这道题的意思很明确,我们玩扑克的过程中,也经常碰到这样的情况。我们先看看在现实生活中,我们是怎么样处理的,我想大部分人都是这样做的:先把5张牌从小到大进行排序,然后直接判断。而如果碰到大小王,我们会除去大小王之后排序,然后判断不相邻

2017-07-31 20:46:27 417

原创 剑指offer面试题目:翻转单词顺序

题目 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。 为简单起见,标点符号和普通字母一样处理。 例如输入“I am a student.”,则输出“student. a am I”。 分析 此题较为简单,可以设一个临时变量,然后从头开始扫描句子,以此把每个单词存到临时变量中,然后把变量存到字符串中,再把下一个单词

2017-07-31 15:02:59 188

原创 剑指offer:和为 s 的连续正数序列

题目 输入一个正数 s,打印出所有和为 s 的连续正数序列(至少两个数)。 例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以结果打出 3 个连续序列 1~5、4~6 和 7~8。 分析 考虑用两个数 small 和 big 分别表示序列的最小值和最大值。首先把 small 初始化为 1,big 初始化为 2。如果从 small 到 big 的

2017-07-31 10:35:37 166

原创 剑指offer面试题目:和为 s 的两个数字

题目 输入一个递增排序的数组和一个数字 s,在数组中查找两个数,得它们的和正好是 s。如果有多对数字的和等于 s,输出任意一对即可。 例如:输入数组{1 、2 、4、7 、11 、15 }和数字 15。由于 4+11 = 15 ,因此输出 4 和 11 。 分析 我们先在数组中选择两个数字,如果它们的和等于输入的 s,我们就找到了要找的两个数字。如果和小于 s 呢?

2017-07-31 10:31:28 149

原创 剑指offer面试题目:数组中只出现一次的数字

题目 一个整型数组里除了一个数字之外,其它的数字都出现了两次。请写程序找出这个只出现一次的数字。 要求时间复杂度是O(n),空间复杂度是O(1)。分析 由于题目要求时间复杂度为O(n),所以先排序然后比较相邻数字是否相同的思路被排除。 空间复杂度是O(1),辅助空间被限制,所以hash表的思路也被排除。 那么这个题的突破口在哪里呢?注意这个数组的特殊性:其它数字都出现了

2017-07-30 21:58:01 199

原创 剑指offer面试题目:数字在排序数组中出现的次数

题目 统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3由于3在这个数组中出现了4次,因此输出4。分析 题目解法很多,关键是要找到让人满意的方法,直接统计当然可以,可是显然不是我们要的答案。 比较好的思路如下: 使用二分查找的拓展,当查找的元素有重复的时,找到元素的第一个和最后一个。这样将可以计算出该元素有多少个重复的了。二分法在数

2017-07-30 17:30:40 299 2

原创 剑指offer面试题目:两个链表的第一个公共节点

题目 输入两个链表,找出它们的第一个公共结点。分析 这个问题一种常想到的方法就是两层循环遍历,外层循环遍历链表A,对A中每个节点,遍历链表B,如果在B中找到,说明这个节点是第一个公共节点,但是这样的方法时间复杂为mn,一般是不允采用的。 所以我们需要分析更深层次的问题,找到其中的规律,我们如果动手画一下一般的链表图就能够发现两个链表的第一个公共节点之后的样子一定是如下表示(由此可以发

2017-07-30 10:46:26 296

原创 剑指offer面试题目:数组中的逆序对

题目 题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当i小于j时,a[i]>a[j],那么我们就称(a[i],a[j])为一个逆序对。在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5

2017-07-30 10:22:27 199

原创 剑指offer面试题目:第一个只出现一次的字符

题目 在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。分析 方法一:简单粗暴O(n^2),一个显而易见的想法是像冒泡排序一样,采用两个循环,内层循环对外层判定元素arr[i]进行轮询,当发现arr[i] == arr[j]时,本次循环终止,显然,时间复杂度O(n^2),不使用额外空间。 方法二:上述做法虽然可行,不过O(n^2)的时间复杂度显然不理想

2017-07-30 09:41:13 212

离散数学 屈婉玲

离散数学

2017-06-15

PHP网络编程自学手册 代码

2016-12-07

空空如也

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

TA关注的人

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