Java 常用实用类(中)

目录

1.Java StringTokenizer类

(1) StringTokenizer(String s)

(2) StringTokenizer(String s,String delim)

2.Java Scanner类使用默认分隔标记解析字符串 

3.Java Scanner类使用正则表达式作为分隔标记解析字符串 

4.Java Date类

1.使用无参数构造方法

2.使用带参数的构造方法

5.Java Calendar类

6.Java Calendar类

7.Java日期的格式化format方法

1.格式化模式

2.日期列表

3.格式化同一日期

8.Java不同区域的星期格式 

9.Java Math类


1.Java StringTokenizer类

在前几节我们学习了怎祥使用String类的split()方法分解字符串,这一节我们将学习怎样使用StringTokenizer对象分解字符串,与split()方法不同的是,StringTokenizer对象不使用正则表达式作为分隔标记。

首先我们需要知道一个概念——语言符号,所谓的语言符号,就是指我们分析字符串时,将字符串分解成可以被独立使用的单词,而这些单词就被称作语言符号。

例如,对于字符串"You are welcome",如果把空格作为该字符串的分隔标记,那么该字符串有三个单词,也就是有三个语言符号。而对于字符串"You,are,welcome",如果把逗号作为该字符串的分隔标记,那么该字符串也有三个语言符号。

当我们分析一个字符串并将字符串分解成可被独立使用的单词时,可以使用java.util包中的StringTokenizer类,该类有两个常用的构造方法:

(1) StringTokenizer(String s)

为字符串s构造一个分析器,使用默认的分隔标记,即空格符(若干个空格被看做一个空格)、换行符、回车符、Tab符、进纸符做分隔标记。

(2) StringTokenizer(String s,String delim)

为字符串s构造一个分析器,参数delim中的字符被作为分隔标记。

注意:分隔标记的任意组合仍然是分隔标记。

例如:

StringTokenizer fenxi = new StringTokenizer("you are welcome");
StringTokenizer fenxi = new StringTokenizer("you,are; welcome",", ;");

称一个StringTokenizer对象为一个字符串分析器,一个分析器可以使用nextToken()方法逐个获取字符串中的语言符号,每当调用nextToken()时,都将在字符串中获得下一个语言符号,每当获取到一个语言符号,字符串分析器中负责计数的变量的值就自动减1,该计数变量的初始值等于字符串中的单词数目。

通常用while循环来逐个获取语言符号,为了控制循环,可以使用StringTokenizer类中的hasMoreTokens()方法,只要字符串中还有语言符号,即计数变量的值大于0,该方法就返回true,否则返回false。另外还可以随时让分析器调用countTokens()方法得到分析器中计数变量的值。

例如:

import java.util.*;
public class Main {
    public static void main(String args[]) {
        String s = "welcome to csdn(thank you),nice to meet you";
        StringTokenizer fenxi = new StringTokenizer(s,"() ,");
        int number = fenxi.countTokens();
        while(fenxi.hasMoreTokens()) {
            String str = fenxi.nextToken();
            System.out.print(str+" ");
        }
        System.out.println("共有单词:"+number+"个");
    }
}

运行结果如下:

welcome to csdn thank you nice to meet you 共有单词:9个

2.Java Scanner类使用默认分隔标记解析字符串 

前几节我们学习了怎样使用String类的split(String regex)来分解字符串,以及怎样使用StringTokenizer类来解析字符串中的单词,这一节我们学习怎样使用Scanner类的对象从字符串中解析程序所需要的数据。

解析程序所需数据有两种方法,一是使用默认分隔标记解析字符串,二是使用正则表达式作为分隔标记解析字符串,本节我们学习第一种方法。

想要使用默认分隔标记解析字符串,我们需要创建Scanner对象,并将要解析的字符串传递给所构造的对象,例如:

String NBA = "I Love This Game";

为了解析出NBA中的单词,我们可以构造一个Scanner对象:

Scanner scanner = new Scanner(NBA);

