java
文章平均质量分 79
半岛铁盒里的猫
一个热爱足球和音乐,带有一定程度文艺气息的主流程序员。
展开
-
调侃《Head First 设计模式》之命令模式
首先你有一个遥控器,什么样的呢?它有七个插槽,可以插上七种不同的装置,每个插槽对应两个按钮,分别对插槽的装置进行开关操作。如下图: 现在你需要设计遥控器的API,使得遥控器可以接入某厂商的设备装置需要插到插槽上的设备的类如下图: 类不少,而且以后还会增加,所以设计一个复用性和可扩展性高的遥控器API变得十分迫切。 我们看到,原创 2015-04-25 20:37:09 · 846 阅读 · 0 评论 -
java多线程设计模式之消费者生产者模式
所谓生产者,就是产生数据的线程,消费者,就是使用数据的线程。两个线程的速度差将成为最大的问题,而该模式就是缓冲两者的速度差。一般来说,生产者和消费者会有多个。以下是典型的例子程序。假设一个场景,有一个桌子Table,有若干个厨师MakerThread往桌子上按顺序放上蛋糕,有若干个顾客EaterThread按顺序吃蛋糕:首先是厨师MakerThread:public class M原创 2016-11-06 18:35:48 · 995 阅读 · 0 评论 -
java多线程设计模式之ReadWriteLock(读写锁)
在之前的模式中,为了确保线程安全,每次读写数据只允许一个线程操作数据类对象,但是多线程同时读数据也是安全的,所以为了提升性能,是不是可以有一种模式,允许同时多线程读,但是只能一条写线程在操作数据类对象呢?答案是肯定的。现在就来介绍下读写锁模式。 Java并发包中有读写锁类ReadWriteLock,他的功能是使得当多个线程读和多个线程写同一块数据的情况下,允许多线程同时读,但是有线原创 2016-11-19 20:17:25 · 593 阅读 · 0 评论 -
java多线程设计模式Worker Thread(线程池)
想象一个场景,一个工厂在生产玩具,在一个车间里,有几个工人,每次生产部件准备好车间外的人就将部件放到车间的一个桌子上,工人每次做完一个玩具就从桌子上取部件。在这里,注意到,部件并不是直接交给工人的,另外一点,工人并不是做完一个部件就回家换个新人,后者在现实有点滑稽,但是在程序中却对应一个典型的线程使用方法:线程池。所谓线程池,就是对线程的复用,当线程执行完任务之后就继续取其他任务执行,而不是销原创 2016-11-13 13:32:24 · 6541 阅读 · 1 评论 -
java多线程设计模式笔记之Active Object
今天要说的模式是前几个模式的综合体,也是这个系列的最后的一个模式,叫做接受异步消息的主动对象。与之相关的模式有java多线程设计模式之Future Pattern、 java多线程设计模式之消费者生产者模式、 java多线程设计模式之Guarded Suspension等,如果不了解这几个模式,最好先看下这几个模式。何为主动对象,一般来说是指自己拥有独立的线程的对象,在这里不只是拥有独立线原创 2016-12-04 11:16:48 · 501 阅读 · 0 评论 -
一个小例子看懂java对象初始化执行过程
创建java对象对于做java程序开发的我们来说再简单不过了,也就是new 构造方法,不过很多人可能对于内部执行的过程不是很清楚。我们知道java的类是动态加载的,只有当需要的时候才会加载入虚拟机,分配内存,创建对象。本文就是用一个小例子来说明随想创建的一些基本过程。看例子程序:首先一个简单的类Bird:public class Bird { String a = "i am原创 2016-12-05 10:38:09 · 1591 阅读 · 0 评论 -
java多线程设计模式笔记之Future Pattern
想象一个场景,你去蛋糕店买蛋糕,先下订单之后,店员给你一张提货单,叫你下午来取货,下午你来取蛋糕,如果此时蛋糕已经做好了,则拿走蛋糕,如果没有做好,则你还得再等等。相对应的程序场景,主线程要得到某些数据需要耗时操作,于是开了个子线程去生产数据,然后主线程去做别的事,等一段时间之后再去取回数据,实现了异步回调。 看代码~~首选是Data接口,表示数据:public interfac原创 2016-11-26 19:00:57 · 1040 阅读 · 0 评论 -
java多线程设计模式之Guarded Suspension
想象一个场景,你在排队领军训的装备,当你排队到窗口的时候,工作人员对你说,等一下,让我叫后勤先去仓库取下装备再给你,于是你等到工作人员取回装备才能领走装备。抽象为一个java程序模型:你是一个线程ClientThread,负责取数据Request,暂时存放装备的窗口是一个队列RequestQueue,后勤人员是一个存放装备的线程ServerThread,于是可以用一下代码表示:首先是存放数原创 2016-10-22 14:44:36 · 1161 阅读 · 3 评论 -
用Java实现求一个数组中的出现次数最多的元素的个数
前些天做笔试题的时候,遇到这一道题:用Java实现求一个数组中的出现次数最多的元素的个数。但是时间比较紧,我想出了先排序,然后遍历一遍,相邻元素相等则累计,不同则重新累计,遍历完就可以得到相同元素出现最多的元素。自认为还可以,不过面试官笑着对我说:“加入数组的元素不能排序呢?”。哦,我把数组默认当做int数组了,假如数组是String类型的或者是其他的类型,就不能使用我这种方式了。其实很容易想到一种原创 2017-04-09 12:17:38 · 8783 阅读 · 1 评论 -
《Effective Java》笔记之重写equals时要遵守的通用约定
最近在阅读鼎鼎大名的《Effective Java》,想把一些自己觉得比较经典的内容以笔记形式记录在博客中,这是第一篇,接下来一段时间会持续更新笔记。重写quals方法看起来很简单,但是不正确的重写方式可能会导致错误,并且后果非常严重还不容易找到问题所在。首先,要明白什么时候需要重写equals,什么时候不需要。不需要重写equals的情况: 1。类的每个实例本质上都是唯一的。比如代原创 2017-06-18 20:42:47 · 527 阅读 · 0 评论 -
java多线程设计模式之Immutable Pattern
上一篇讲了Single Thread Execution模式,主要使用了synchronized对某一个代码加锁,防止被多个线程同时访问导致数据出错。这一篇讲下不需要synchronized的情况。因为synchronized是一种开销大的操作,所以能避免使用尽量避免。之前使用它可以避免由于实例的状态被多个线程同时访问修改导致数据出错,那么假设一个实例的状态根本不可以改变,那么即使多个线程访问原创 2016-09-25 12:40:15 · 902 阅读 · 0 评论 -
模仿源码自定义ArrayList
最近看了下ArrayList的源码,抽空根据ArrayList的底层结构写了一个功能简单无泛型的自定义ArrayLsit,帮助自己更好理解ArrayList:,其实现的底层数据结构为数Object组,代码如下: /** * 自己实现一个ArrayList * */public class MyArrayList { private Object[] eleme原创 2016-05-09 13:37:12 · 1392 阅读 · 0 评论 -
调侃《HeadFirst设计模式》之工厂模式(一)
今天我们再次跟随《HeadFirst设计模式》的脚步,原创 2015-04-11 21:23:26 · 2373 阅读 · 0 评论 -
调侃《Head First设计模式》之迭代器和组合模式(一)
现在餐厅来了两个新的厨师A和B,他们各自有各自接受菜单的方式。A的方式接受的是将菜单项放在一个ArrayList当中的菜单,而B则是接受将菜单项放在数组当中的菜单。一个菜单项的类如下: 餐厅的侍女的任务是对顾客需求打印定制的菜单,甚至告诉人们哪一个菜单项是素食。招代规格如下图: 两个厨师接收不同的菜单会导致什么问题呢?如果侍女要打印出原创 2015-05-17 10:56:13 · 887 阅读 · 0 评论 -
调侃《Head First设计模式》之总结篇
在之前的设计模式博客中,主要根据《Head First设计模式》谈了10个设计模式,今天来做下总结,好好梳理提炼x下精华,而且今天准备把GOF经典大作《设计模式》中的23个设计模式都总结一遍。(以下内容参考了程杰的《大话设计模式》) 在GOF的大作中,把23个设计模式做了分类:建造型,结构型,行为型。 建造型的设计模式有:抽象工厂,建造者,工厂方法,原型。原创 2015-06-27 09:38:51 · 6487 阅读 · 0 评论 -
安卓MP3播放器开发实例(1)之音乐列表界面
学习安卓开发有一年了,想想这一年的努力,确实也收获了不少,也找到了比较如意的工作。今天准备分享一个曾经在初学阶段练习的一个项目,通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正规。这个项目是当时借鉴Mars老师的初学视频做的安州手机的MP3播放器,自己又进行了改进,特别在歌词的优化和添加进度条方面的。由于是8个月前做的,水平很初级,bug应该很多,现在自己又懒得再一次改进,只原创 2015-07-11 12:05:49 · 4159 阅读 · 0 评论 -
浅析Java内存分配机制
今日看了网易公开课关于java内存的课程,觉得受益匪浅,虽然算是比较浅显的理论知识,但对于写程序来说还是帮助挺大的,毕竟只有掌握了内存的分配,才可以更好的写出性能高的java程序应用。所以还是决定写出来和各位分享这课程~~ 长话短说,首先来看下整个内存总体模型(直接用笔画方便,不过字不好看= =): 简单说一下,最上方低地址的是一个特殊区域,一般存储静态变量、常量等原创 2016-02-20 13:44:04 · 1456 阅读 · 0 评论 -
安卓开发常见错误原因及解决方法
做安卓开发一年半了,遇到过不少的问题,其中有些花了不少时间才得到解决,有些至今不知为何,也请高人指点迷津,为我拨云见日~~有错误也多多包涵,帮我纠正~~1.更换安卓项目的库文件(即使库文件代码相同),运行工程挂掉。 解决方法:将原来的app卸载再运行 2.R文件丢失:(一般是资源文件有错,特别是clean之后) 原因:res文件夹的xml文件(不仅是l原创 2016-03-22 20:25:06 · 3354 阅读 · 0 评论 -
java实现栈
今天用java的集合实现一个栈的功能,作为熟悉栈数据结构的学习也是不错的,代码如下:/** * 以ArrayList为基本结构实现栈 * @author Administrator * * @param */public class StackUtils { ArrayList dataList; int maxSize; //栈顶指针 -1:空栈 int to原创 2016-04-15 11:59:23 · 684 阅读 · 0 评论 -
java实现双向链表
双向链表是一个基本的数据结构,在java中LinkedList已经实现了这种结构,不过作为开发者,也要拥有自己显示这种结构的能力。话不多说,上代码: 首先是链表的节点类:/** * 链表节点 * @author Administrator * * @param */public class ChainNode { private T data; //对象编号 priv原创 2016-04-15 12:22:46 · 768 阅读 · 0 评论 -
模仿源码自定义HashMap
HashMap的实现原理简单来说是通过数组加链表实现的,结合数组查找和链表插入删除效率高,使得HashMap在数据处理方面高效。链表元素是键值对数据,数组元素为链表(源码中为链表的第一个键值对元素),同一个链表的元素是键值哈希值对数组长度取余结果相同的键值对,而它们的键值哈希码对数组长度取余结果恰好作为数组的下标,查找更为方便。详细的实现可参考这篇文章:http://blog.csdn.n原创 2016-05-10 21:07:34 · 1072 阅读 · 0 评论 -
通过反射实现的仿ButterKnife功能Demo
用过ButterKnife的朋友都知道,ButterKnife可以使用@BindView和@OnClick等注解就可以省略掉繁琐的findViewById和setOnClickListener等代码,使得业务代码更加简洁清晰。对ButterKnife不熟悉的朋友可以看下:(http://jakewharton.github.io/butterknife/)在参考过一些资料过后,我也模仿地写了一个通过原创 2017-11-18 15:19:04 · 541 阅读 · 0 评论