您的位置:首页 > 编程语言 > Java开发

Java常用类库(二)

2011-08-31 13:26 459 查看

Java常用类库(二)

-----------------------

Math与Random类

Math类表示数学操作类,在Math类中的方未予都是静态方法,直接使用“类.方法名称()”形式调用即可。

实例:

public class MathDemo01{
public static void main(String args[]){
// Math类中的方法都是静态方法,直接使用“类.方法名称()”的形式调用即可
System.out.println("求平方根:" + Math.sqrt(9.0)) ;
System.out.println("求两数的最大值:" + Math.max(10,30)) ;
System.out.println("求两数的最小值:" + Math.min(10,30)) ;
System.out.println("2的3次方:" + Math.pow(2,3)) ;
System.out.println("四舍五入:" + Math.round(33.6)) ;
}
};


Random类

Random类主要是产生随机数,可以产生一个指定范围的随机数,Random类是定义在java.util包中的类。

实例:

import java.util.Random ;
public class RandomDemo01{
public static void main(String args[]){
Random r = new Random() ;		// 实例化Random对象
for(int i=0;i<10;i++){
System.out.print(r.nextInt(100) + "\t") ;
}
}
};


NumberFormat类

NuberFormat的基本使用:此类主要完成数字的格式化显示。

实例:

import java.text.* ;
public class NumberFormatDemo01{
public static void main(String args[]){
NumberFormat nf = null ;		// 声明一个NumberFormat对象
nf = NumberFormat.getInstance() ;	// 得到默认的数字格式化显示
System.out.println("格式化之后的数字:" + nf.format(10000000)) ;
System.out.println("格式化之后的数字:" + nf.format(1000.345)) ;
}
};


DecimalFormat的基本使用:DecimalFormat也是Format的一个子类,主要的作用是用来格式化数字使用,当然,在格式化数字的时候要比直接使用NumberFormat更加方便,因为可以直接指按用户自定义的方式进行格式化操作,与之前SimpleDateFormat类似。

实例:

import java.text.* ;
class FormatDemo{
public void format1(String pattern,double value){	// 此方法专门用于完成数字的格式化显示
DecimalFormat df = null ;			// 声明一个DecimalFormat类的对象
df = new DecimalFormat(pattern) ;	// 实例化对象,传入模板
String str = df.format(value) ;		// 格式化数字
System.out.println("使用" + pattern
+ "格式化数字" + value + ":" + str) ;
}
};
public class NumberFormatDemo02{
public static void main(String args[]){
FormatDemo demo = new FormatDemo() ;	// 格式化对象的类
demo.format1("###,###.###",111222.34567) ;
demo.format1("000,000.000",11222.34567) ;
demo.format1("###,###.###¥",111222.34567) ;
demo.format1("000,000.000¥",11222.34567) ;
demo.format1("##.###%",0.345678) ;
demo.format1("00.###%",0.0345678) ;
demo.format1("###.###\u2030",0.345678) ;
}
};


大数操作类(BigInter、BigDecimal)

大数操作,一般是指在超出long、double类型能够存放的范围时使用。

操作整型:BigInteger

操作小数:BigDecimal

BigDecimal实例:

import java.math.* ;
class MyMath{
public static double add(double d1,double d2){		// 进行加法计算
BigDecimal b1 = new BigDecimal(d1) ;
BigDecimal b2 = new BigDecimal(d2) ;
return b1.add(b2).doubleValue() ;
}
public static double sub(double d1,double d2){		// 进行减法计算
BigDecimal b1 = new BigDecimal(d1) ;
BigDecimal b2 = new BigDecimal(d2) ;
return b1.subtract(b2).doubleValue() ;
}
public static double mul(double d1,double d2){		// 进行乘法计算
BigDecimal b1 = new BigDecimal(d1) ;
BigDecimal b2 = new BigDecimal(d2) ;
return b1.multiply(b2).doubleValue() ;
}
public static double div(double d1,double d2,int len){		// 进行乘法计算
BigDecimal b1 = new BigDecimal(d1) ;
BigDecimal b2 = new BigDecimal(d2) ;
return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
}
public static double round(double d,int len){	// 进行四舍五入
BigDecimal b1 = new BigDecimal(d) ;
BigDecimal b2 = new BigDecimal(1) ;
return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
}
};