那么scanner将空格作为分隔标记来解析字符串中的单词,解析操作的特点如下:

  • scanner调用next()方法依次返回NBA中的单词,如果NBA最后一个单词已被next()方法返回,scanner调用hasNext()将返回false,否则返回true。
  • 对于被解析的字符串中的数字型单词,比如123,1.23等,scanner可以用nextInt()或nextDouble()方法来代替next()方法,即scanner可以调用nextInt()或nextDouble()方法将数字型单词转化为int或double数据返回。
  • 如果单词不是数字型单词,scanner调用nextInt()或 nextDouble()方法将发生InputMismatchException异常,在处理异常时可以调用next()方法返回非数字化单词。

3.Java Scanner类使用正则表达式作为分隔标记解析字符串 

上一节我们学习了第一种方法——使用默认分隔标记解析字符串,这一节我们学习第二种方法——使用正则表达式作为分隔标记解析字符串

我们要知道,Scanner对象想要使用默认分隔标记,也就是空格,解析字符串中的数据,就要求必须使用空格将字符串中的数据和其他字符分隔开,否则就无法解析出我们所需要的数据。

实际上,Scanner对象还可以调用方法:

useDelimiter(正则表达式);

正则表达式作为分隔标记,也就是说,Scanner对象在解析字符串时,把与正则表达式匹配的字符串作为分隔标记。

例如,使用正则表达式(匹配所有非数字字符串)String regex = "[^0123456789.]+"作为分隔标记解析字符串。

import java.util.*;
public class Main {
    public static void main(String args[]) {
        String cost = "话费清单:市话费66.66元,长途话费166.66元,短信费16.16元";
        Scanner scanner = new Scanner(cost);
        scanner.useDelimiter("[^0123456789.]+"); //scanner设置分隔标记
        double sum=0;
        while(scanner.hasNext()) {
            try {
                double price = scanner.nextDouble();
                sum = sum+price;
                System.out.println(price);
            }
            catch(InputMismatchException exp) {
                String t = scanner.next();
            }
        }
        System.out.println("总通信费用:"+sum+"元");
    }
}

运行结果如下:

66.66
166.66
16.16
总通信费用:249.48元

4.Java Date类

        在程序设计时可能需要日期、时间等数据,那么这一节我们就介绍一下java.util包中的Date类,Date类可用于处理和日期、时间相关的数据。

1.使用无参数构造方法

使用Date类的无参数构造方法创建的对象可以获取本机的当前日期和时间,例如:

Date nowTime = new Date();

那么,当前nowTime对象中含有的日期和时间就是创建nowTime对象时本地计算机的日期和时间。例如,假设当前时间是2012年2月12日20:02:32(CST时区):

System.out.println(nowTime);

那么此时的输出结果是:

Sun Feb 12 20:02:32 CST 2012

2.使用带参数的构造方法

计算机系统将其自身的时间的“公元”设置在1970年1月1日0时(格林威治时间),可以根据这个时间使用Date的带参数的构造方法Date(long time)来创建一个Date对象,例如:

Date datel = new Date(1000),
date2 = new Date(-1000);

其中的参数取正数表示公元后的时间,取负数表示公元前的时间。例如:1000表示1000毫秒,那么,datel含有的日期、时间就是计算机系统公元后1秒时刻的日期、时间。

如果运行Java程序的本地时区是北京时区(与格林威治时间相差8个小时),那么上述datel就是1970年1月1日8时0分1秒,date2就是1970年1月1日7时59分59秒。

我们还可以用System类静态方法public long currentTimeMillis()获取系统当前时间,如果运行Java程序的本地时区是北京时区,这个时间是从1970年1月1日8点到目前时刻所走过的毫秒数,这是一个不小的数。

Date对象表示时间的默认顺序是:星期、月、日、小时、分、秒、年。例如:Sun Feb 12 20:02:32 CST 2012。

5.Java Calendar类

 Calendar类也在java.util包中,使用Calendar类的static方法getInstance()可以初始化一个日历对象,例如:

Calendar calendar = Calendar.getInstance();

然后,calendar对象可以调用方法:

public final void set(int year,int month,int date)
public final void set(int year,int month,int date,int hour,int minute)
public final void set(int year,int month,int date,int hour,int minute,int second)

