当前位置:首页 > 基本用法

Java中的Map有哪些实现类

Java中java.util.Map接口有4个实现类java.util.HashMa,只允许一个元素的键为null,不支持线程同步,访问速度快。java.util.Hashtabl,不允许一个元...阅读全文

Java中的List排序

假设有如下list
List<Integer> list = new ArrayList<Integer>();
list.add(50);
list.add(23);
list.add(42);
list.add(16);
list.add(87);
list.add(5);
list.add(37);
使用默认比较器排序:
Collections.sort(list);
//此时list的内容为[5, 16, 23, 37, 42, 50, 87]
也可以自定义比较器如下,实现降序。
class TestComparator implements Comparator{

	@Override
	public int compare(Object arg0, Object arg1) {

		int value1 = ((Integer)arg0).intValue();
		int value2 = ((Integer)arg1).intValue();
		return (value2 - value1);
	}
}
如果使用上述自定义比较器,完成排序:
Collections.sort(list, new TestComparator());
//此时list的内容为[87, 50, 42, 37, 23, 16, 5]
比较器的实现和调用也可以合并写为如下形式,结果与上述方式相同。
Collections.sort(list, new Comparator(){
	public int compare(Object arg0, Object arg1) {

		int value1 = ((Integer)arg0).intValue();
		int value2 = ((Integer)arg1).intValue();

		return (value2 - value1);
	}
});
阅读全文

Java中使用MD5加密

MD5是Message-Digest Algorithm 5的缩写,通过不可逆算法,可将任意长度的字节串变换为128位的大整数。不可逆算法意味着,即使拿到加密之后的结果,也无法还原为加密前的字符串。因...阅读全文

Java中处理数字时如何防止溢出

当数值过大时会发生溢出,比如计算阶乘
static long getFactorial(long n)
{
	if(0 == n)
	{
		return 1;
	}

	return n * getFactorial(n-1);
}

public static void main(String[] args) {

	for(int i=18;i<24;i++)
	{
		System.out.println(String.format("number=%d,factorial=%d", i, getFactorial(i)));			
	}
}

//结果为:
//number=18,factorial=6402373705728000
//number=19,factorial=121645100408832000
//number=20,factorial=2432902008176640000
//number=21,factorial=-4249290049419214848
//number=22,factorial=-1250660718674968576
//number=23,factorial=8128291617894825984
//显然结果应该递增,而且不应该出现负数。
当数值为小数时,也可能发生溢出,比如:
double result = 12.3/100;
System.out.println(result);
//结果为0.12300000000000001
使用BigInteger可以精确表示任意大小的整数值,比如计算阶乘:
static BigInteger getFactorial(BigInteger n)
{
	if(0 == n.intValue())
	{
		return new BigInteger("1");
	}

	return n.multiply(getFactorial(new BigInteger(new Integer(n.intValue()-1).toString()))) ;
}

public static void main(String[] args) {
	for(int i=18;i<24;i++)
	{
		BigInteger n = new BigInteger(new Integer(i).toString());
		System.out.println(String.format("number=%d,factorial=%d", i, getFactorial(n)));			
	}		
}

//结果为:
//number=18,factorial=6402373705728000
//number=19,factorial=121645100408832000
//number=20,factorial=2432902008176640000
//number=21,factorial=51090942171709440000
//number=22,factorial=1124000727777607680000
//number=23,factorial=25852016738884976640000
使用BigDecimal可以精确表示小数值,比如:
BigDecimal bNumber = new BigDecimal(Double.toString(12.3));
BigDecimal bResult = bNumber.divide(new BigDecimal(Double.toString(100)));
System.out.println(bResult);
//结果为0.123
当除不尽时,BigDecimal可以控制结果的精度,例如:
BigDecimal bNumber = new BigDecimal(Double.toString(100));
BigDecimal bResult = bNumber.divide(new BigDecimal(Double.toString(3)), 5, BigDecimal.ROUND_HALF_UP);//5表示保留小数点后5位,BigDecimal.ROUND_HALF_UP表示四舍五入。
System.out.println(bResult);
//结果为33.33333
注意:BigInteger和BigDecimal都是不可变(immutable)的,因此每次计算都要新创建(new)一个对象,于是开销较大,尤其是大量数学计算时。
阅读全文

Java中使用Random生成随机数

使用java.util.Random可以灵活地生成int、long、float、double和Goussian等各种类型的随机数。生成整型随机数
Random rd = new Random();
for(int i = 0;i < 10;i++)
{
	int iRandomValue = rd.nextInt();
	System.out.println(iRandomValue);
}
结果为
-12478480
-821599983
-217983170
1353684127
553752142
-596993665
592971560
953714579
108936639
221481094
生成0-100范围内的整型随机数
Random rd = new Random();
for(int i = 0;i < 10;i++)
{
	int iRandomValue = rd.nextInt(100);
	System.out.println(iRandomValue);
}
结果为
22
82
93
73
74
21
99
22
63
12
Random rd = new Random(100);
for(int i = 0;i < 10;i++)
{
	int iRandomValue = rd.nextInt(50);
	System.out.println(iRandomValue);
}
结果为
15
0
24
38
41
16
36
38
23
13
生成50-100范围内的整型随机数...
阅读全文

