java

JAVA中正确使用的单例模式常用写法(6种写法)

星期六, 十一月 4th, 2017 | JAVA-and-J2EE | 没有评论

单例模式 老生常谈的一种模式,也是实际项目代码中比较常用的一种模式了.

文中做了6种方法,实际用的最多的也就 4.5两种,其实6是最完美的但是感觉别捏呢,不像个类,用的也并不多.

1.懒汉式,线程不安全

public class Singleton {
    private static Singleton instance;
    private Singleton (){}
    public static Singleton getInstance() {
     if (instance == null) {
         instance = new Singleton();
     }
     return instance;
    }
}

2.懒汉式,线程安全 (BUT.效率差)

public static synchronized Singleton getInstance() {
    if (instance == null) {
        instance = new Singleton();
    }
    return instance;
}

3.双重检验锁

public static Singleton getSingleton() {
    if (instance == null) {                         //Single Checked
        synchronized (Singleton.class) {
            if (instance == null) {                 //Double Checked
                instance = new Singleton();       //非原子操作
            }
        }
    }
    return instance ;
}

问题:new Singleton非原子操作
1.给 instance 分配内存
2.调用Singleton 的构造函数来初始化成员变量
3.将instance对象指向分配的内存空间(执行完这步 instance 就为非 null 了)

解决办法 JDK1.5以前的版本会有问题, JDK1.5后用volatile关键字(立即可见及禁止指令重排序优化)来修饰变量.通过DCL(double checked locking)实现同步