将日历翻到任何一个时间,当参数year取负数时表示公元前(实际世界中的公元前)。

calendar对象调用方法public int get(int field)可以获取有关年份、月份、小时、星期等信息,参数field的有效值由Calendar的静态常量指定。

例如:

calendar.get(Calendar.MONTH);

返回一个整数,如果该整数是0表示当前日历是在一月,该整数是1表示当前日历是在二月等。

例如:

calendar.get(Calendar.DAY_OF_WEEK);

返回一个整数,如果该整数是1表示星期日,2表示星期一,以此类推,7表示星期六。

日历对象调用public long getTimeInMillis()可以将时间表示为毫秒。

6.Java Calendar类

Calendar类也在java.util包中,使用Calendar类的static方法getInstance()可以初始化一个日历对象,例如:

Calendar calendar = Calendar.getInstance();

然后,calendar对象可以调用方法:

public final void set(int year,int month,int date)
public final void set(int year,int month,int date,int hour,int minute)
public final void set(int year,int month,int date,int hour,int minute,int second)

将日历翻到任何一个时间,当参数year取负数时表示公元前(实际世界中的公元前)。

calendar对象调用方法public int get(int field)可以获取有关年份、月份、小时、星期等信息,参数field的有效值由Calendar的静态常量指定。

 例如:

calendar.get(Calendar.MONTH);

返回一个整数,如果该整数是0表示当前日历是在一月,该整数是1表示当前日历是在二月等。

例如:

calendar.get(Calendar.DAY_OF_WEEK);

返回一个整数,如果该整数是1表示星期日,2表示星期一,以此类推,7表示星期六。

日历对象调用public long getTimeInMillis()可以将时间表示为毫秒。

7.Java日期的格式化format方法

我们可能希望按着某种习惯来输出时间,比如时间的顺序:年 月 星期 日或者年 月 星期 日 小时 分 秒。

Java早期使用java.text包中的DateFormat的子类SimpleDateFormat来实现日期的格式化,JDK 1.5版本提供了更为方便的Formatter类,Formatter类的format方法格式如下:

format(格式化模式,日期列表)

按着“格式化模式”返回“日期列表”中所列各个日期中所含数据(年,月,日,小时等数据)的字符串表示。

目前,Java已经将format方法作为了String类的静态方法,因此,程序可以直接使用String类调用format方法对日期进行格式化。

1.格式化模式

format方法中的“格式化模式”是一个用双引号括起的字符序列,也就是字符串,该字符序列中的字符由时间格式符和普通字符所构成。

例如:"日期:%ty-%tm-%td"中的%ty,%tm和%td等都是时间格式符,开始的2个汉字(“日”和“期”)、冒号、格式符之间的连接字符“-”都是普通字符,通俗点说就是,不是时间格式符的都被认为是普通字符。

比如:格式符%ty、%tm和%td将分别表示日期中的“年”、“月”和“日”。

format方法返回的字符串就是“格式化模式”中的时间格式符被替换为它得到的格式化结果后的字符串,例如:

String s = String.format("%tY年%tm月%td日",new Date(),new Date(),new Date());

2.日期列表

format方法中的“日期列表”可以是用逗号分隔的Calendar对象Date对象

我们要保证format方法“格式化模式”中的格式符的个数与“日期列表”中列出的日期个数相同。

format方法默认按从左到右的顺序使用“格式化模式”中的格式符来格式“日期列表”中对应的日期,而“格式化模式”中的普通字符保留原样。

3.格式化同一日期

        我们希望用几个格式符号格式“日期列表”中的同一个日期,可以在“格式化模式”中使用“<”,比如:"%ty-%<tm-%<td"中的三个格式符将格式化同一日期,即含有“<”的格式符和它前面的格式符格式同一个日期,例如:

String s = String.format("%ty年%<tm月%<td日",new Date());

常用的日期格式符:

日期格式符作用
%tY将日期中的“年”格式化为4位形式,例如:2000
%ty将日期中的“年”格式化为2位形式,带前导零,例如:01
%tm将日期中的“月”格式化为2位形式,带前导零,即01~13,其中“01”是一年的第一个月,“13”是支持阴历所需的一个特殊值
%tp

