Java枚举:小小enum,优雅而干净

《Java编程思想》中有这么一句话:“有时恰恰因为它,你才能够‘优雅而干净’地解决问题”——这句话说的是谁呢?就是本篇的主角——枚举(Enum)——大家鼓掌了。在之前很长时间一段时间里,我都不怎么用枚举,因为总感觉它没什么用处——这其实就是“自我认知”的短见。当一个人一直蹲在自己的深井里而不敢跳出来的话,那他真的只能看到井口那么大点的天空。随着时间的推移,我做的项目越来越多,和枚举见面的机会也越来越多,于是我就渐渐地对它越来越有兴趣,研究得多了,才发现原来枚举如此的优秀。1)枚举的常规用法一个精简的枚举非常的干净优雅,见下例。public enum Chenmo {    WANGER, WANGSAN, WANGSI}我们为沉默枚举创建了三个值,分别是王二、王三、王四。这段代码实际上调用了3次Enum(Stringname,int...

“挑三拣四”地学一学Java I/O

对于JavaI/O来说,I意味着Input(输入),O意味着Output(输出)。读书写作并非易事,而创建一个好的I/O系统更是一项艰难的任务。古人云:“读书破万卷,下笔如有神”。也就是说,只有大量的阅读,写作的时候才能风生水起——写作意味着输出(我的知识传播给他人),而读书意味着输入(从他人的知识中汲取营养)。01、数据流之字节与字符Java所有的I/O机制都是基于数据流进行的输入输出。数据流可分为两种:1)字节流,未经加工的原始二进制数据,最小的数据单元是字节。2)字符流,经过一定编码处理后符合某种格式规定的数据,最小的数据单元是字符——占用两个字节。OutputStream和InputStream用来处理字节流;Writer和Reader用来处理字符流;OutputStreamWriter可以把OutputStream转换为Writer,InputStreamReader可以把InputStream转换为Reader。Java的设计者为此设计了众多的类,见下图。看到这么多类,你一定感觉头晕目眩。反正我已经看得...

深入浅出一下Java的HashMap

在平常的开发当中,HashMap是我最常用的Map类(没有之一),它支持null键和null值,是绝大部分利用键值对存取场景的首选。需要切记的一点是——HashMap不是线程安全的数据结构,所以不要在多线程场景中应用它。通常情况下,我们使用Map的主要目的是用来放入(put)、访问(get)或者删除(remove),而对顺序没有特别的要求——HashMap在这种情况下就是最好的选择。01、Hash对于HashMap来说,难理解的不在于Map,而在于Hash。Hash,一般译作“散列”,也有直接音译为“哈希”的,这玩意什么意思呢?就是把任意长度的数据通过一种算法映射到固定长度的域上(散列值)。再直观一点,就是对一串数据wang进行杂糅,输出另外一段固定长度的数据er——作为数据wang的特征。我们通常用一串指纹来映射某一个人,别小瞧手指头那么大点的指纹,在你所处的范围内很难找出第二个和你相同的(人的散列算法也好厉害,有没有?)。对于任意两个不同的数据块,其散列值相同的可...

Java中食之无味弃之可惜的数组

Java泛型出现之前,只有数组可以用来存储指定类型的对象;在自动装箱机制出现之前,只有数组可以用来存储基本数据类型;也就是说,在泛型和自动装箱机制出现之前,数组在Java当中的分量举足轻重。况且数组还是一种效率最高的存储和随机访问对象序列的方式,但遗憾的是,数组的长度是固定的——举个例子,创建它的时候指定长度是6,就只能存储6个元素,当你想放第7个元素时,是无法做到的。随着计算机硬件能力的提升,开发人员在存储一组数据的时候更愿意使用ArrayList而不是数组。尽管ArrayList内部是通过数组实现的,但与数组相比,它的容量能够自动增长,还有很多数组没有的特性。能不使用数组就别使用数组,除非要用数组来改善性能问题。01、创建数组让我们来给Java数组下一个明确的定义——数组用来存储固定长度的同类型元素。示例如下:int[]ints=newint[3];ints[0]=1;ints[1]=2;ints[2]=3;intints1[]=newint[3];int[]ints2={1,2,3};int[]ints相较于intints1[]是...

Java泛型的重要目的:别让猫别站在狗队里

Java编程思想》第四版足足用了75页来讲泛型——厚厚的一沓内容,很容易让人头大——但其实根本不用这么多,只需要一句话:我是一个泛型队列,狗可以站进来,猫也可以站进来,但最好不要既站猫,又站狗!01、泛型是什么泛型,有人拆解这个词为“参数化类型”。这种拆解其实也不好理解,还是按照沉默王二的意思来理解一下吧。现在有一只玻璃杯,你可以让它盛一杯白开水,也可以盛一杯二锅头——泛型的概念就在于此,制造这只杯子的时候没必要在说明书上定义死,指明它只能盛白开水而不能盛二锅头!可以在说明书上指明它用来盛装液体,但最好也不要这样,弄不好用户想用它来盛几块冰糖呢!这么一说,你是不是感觉不那么抽象了?泛型其实就是在定义类、接口、方法的时候不局限地指定某一种特定类型,而让类、接口、方法的调用者来决定具体使用哪一种类型的参数。就好比,玻璃杯的制造者说,我不知道使用者用这只玻璃杯来干嘛,所以我只负责造这么一只杯子;玻璃杯的使用者说,这就对了,我来决定这只玻璃杯是盛白开水还是二锅头,或者冰糖。02、什么时候用泛型我们...

Java如何在运行时识别类型信息?

Java中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为RTTI,英文全称为Run-TimeTypeIdentification,即运行时类型识别,有没有一点“知行合一”的味道?运行时类型识别主要由Class类实现。在日常的学习工作当中,有一些知识是我们在读书的时候就能够习得;但有一些知识不是的,需要在实践的时候才能得到真知——这或许就是王阳明提倡的“知行合一”。01、Class类在Java中,我们常用“class”(首字母为小写的c)关键字来定义一个类,说这个类是对某一类对象的抽象。你比如说王二是一个网络知名作者,我们可以这样简单地定义作者类:package com.cmower.java_demo.fifteen;class Author {    private String pen_name;    priv...

Java String:重要到别人只能当老二的字符串类

字符串,是Java中最重要的类。这句肯定的推断不是Java之父詹姆斯·高斯林说的,而是沉默王二说的,因此你不必怀疑它的准确性。关于字符串,有很多的面试题,但我总觉得理论知识绕来绕去没多大意思。你比如说:Stringcmower=newString("沉默王二");定义了几个对象?我总觉得问我这样的问题,就好像是在拷问我:“既然你家买了冰箱,你难道不应该知道冰箱制冷的原理?”再说,为什么要用Stringcmower=newString("沉默王二");而不是Stringcmower="沉默王二";?我劝各位面试官不要再缠住这样的问题不放了,切记“学以致用”。理论知识如果一直是在绕弯弯,那真的毫无价值。如果要我来做面试官,我想要问的问题是:“你平常是怎么判断两个字符串相等的?是用equals()还是==?”前言就说这么多。接下来,我们来探讨几个实用的知识点。01字符串是不可变的我们来看一下String类的定义:public final class String &n...

Java异常处理:给程序罩一层保险

本着负责任的态度,我们程序员在写代码的时候,都非常的严谨。但程序在运行的时候,往往会出现一些令人意想不到的错误,导致那些不被期望的事件发生,最终,程序没有按照我们的预期正常地执行下去——异常发生了,是任程序自生自灭,还是将错误输出给用户?Java为此提供的解决方案是——异常处理机制。异常处理机制能够让程序在异常发生时,按照代码预先设定的异常处理规则,针对性地处理异常——要么恢复到程序一开始的样子,要么停止运行把详细的错误信息抛出来,让我们程序员知道哪里出了错,然后做出对应的优化。人这一生,总会遇到一些不可预料的麻烦,这些麻烦可能会让我们遭受沉重的打击。为了减轻因此承受的负担,我们就会买保险。异常处理机制在一定程度上保证了程序的健壮性,就好像给程序罩了一层保险。01、异常的分类在Java中,异常被称为Throwable,可分为Error和Exception(英文直译为例外,但通常被称为真的‘异常’)。Error:代表了Java虚拟机(JavaVirtualMachine)本身的错误,不能通过代...

Java集合类的那点通俗的认知

开门见山地说吧,Java提供了一套完整的集合类(也可以叫做容器类)来管理一组长度可变的对象(也就是集合的元素),其中常见的类型包括List、Set、Queue和Map。从我个人的编程经验来看,List的实现类ArrayList和Map的实现类HashMap使用频率最高,其它实现类只能望其项背了。List、Set和Queue都是Collection的子接口,但各有各的好。List按照插入的顺序保存元素,Set不会有重复的元素,Queue通常(但并非一定)以FIFO(先进先出)的方式排序各个元素。Map与Collection最大的不同就在于,它是一组“键值对”,可以快速地通过键来查找值;Collection是没有键的,因此需要按照某种规则来查找值(这里说的值就是元素)。怎么使用集合类呢?示例如下:public class Wanger {    public static void main(String[] args) {  ...

Java的内部类真的那么难以理解?

01前言昨天晚上,我把车停好以后就回家了。回家后才发现手机落在车里面了,但外面太冷,冷到骨头都能感受到寒意——实在是不想返回一趟去取了(小区的安保还不错,不用担心被砸车玻璃),于是打定主意过几个小时的“世外桃源”生活——别人找不到我,我也找不到别人,这种与世隔绝的状态非常适合读书写作。把厚厚的《Java编程思想》摆在桌子上,正襟危坐,认认真真地读起了第十章——内部类。尽管我已经非常耐心和用心了,但内部类的这一章非常的枯燥,并且难以理解,我整个人几乎处于崩溃的边缘。很早之前,有想要转行学习Java的朋友咨询我,有哪方面的书可以推荐,我郑重其事地介绍了《Java编程思想》,并且一再叮嘱他这是一本Java入门级的经典书,必须耐着性子读完它。现在想想,自己当时的推荐真是轻率!我这样说,并不是为了否认《Java编程思想》这本书的价值,因为站在书本的角度,它可能会感慨说:这王二的学习能力有问题啊,读我竟然这么困难!不是有那样一句话嘛:“如果你手里有一把锤子,所有东西看上去都像钉子。&rdqu...

Java接口的实例应用:致敬我的偶像——何塞·穆里尼奥

文/沉默王二 曹操在《短歌行》中为杜康酒打过一个价值一亿个亿的广告——“何以解忧,唯有杜康”,我替曹操感到惋惜的是他本人并不会收到这笔不菲的代言费。想一想,要是三国时期的明星人物们有这个代言意识的话,保证各家的军费收入会多出来一个重量级的来源。不过,酒真的能解忧吗?我不大敢相信。李白就曾质疑过:“举杯消愁愁更愁,抽刀断水水更流。”我和李白持相同的观点,酒啊,真的不容易解忧,但绝对可以增加作者莫名的写作冲动。我在写本文之前就小酌了一杯,一不小心激发了我强烈的创作欲望。不过我要奉劝各位,寒冬之际,如果遇到烦心事,千万别肆意地追求一醉方休,万事要懂得适可而止。01抽象类一种比较苍白的说法是:在Java中,通过关键字abstract定义的类叫做抽象类。Java是一门面向对象的语言,因此所有的对象都是通过类来描述的;但反过来,并不是所有的类都是用来描述对象的,抽象类就是其中的一种。以下示例展示了一个简单的抽象类:// 个人认为,一名教练必须攻守兼备abstract class Coac...

Java:多态乃幸福本源

01多态是什么在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变;一个二郎神,也能七十二变;他们都可以变成不同的形态,但只需要悄悄地喊一声“变”。Java的多态是什么呢?其实就是一种能力——同一个行为具有不同的表现形式;换句话说就是,执行一段代码,Java在运行时能根据对象的不同产生不同的结果。和孙悟空和二郎神都只需要喊一声“变”,然后就变了,并且每次变得还不一样;一个道理。多态的前提条件有三个:子类继承父类子类覆盖父类的方法父类引用指向子类对象多态的一个简单应用,来看程序清单1-1://子类继承父类publicclassWangxiaoerextendsWanger{publicvoidwrite(){//子类覆盖父类方法System.out.println("记住仇恨,表明我们要奋发图强的心智");}publicstaticvoidmain(String[]args){//父类引用指向子类对象Wanger[]wangers={ne...

Java代码复用的三种常用方式:继承、组合和代理

复用代码是Java众多引人注目的功能之一。这句话很通顺,没什么问题,但问题在于很多人并不清楚“复用”是什么。就好像我说“沉默王二是一个不止会写代码的程序员”,唉,沉默王二是谁?我们需要来给“复用”下一个定义。复用,说白了就是重复使用。举个例子,很多名人说了很多名言,我们在说话、写作的时候,就经常有意无意的重复这些名言。比如说我,就特别喜欢重复使用王小波的那句名言:“从话语中,你很少能学到人性,从沉默中却能。假如还想学得更多,那就要继续一声不吭。”上面这个例子,只能说是“复用”的一种低级的应用,其实就是复制粘贴了。还有高级的复用方式吗?有,当然有。Java作为一种优秀的面向对象设计的语言,在复用的应用上就高级得多了。01继承最常见的复用方法就是继承——使用extends关键字在基类的基础上创建新类,新类可以直接复用基类的非private的属性和方法;就像程序清单1-1那样。程序清单1-1:public class Wangxi...

微信JSSDK javascript 开发 代码片段,仅供参考

最全面最专业的微信公众平台开发教程:http://www.cnblogs.com/txw1958/p/weixin-js-sdk-demo.html比较完整的分享教程:http://www.cnblogs.com/leinov/p/5256879.htmlajax调用服务器接口:functionGetWeiXinJsapiConfig(){varurl=encodeURIComponent(location.href.split('#')[0]);alert('urlis'+url);$.ajax({type:"POST",url:"/XXX/GetWeiXinJsapiConfig",data:"{'curUrl':'"+url+"'}",contentType:"application/json;charset=utf-8",dataType:"json",success:function(data){console.log(data.d);varconfigData=$.parseJSON(data.d);console.log('sigis'+configData.signat...

javascript 工具函数

转义特殊字符为html实体HtmlEncode:function(str){returnstr.replace(/&/g,'&amp;').replace(/"/g,'&quot;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/'/g,'&apos;');}验证是否为有效的手机电话号码IsMobile:function(str){varrp=/^1[3|4|5|7|8][0-9]d{4,8}$/;returnrp.test(str);}验证是否为有效的座机电话号码IsTel:function(str){varrp=/^([0-9]{3,4}-)?[0-9]{7,8}$/;returnrp.test(str);}清除左空格/右空格Ltrim:function(str){returnstr.replace(/^(s*| *)/,"");},Rtrim:function(str){returnstr.replace(/(s*| *)$/,"");}清除左右空格Trim:fu...
首页上一页...567568569570571...下一页尾页