public class Singleton {
    private volatile static Singleton instance; //这里为 volatile
    private Singleton (){}
    public static Singleton getSingleton() {
        if (instance == null) {                         
            synchronized (Singleton.class) {
                if (instance == null) {       
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }  
}

上面三种的写法基本上在项目中没有什么实用价值,下面的三种才是比较常用的

› Continue reading

Tags: ,

理解java里一年中第多少周的定义

星期三, 十一月 23rd, 2016 | JAVA-and-J2EE | 没有评论

应用里需要按照周来定义工作量,用到一年的第多少周,如下定义:
美式:(java默认的方式)
1.以周日为一周的开始 (周日到周六)

2.以每年的1月1日为当年的 第一周

在国内还是比较习惯 以
1.周一 为一周的开始 即 (周一,周二,周三,周四,周五,周六,周日)

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public static void getWeek() {
	String today = "2016-12-31";  
	SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
	Date date = null;  
	try {  
	date = format.parse(today);  
	} catch (Exception e) {  
	 e.printStackTrace();  
	}    
	Calendar calendar = Calendar.getInstance();  
	//calendar.setFirstDayOfWeek(Calendar.MONDAY);  
	calendar.setTime(date); 
 
	System.out.println(calendar.get(Calendar.WEEK_OF_YEAR));  
}

输入结果:默认 为 2016年的 第53周,

如果以周一为一周的开始,则归入2017年的第1周.(因为2017年1月1日 为周日好巧呢.)

Tags:

java 压缩文件夹成zip格式

星期五, 十一月 18th, 2016 | JAVA-and-J2EE | 没有评论

想用java 自动打包文件,由此来的此代码
› Continue reading

Tags: ,

java捕获kill信号来处理程序信息

星期五, 五月 29th, 2015 | JAVA-and-J2EE, linux | 一条评论

在c中常要控制对应的信号信息,在java中也可以实现简单的信号捕获;
可以作为程序的关闭时候清理数据做参考,
程序如下:
› Continue reading

Tags: ,

双hash减少用户名冲突JAVA版

星期五, 五月 8th, 2015 | JAVA-and-J2EE, 游戏开发 | 没有评论

游戏中要去校验用户名是否重复,redis中放中文的key貌似蛮怪的吧,还是hash后放数字吧,从而校验是否冲突;

hash冲突 例如“Af”和“BG”哈希值相同,则有“AfAf”,“AfBG”,“BGAf”,“BGBG”的哈希值也相同

具体关于java的Hash冲突攻击 可以参考此文章:http://keary.cn/?p=845

不废话了,实际双hash用途很多,还有就是java中的自带hash会出现负数比如 (-8%3) 就为-2 依赖取模后的值就会出问题;

上代码:
› Continue reading

Tags: ,

java中byte转换的注意事项

星期六, 一月 19th, 2013 | JAVA-and-J2EE | 没有评论

1
2
3
4
5
6
7
8
9
10
11
public static String bytes2HexString(byte[] b) {
   String ret = "";
   for (int i = 0; i < b.length; i++) {
	String hex = Integer.toHexString(b[i] & 0xFF);
	if (hex.length() == 1) {
		hex = '0' + hex;
		}
	ret += hex.toUpperCase();
	}
        return ret;
	}

上面是将byte[]转化十六进制的字符串,注意这里b[ i ] & 0xFF将一个byte和 0xFF进行了与运算,然后使用Integer.toHexString取得了十六进制字符串,可以看出
b[ i ] & 0xFF运算后得出的仍然是个int,那么为何要和 0xFF进行与运算呢?直接 Integer.toHexString(b[ i ]);,将byte强转为int不行吗?答案是不行的.

其原因在于:
1.byte的大小为8bits而int的大小为32bits
2.java的二进制采用的是补码形式

在这里先温习下计算机基础理论
› Continue reading

Tags: ,

通过dns解析获取域名的ip地址

星期二, 十二月 4th, 2012 | JAVA-and-J2EE | 没有评论

可以通过域名获取域名解析的ip地址,java版本,通过java的本地dns解析,如果本地设置了host的解析地址将会和真实ip地址有出入:

获取www.qq.com的ip地址如下:
ipv4:222.73.78.166
ipv4:222.73.78.171
ipv4:222.73.78.181
ipv4:101.226.42.62
ipv4:101.226.49.101
ipv4:115.236.139.153
ipv4:180.153.210.43

code如下:
› Continue reading

Tags: ,

java生成唯一ID,相对唯一(15位和32位)的简单实现

星期三, 八月 8th, 2012 | algorithm-learn, JAVA-and-J2EE | 没有评论

好久没有写文章了,在oschina上看到的,感觉挺不错,摘录代码如下:
实际上更多的是根据自己的需求去实现一种不重复的主键,这里只要提供思路,以供借鉴之用.
32位生成方式
› Continue reading

Tags: , ,

java中需要转义的正则表达式符号

星期日, 二月 12th, 2012 | JAVA-and-J2EE | 没有评论

special sign 注释 $ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,那么 $ 还匹配 \n
或 \r 前面的位置。若要匹配 $ 字符本身,请使用 \$。

( ) 标记子表达式的开始和结束。可以捕获子表达式以供以后使用。若要匹配这两个字符,请使用 \( 和 \)。

零次或多次匹配前面的字符或子表达式。若要匹配 * 字符,请使用 \*。

+ 一次或多次匹配前面的字符或子表达式。若要匹配 + 字符,请使用 \+。

. 匹配除换行符 \n 之外的任何单个字符。若要匹配 .,请使用 \。 [ ] 标记中括号表达式的开始。若要匹配这些字符,请使用 \[ 和 \]。

? 零次或一次匹配前面的字符或子表达式,或指示“非贪心”限定符。若要匹配 ? 字符,请使用 \?。

\ 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,字符 n 匹配字符 n。\n 匹配换行符。序列 \\ 匹配 \,序列 \( 匹配
(。

/ 表示文本正则表达式的开始或结束。若要匹配 / 字符,请使用 \/。

^ 匹配输入字符串开始处的位置,但在中括号表达式中使用的情况除外,在那种情况下它对字符集求反。若要匹配 ^ 字符本身,请使用 \^。

{ } 标记限定符表达式的开始。若要匹配这些字符,请使用 \{ 和 \}。

| 指出在两个项之间进行选择。若要匹配 | ,请使用 \|

Tags: , ,

回文判断和是否包含回文的计算(java版本)

星期日, 一月 15th, 2012 | JAVA-and-J2EE | 没有评论

这个是java版的计算回文的几种方式,基本上都算是比较高效的实现,
测试的最后的一个是判断一个字符串中是否位置重排后可以抽出回文的字符串来,当然字符串的长度和字数都不能有变,只是顺序随便排下而已:
这个是想到的快速的一种判断,还有一个是比较慢的就不贴了,如果你有更好的方法,希望回帖告知,也学习学习,源代码如下:
› Continue reading

Tags: , ,

Search

文章分类

Meta