将日期中的“日”格式化为当前环境下上午或下午的表示格式,例如:am或pm

%td将日期中的“日”格式化为当前月中的天,带前导零,即01~31,其中“01”是一个月的第一天
%tj将日期中的“日”格式化为当年的天数,带前导零,即001~365,“001”是一年的第一天
%tB将日期中的“月”格式化为当前环境下的月份全称,例如:January
%tb将日期中的“月”格式化为当前环境下的月份简称,例如:Jan
%tA将日期中的“日”格式化为当前环境下的星期几的全称,例如:Monday
%ta将日期中的“日”格式化为当前环境下的星期几的简称,例如:Mon
%tH将日期中的“时”格式化为2位形式,带前导零,24小时制,即00~23
%tI将日期中的“时”格式化为2位形式,带前导零,12小时制,即01~12
%tM将日期中的“分”格式化为2位形式,带前导零,即00~60,60是支持闰秒所需的一个特殊值
%tS将日期中的“秒”格式化为2位形式,带前导零,即00~60
%tL将日期中秒的“毫秒”格式化为3位形式,带前导零,即000~999
%tN将日期中毫秒的“微秒”格式化为9位形式,带前导零,即000000000~999999999
%tz将日期与GMT(格林威治时间)的偏移量格式化为4位形式,例如:+0800
%tZ将日期所在时区的名称格式化为标准缩写,例如:CST
%tR等价于%tH:%tM
%tT等价于%tH:%tM:%S
%tr等价于%tI:%tM:%tS%Tp(上午或下午标记%Tp的位置可能与地区有关)
%tD等价于%tm/%td/%ty
%tF等价于"%tY-%tm-%td"
%tc等价于"%ta %tb %td %tT   %tZ %tY",例如:“星期日 二月 12 20:02:32 CST 2012”

8.Java不同区域的星期格式 

我们要知道,不同国家的星期的简称或全称有很大的不同,例如,美国用Thu(Thursday)简称(全称)星期四,日本用“木”(木曜日)简称(全称)星期四,意大利用gio(giovedi)简称(全称)星期四等等。

如果想用特定地区的星期格式来表示日期中的星期,可以用format重载方法

format (Locale locale,格式化模式,日期列表);

其中的参数locale是一个Locale类的实例,用于表示地域。

Locale类的static常量都是Locale对象,其中US是表示美国的static常量,我们可以查阅Java API或反编译Locale类了解表示不同国家的静态常量。

例如,假设当前时间是2012-02-12,对于(%ta表示简称的星期):

String s = String.format(Locale.US,"%ta(%<tF)",new Date());

那么s是"Sun(2012-02-12)",对于(%tA表示全称的星期):

String s = String.format(Locale.JAPAN,"%tA(%<tF)",new Date());

那么s是"日曜日(2012-02-12)"。(日本星期一至星期日对应月曜日、火曜日、水曜日、木曜日、金曜日、土曜日、日曜日)

注意:如果format方法不使用Locale参数格式化日期,当前应用程序所在系统的地区设置是中国,那么相当于locale参数取Locale.CHINA。

9.Java Math类

        我们在编写程序时,可能需要计算一个数的平方根,或者是绝对值,还有可能是获取一个随机数等等。

java.lang包中的Math类包含许多用来进行科学计算的类方法,这些方法可以直接通过类名调用。

除此之外,Math类还有两个静态常量EPI,它们的值分别是2.7182828284590452354和3.14159265358979323846。

Math类的常用类方法如下:

1)public static long abs(double a)

返回a的绝对值。

2)public static double max(double a,double b)

返回a、b的最大值。

3)public static double min(double a,double b)

返回a、b的最小值。

4)public static double random()

产生一个0到1之间的随机数(不包括0和1)。

5)public static double pow(double a,double b)

返回a的b次幂。

6)public static double sqrt(double a)

返回a的平方根。

7)public static double log(double a)

返回a的对数。

8)public static double sin(double a)

返回a的正弦值。

9)public static double asin(double a)

返回a的反正弦值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赔罪

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值