技术文章
2016-12-28 13:55
问题
在开发模式上,web 的方式是比较先进的,有各种优点,包括跨平台/UI开发效率高,最重要的是可以时刻保证用户看到的程序是最新的,没有版本概念,整个系统时刻保持在掌握之中,而客户端开发模式相对 web 开发是一种倒退,客户端做不到这样的动态化,无法随时更新,目前一个客户端程序要更新成本是很高的,需要发布版本,也无法保证所有人都能更新到这个版本,这是最大的弱点,也是非常大的一块需求。
原因
为什么会有这种倒退,最主要原因是:苹果引领的体验优先规则。
在 iPhone 出现之前大家并不太在意一个软件的动画体验,一个 web 应用是很少有动画的,点一个按钮,一整块内容直接刷新,再点个链接整个页面变白刷新,PC上网页滚动都是一格格滚动的,而不是现在手机上那种顺滑流畅的滚动,PC客户端软件也一样,大家都觉得没什么问题,用得挺好,但苹果改变了这种情况,iPhone 刚推出时页面间切换的动画,60fps 的丝滑滚动,点击的即时响应,微软的人都惊呼是黑魔法,让人用了就上瘾,再也回不去,而 web 的方式还不足以像原生客户端那样支持这样的流畅性,做不到好的体验,无法被人接受,开发上优势再多也无法干过客户端,参考 facebook 初期用 web 技术构建 app 的惨状,没办法,服了苹果,大家只能按照苹果的方式干,做原生客户端。
...
2016-12-26 13:58
今天遇到一个小问题,让我感觉Java的泛型(因为背负了历史的包袱导致的)有点鸡肋啊。
我们经常会遇到要一些自定义的key-value字符串,比如:
"key1:1k;key2:2;key3:3"
通常编码的时候会将它转换为一个Map这样方便操作,因为key和value的类型不一定(可能是int也可能是String等),于是我用Java写了一个简单的泛型方法:
@SuppressWarnings("unchecked")
public static Map getMap(String source, String firstSplit, String secondSplit) {
...
2016-12-26 13:51
我们之前使用类创造新的类型(type),并使用继承来便利我们创建类的过程。我将在这一讲中深入类型,并介绍多态(polymorphism)的概念。
类型检查
Java的任意变量和引用经过类型声明(type declaration),才能使用。我们之前见过对象数据、类数据、方法参数、方法返回值以及方法内部的自动变量,它们都需要声明其类型。Java是一种强类型(strongly typing)语言,它会对类型进行检查。如果我们错误的使用类型,将造成错误。
类型不符,卖萌无效
比如在下面的Test类中,我们将一个Cup类对象赋予给aPerson类引用:
...
2016-12-25 13:40
一、 static代表着什么
在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块。
Java把内存分为栈内存和堆内存,其中栈内存用来存放一些基本类型的变量、数组和对象的引用,堆内存主要存放一些对象。在JVM加载一个类的时候,若该类存在static修饰的成员变量和成员方法,则会为这些成员变量和成员方法在固定的位置开辟一个固定大小的内存区域,有了这些“固定”的特性,那么JVM就可以非常方便地访问他们。同时如果静态的成员变量和成员方法不出作用域的话,它们的句柄都会保持不变。同时static所蕴含“静态”的概念表示着它是不可恢复的,即在那个地方,你修改了,他是不会变回原样的,你清理了,他就不会回来了。
...
2016-12-25 13:41
观察者模式 Observer
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
这个主题对象在状态上发生变化时,会通知所有观察者对象,让它们能够自动更新自己。
观察者模式的组成
抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
...
2016-12-25 13:36
一、代理的概念
动态代理技术是整个java技术中最重要的一个技术,它是学习java框架的基础,不会动态代理技术,那么在学习spring这些框架时是学不明白的。
动态代理技术就是用来产生一个对象的代理对象的。在开发中为什么需要为一个对象产生代理对象呢?
举一个现实生活中的例子:歌星或者明星都有一个自己的经纪人,这个经纪人就是他们的代理人,当我们需要找明星表演时,不能直接找到该明星,只能是找明星的代理人。比如刘德华在现实生活中非常有名,会唱歌,会跳舞,会拍戏,刘德华在没有出名之前,我们可以直接找他唱歌,跳舞,拍戏,刘德华出名之后,他干的第一件事就是找一个经纪人,这个经纪人就是刘德华的代理人(代理),当我们需要找刘德华表演时,不能直接找到刘德华了(刘德华说,你找我代理人商谈具体事宜吧!),只能是找刘德华的代理人,因此刘德华这个代理人存在的价值就是拦截我们对刘德华的直接访问!
...
2016-12-24 16:27
在Stormpath(一款用户管理和认证服务),我们认真对待质量和效率。任何一个优秀的工匠,仅仅拥有天赋是不够的,你在工作中还需要正确的工具。工程学不仅仅是科学,更是艺术。所以,在Stormpath,尽管我们拥有天赋,我们仍不断寻找所需的有用的工具。我们的工程师一直渴望向团队其他人分享新工具。现在,让我们向所有充满天赋的Java开发者推荐工具。
在这篇文章中,我将分享我们Java团队日常工作使用的工具,并介绍如何使用它们,分享一些实用的小技巧。
1.Groovy
我们使用Groovy来写Java测试。为什么?因为它提供了下面这些能力:
...
2016-12-24 16:03
1、concat() 连接两个或更多的数组
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
例如:
1
输出结果:
1,2,3,4,5,11,22,33
...
2016-12-23 13:01
Java有5种创建对象的方式,下面我用这个Employee类创建对象:
package com.example.string.Object;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Constructor;
...
2016-12-23 13:31
1 I/O处理比较花费时间,故把执行I/O处理和非IO处理的线程分开。CPU执行速度很快、而内存的写入、读取很慢,所以有关CPU和内存交互会降低指令的速度。
2 start方法运行有2个步骤
启动新的线程
运行new对象的run方法
3 所有线程结束,程序结束。 主线程可以先结束,但并不表示程序结束。
4 一个线程已经获得锁定,其他线程都不能执行该实例的synchronized方法。
5 wait set 线程休息区,当线程调用wait()方法时,线程自动进入wait set 区等待,直到被唤醒。
...
2016-12-23 13:03
一:Notification的简介==
Notification是显示在手机状态栏的通知,手机状态栏位于手机屏幕的最上方,那里一般
显示了手机当前的网络状态,电池状态,时间等。
Notification所代表的是一种具有全局效果的通知,程序一般通过NotificationManager服务来发送Notification.Android3.0增加Notification.Builder类,通过该类允许开发者更轻松地创建Notification对象。
...
2016-12-20 13:09
1:字符串与字符数组之间的转换:
字符串转为字符数组: public char[] toCharArray()
字符数组转为字符串: public String(char[] value)
public String(char[] value,int offset, int count)
例:
public class Test0 {
/**
* @param args
*/
public static void main(String[] args) {
String str1 = "Hello";
...
2016-12-20 13:09
测试是开发的一个非常重要的方面,可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题,但较差的测试往往总是导致故障和停机。
虽然有三种主要类型的软件测试:单元测试,功能测试和集成测试,但是在这篇博文中,我们将讨论开发人员级单元测试。在我深入讲述具体细节之前,让我们先来回顾一下这三种测试的详细内容。
软件开发测试的类型
单元测试用于测试各个代码组件,并确保代码按照预期的方式工作。单元测试由开发人员编写和执行。大多数情况下,使用JUnit或TestNG之类的测试框架。测试用例通常是在方法级别写入并通过自动化执行。
...
2016-12-20 13:40
两个线程一个生产者个一个消费者
需求情景
两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个
涉及问题
同步问题:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用标记或加锁机制
wait() / nofity() 方法是基类Object的两个方法,也就意味着所有Java类都会拥有这两个方法,这样,我们就可以为任何对象实现同步机制。
wait()方法:当缓冲区已满/空时,生产者/消费者线程停止自己的执行,放弃锁,使自己处于等等状态,让其他线程执行。
notify()方法:当生产者/消费者向缓冲区放入/取出一个产品时,向其他等待的线程发出可执行的通知,同时放弃锁,使自己处于等待状态。
...
2016-12-19 13:02
[java] view plain copy print?
01.package poi;
02.import java.io.FileInputStream;
03.import java.io.IOException;
04.import java.io.InputStream;
05.import java.util.Iterator;
06.import org.apache.poi.hssf.usermodel.HSSFCell;
07.import org.apache.poi.hssf.usermodel.HSSFWorkbook;
...