Java中的文件读写及创建删除

读文件,以UTF-8为例。
String fileName = "H:\\test.txt";
BufferedReader reader = null;
try {
	reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8"));
	String lineString = null;
	while ((lineString = reader.readLine()) != null) {
		System.out.println(lineString);
	}
	reader.close();
} catch (IOException e) {
	e.printStackTrace();
} finally {
	if (reader != null) {
		try {
			reader.close();
		} catch (IOException e1) {
		}
	}
}
创建文件,以UTF-8为例。
String fileName = "H:\\test.txt";
String strText="aaa";

FileOutputStream fos = null;
OutputStreamWriter osw = null;
try {
	fos = new FileOutputStream(fileName);
	osw = new OutputStreamWriter(fos, UTF-8");
	osw.write(strText); 
	osw.flush();
}catch (FileNotFoundException e1) {
	e1.printStackTrace();
} catch (UnsupportedEncodingException e) {
	e.printStackTrace();
} 
catch (IOException e) {
	e.printStackTrace();
}
finally{
	try {
		fos.close();
	} catch (IOException e1) {
		e1.printStackTrace();
	}
	
	try {
		osw.close();
	} catch (IOException e) {
		e.printStackTrace();
	}
}
写文件,FileWriter的第二个参数表示“追加”与否。
String fileName = "H:\\test.txt";
String strText = "qqqq";

FileWriter writer = null;
try {
	writer = new FileWriter(fileName, true);
	writer.write(strText);
	writer.close();		
} catch (IOException e) {
	e.printStackTrace();
}
删除文件。
String fileName = "H:\\tmp\\test.txt";
File file = new File(fileName);

if(file.exists() && file.isFile())
{
	file.delete();
}
阅读全文

Java中二进制、八进制、十进制、十六进制数的互相转换

使用Integer.toString(int iNumber, int radix)即可,部分示例如下,其他情况类似。 八进制转换成二进制
int iOct = 0123;
String strResult = Integer.toString(iOct, 2);
//结果为1010011
八进制转换成十进制
int iOct = 0123;
String strResult = Integer.toString(iOct, 10);
//结果为83
八进制转换成十六进制
int iOct = 0123;
String strResult = Integer.toString(iOct, 16);
//结果为53
十进制转换成二进制
int iTen = 123;
String strResult = Integer.toString(iTen, 2);
//结果为1111011
十进制转换成八进制...
阅读全文

Java中数字的四舍五入

可以通过java.lang.Math或java.math.BigDecimal来实现,其中后者更为灵活。
import java.math.BigDecimal;

class test{

	public static void main(String[] args) {
		Double dValue = 1.234567;

		long lResult = Math.round(dValue);
		System.out.println(Math.round(dValue));
		//结果为:1

		BigDecimal number = new BigDecimal(dValue);
		BigDecimal bdResult = number.setScale(1, BigDecimal.ROUND_HALF_UP);	
		System.out.println(bdResult.doubleValue());
		//结果为:1.2

		bdResult = number.setScale(5, BigDecimal.ROUND_HALF_UP);
		System.out.println(bdResult.doubleValue());
		//结果为:1.23457		
	}
}
阅读全文

Java的函数参数传递是拷贝还是引用

对于基本数据类型,Java的参数传递策略为拷贝。比如
public class test {

	public static void test(int a){
		a -- ;
		System.out.println(String.format("a=%d in test function.",a));		
	}

	public static void main(String[] args) {
		int a = 10;
		System.out.println(String.format("a=%d in main function.",a));

		test(a);

		System.out.println(String.format("a=%d in main function.",a));
	}
}
结果是:
a=10 in main function.
a=9 in test function.
a=10 in main function.
对于对象类型,Java的参数传递策略为引用。比如
class BookMgr{

	private int a;

	public void setA(int a){
		this.a = a;
	}

	public int getA(){
		return a;
	}	
}

public class test {

	public static void test(BookMgr mgr, int a){
		mgr.setA(a);
		System.out.println(String.format("mgr.getA()=%d in test function.",mgr.getA()));
	}

	public static void main(String[] args) {
		BookMgr mgr = new BookMgr();
		mgr.setA(10);
		System.out.println(String.format("mgr.getA()=%d in main function.",mgr.getA()));

		test(mgr, 20);

		System.out.println(String.format("mgr.getA()=%d in main function.",mgr.getA()));
	}
}
结果是:
mgr.getA()=10 in main function.
mgr.getA()=20 in test function.
mgr.getA()=20 in main function.
阅读全文

Java的List有哪些实现类

Java中java.util.List接口有3个实现类java.util.ArrayLis,通过数组实现,存储空间连续,当数组长度不足时需要将已有数据复制到新的空间中,因而在中间插入或删除元素时代...阅读全文

返回页首返回页尾