public class BigDecimalDemo01{
public static void main(String args[]){
System.out.println("加法运算:" + MyMath.round(MyMath.add(10.345,3.333),1)) ;
System.out.println("减法运算:" + MyMath.round(MyMath.sub(10.345,3.333),3)) ;
System.out.println("乘法运算:" + MyMath.round(MyMath.mul(10.345,3.333),2)) ;
System.out.println("除法运算:" + MyMath.div(10.345,3.333,3)) ;
}
};

BigInteger实例:

import java.math.BigInteger ;
public class BigIntegerDemo01{
public static void main(String args[]){
BigInteger bi1 = new BigInteger("123456789") ;	// 声明BigInteger对象
BigInteger bi2 = new BigInteger("987654321") ;	// 声明BigInteger对象
System.out.println("加法操作:" + bi2.add(bi1)) ;	// 加法操作
System.out.println("减法操作:" + bi2.subtract(bi1)) ;	// 减法操作
System.out.println("乘法操作:" + bi2.multiply(bi1)) ;	// 乘法操作
System.out.println("除法操作:" + bi2.divide(bi1)) ;	// 除法操作
System.out.println("最大数:" + bi2.max(bi1)) ;	 // 求出最大数
System.out.println("最小数:" + bi2.min(bi1)) ;	 // 求出最小数
BigInteger result[] = bi2.divideAndRemainder(bi1) ;	// 求出余数的除法操作
System.out.println("商是:" + result[0] +
";余数是:" + result[1]) ;
}
};


对象克隆技术

对象克隆:将对象完整的复制成另一个对象,必须依靠Object类

实例:

class Person implements Cloneable{	// 实现Cloneable接口表示可以被克隆
private String name ;
public Person(String name){
this.name = name ;
}
public void setName(String name){
this.name = name ;
}
public String getName(){
return this.name ;
}
public String toString(){
return "姓名:" + this.name ;
}
public Object clone()
throws CloneNotSupportedException
{
return super.clone() ;	// 具体的克隆操作由父类完成
}
};
public class CloneDemo01{
public static void main(String args[]) throws Exception{
Person p1 = new Person("张三") ;
Person p2 = (Person)p1.clone() ;
p2.setName("李四") ;
System.out.println("原始对象:" + p1) ;
System.out.println("克隆之后的对象:" + p2) ;
}
};


比较器

Comparable接口的作用

之前Arrays类中存在sort()方法,此方法可以直接对对象数组进行排序

Coparable接口可以直接使用java.util.Arrays类进行数组的排序操作,但对象所在的类必须实现Comparable接口,用于指定排序接口。

实例:要求:定义一个学生类,里面有姓名、年龄、成绩三个属性,要求按成绩排序,如果成绩相等,则按照年龄由低到高排序

代码:

class Student implements Comparable<Student> {	// 指定类型为Student
private String name ;
private int age ;
private float score ;
public Student(String name,int age,float score){
this.name = name ;
this.age = age ;
this.score = score ;
}
public String toString(){
return name + "\t\t" + this.age + "\t\t" + this.score ;
}
public int compareTo(Student stu){	// 覆写compareTo()方法,实现排序规则的应用
if(this.score>stu.score){
return -1 ;
}else if(this.score<stu.score){
return 1 ;
}else{
if(this.age>stu.age){
return 1 ;
}else if(this.age<stu.age){
return -1 ;
}else{
return 0 ;
}
}
}
};
public class ComparableDemo01{
public static void main(String args[]){
Student stu[] = {new Student("张三",20,90.0f),
new Student("李四",22,90.0f),new Student("王五",20,99.0f),
new Student("赵六",20,70.0f),new Student("孙七",22,100.0f)} ;
java.util.Arrays.sort(stu) ;	// 进行排序操作
for(int i=0;i<stu.length;i++){	// 循环输出数组中的内容
System.out.println(stu[i]) ;
}
}
};


实际上比较器的排序原理 就是二叉树的排序算法。

基本原里:使用第一个元素作为根节点,之后如果后面的内容比根节点要小,则放在左子树如果内容比根节点内容大,则放在右子树

手动完成二叉树算法:

class BinaryTree{
class Node{			// 声明一个节点类
private Comparable data ;	// 保存具体的内容
private Node left ;			// 保存左子树
private Node right ;		// 保存右子树
public Node(Comparable data){
this.data = data ;
}
public void addNode(Node newNode){
// 确定是放在左子树还是右子树
if(newNode.data.compareTo(this.data)<0){	// 内容小,放在左子树
if(this.left==null){
this.left = newNode ;	// 直接将新的节点设置成左子树
}else{
this.left.addNode(newNode) ;	// 继续向下判断
}
}
if(newNode.data.compareTo(this.data)>=0){	// 放在右子树
if(this.right==null){
this.right = newNode ;	// 没有右子树则将此节点设置成右子树
}else{
this.right.addNode(newNode) ;	// 继续向下判断
}
}
}
public void printNode(){	// 输出的时候采用中序遍历
if(this.left!=null){
this.left.printNode() ;	// 输出左子树
}
System.out.print(this.data + "\t") ;
if(this.right!=null){
this.right.printNode() ;
}
}
};
private Node root ;		// 根元素
public void add(Comparable data){	// 加入元素
Node newNode = new Node(data) ;	// 定义新的节点
if(root==null){	// 没有根节点
root = newNode ;	// 第一个元素作为根节点
}else{
root.addNode(newNode) ; // 确定是放在左子树还是放在右子树
}
}
public void print(){
this.root.printNode() ;	// 通过根节点输出
}
};
public class ComparableDemo03{
public static void main(String args[]){
BinaryTree bt = new BinaryTree() ;
bt.add(8) ;
bt.add(3) ;
bt.add(3) ;
bt.add(10) ;
bt.add(9) ;
bt.add(1) ;
bt.add(5) ;
bt.add(5) ;
System.out.println("排序之后的结果:") ;
bt.print() ;
}
};


另一种比较器:Comparator

如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作的,所以为了解决这样的问题,java又定义了另一具比较器的操作接口——Comparator。

实例:

import java.util.* ;
class Student{	// 指定类型为Student
private String name ;
private int age ;
public Student(String name,int age){
this.name = name ;
this.age = age ;
}
public boolean equals(Object obj){	// 覆写equals方法
if(this==obj){
return true ;
}
if(!(obj instanceof Student)){
return false ;
}
Student stu = (Student) obj ;
if(stu.name.equals(this.name)&&stu.age==this.age){
return true ;
}else{
return false ;
}
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public String toString(){
return name + "\t\t" + this.age  ;
}
};

class StudentComparator implements Comparator<Student>{	// 实现比较器
// 因为Object类中本身已经有了equals()方法
public int compare(Student s1,Student s2){
if(s1.equals(s2)){
return 0 ;
}else if(s1.getAge()<s2.getAge()){	// 按年龄比较
return 1 ;
}else{
return -1 ;
}
}
};

public class ComparatorDemo{
public static void main(String args[]){
Student stu[] = {new Student("张三",20),
new Student("李四",22),new Student("王五",20),
new Student("赵六",20),new Student("孙七",22)} ;
java.util.Arrays.sort(stu,new StudentComparator()) ;	// 进行排序操作
for(int i=0;i<stu.length;i++){	// 循环输出数组中的内容
System.out.println(stu[i]) ;
}
}
};


观察者设计模式

以购房者观注房价为例,结合java.util包中提供的Obeservable类和Observer接口实现。

代码:

import java.util.* ;
class House extends Observable{	// 表示房子可以被观察
private float price ;// 价钱
public House(float price){
this.price = price ;
}
public float getPrice(){
return this.price ;
}
public void setPrice(float price){
// 每一次修改的时候都应该引起观察者的注意
super.setChanged() ;	// 设置变化点
super.notifyObservers(price) ;// 价格被改变
this.price = price ;
}
public String toString(){
return "房子价格为:" + this.price ;
}
};
class HousePriceObserver implements Observer{
private String name ;
public HousePriceObserver(String name){	// 设置每一个购房者的名字
this.name = name ;
}
public void update(Observable o,Object arg){
if(arg instanceof Float){
System.out.print(this.name + "观察到价格更改为:") ;
System.out.println(((Float)arg).floatValue()) ;
}
}
};
public class ObserDemo01{
public static void main(String args[]){
House h = new House(1000000) ;
HousePriceObserver hpo1 = new HousePriceObserver("购房者A") ;
HousePriceObserver hpo2 = new HousePriceObserver("购房者B") ;
HousePriceObserver hpo3 = new HousePriceObserver("购房者C") ;
h.addObserver(hpo1) ;
h.addObserver(hpo2) ;
h.addObserver(hpo3) ;
System.out.println(h) ;	// 输出房子价格
h.setPrice(666666) ;	// 修改房子价格
System.out.println(h) ;	// 输出房子价格
}
};


正则表达式

利用两段代码观察使用正则表达式的好处

不使用正则:

public class RegexDemo01{
public static void main(String args[]){
String str = "1234567890" ;		// 此字符串由数字组成
boolean flag = true ;			// 定义一个标记变量
// 要先将字符串拆分成字符数组,之后依次判断
char c[] = str.toCharArray() ;	// 将字符串变为字符数组
for(int i=0;i<c.length;i++){	// 循环依次判断
if(c[i]<'0'||c[i]>'9'){		// 如果满足条件,则表示不是数字
flag = false ;			// 做个标记
break ;					// 程序不再向下继续执行
}
}
if(flag){
System.out.println("是由数字组成!") ;
}else{
System.out.println("不是由数字组成!") ;
}
}
};


基本思路就是将字符串拆分,之后一个个进行比较验证,但是这样比较麻烦

使用正则表达式:

import java.util.regex.Pattern ;
public class RegexDemo02{
public static void main(String args[]){
String str = "1234567890" ;		// 此字符串由数字组成
if(Pattern.compile("[0-9]+").matcher(str).matches()){	// 使用正则
System.out.println("是由数字组成!") ;
}else{
System.out.println("不是由数字组成!") ;
}
}
};


Pattern、Matcher类

这两个类为正则的核心操作类,这两个类都定义在java.util.regex包中

Pattern为的主要作用是进行正则规范的编写。

而Matcher类主要是执行规范,验证一个字符串是否符合其规范。

实例:

import java.util.regex.Pattern ;
import java.util.regex.Matcher ;
public class RegexDemo03{
public static void main(String args[]){
String str = "1983-07-27" ;		// 指定好一个日期格式的字符串
String pat = "\\d{4}-\\d{2}-\\d{2}" ;	// 指定好正则表达式
Pattern p = Pattern.compile(pat) ;	// 实例化Pattern类
Matcher m = p.matcher(str) ;	// 实例化Matcher类
if(m.matches()){		// 进行验证的匹配,使用正则
System.out.println("日期格式合法!") ;
}else{
System.out.println("日期格式不合法!") ;
}
}
};


String类对正则的支持

String对正则主要有三种支持方法:字符串匹配、字符串替换、字符串拆分

实例:

import java.util.regex.Pattern ;
import java.util.regex.Matcher ;
public class RegexDemo06{
public static void main(String args[]){
String str1 = "A1B22C333D4444E55555F".replaceAll("\\d+","_") ;
boolean temp = "1983-07-27".matches("\\d{4}-\\d{2}-\\d{2}") ;
String s[] = "A1B22C333D4444E55555F".split("\\d+") ;
System.out.println("字符串替换操作:" + str1) ;
System.out.println("字符串验证:" + temp) ;
System.out.print("字符串的拆分:") ;
for(int x=0;x<s.length;x++){
System.out.print(s[x] + "\t") ;
}
}
};


定时调度

每当一段时间,程序会自动执行,称为定时调度。如果要使用定时调度,则必须保证程序始终运行着才可以,也就是说相当于定时调度是在程序之外又启动了一个新的线程。

Timer和TimerTask两个类完成定时调度

具体实例:

// 完成具体的任务操作
import java.util.TimerTask ;
import java.util.Date ;
import java.text.SimpleDateFormat ;
class MyTask extends TimerTask{	// 任务调度类都要继承TimerTask
public void run(){
SimpleDateFormat sdf = null ;
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;
System.out.println("当前系统时间为:" + sdf.format(new Date())) ;
}
};


import java.util.Timer ;
public class TestTask{
public static void main(String args[]){
Timer t = new Timer() ;	// 建立Timer类对象
MyTask mytask = new MyTask() ;	// 定义任务
t.schedule(mytask,1000,2000) ;	// 设置任务的执行,1秒后开始,每2秒重复
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: