天天看点

java中常用类

基本数据类型的包装类..................................................................................................... 1

包装类基本知识........................................................................................................ 1

包装类的用途............................................................................................................ 2

自动装箱和拆箱?autoboxing,unboxing..................................................................... 3

字符串相关类(String、 StringBuffer 、 StringBuilder).................................................... 5

String类的常用方法(已讲过,不再讲!).................................................................. 5

StringBuffer和StringBuilder......................................................................................... 5

String和StringBuffer和StringBuilder使用要点   //buffer(缓冲器)................................ 7

正则表达式对字符串的处理....................................................................................... 8

时间处理相关类............................................................................................................... 8

Date时间类............................................................................................................... 8

DateFormat类和SimpleDateFormat类........................................................................ 9

Calendar日历类....................................................................................................... 11

Math类.......................................................................................................................... 14

File类............................................................................................................................. 15

枚举类............................................................................................................................ 16

基本数据类型的包装类

JAVA并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。比如:集合的操作中。例如使用Map对象要操作put()方法时,需要传入的参数是对象而不是基本数据类型。为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。

包装类均位于java.lang包,包装类和基本数据类型的对应关系如下表所示:

基本数据类型

包装类

byte

Byte

boolean

Boolean

short

Short

char

Character

int

Integer

long

Long

float

Float

double

Double

  在这八个类名中,除了Integer和Character类以后,其它六个类的类名和基本数据类型一直,只是类名的第一个字母大写即可。

对于包装类说,这些类的用途主要包含两种:

           a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。

           b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作用是在基本类型数据、包装类对象、字符串之间提供转化!)。

所有的包装类(Wrapper Class)都有共同的方法,他们是:

    /**

     * 测试Integer的用法,其他包装类类似

     */

    void testInteger(){

       //基本类型转化成Integer对象

       Integer int1 = new Integer(10);

       Integer int2 = Integer.valueOf(20);

       //Integer对象转化成int

       int a = int1.intValue();

       //字符串转化成Integer对象

       Integer int3 = Integer.parseInt("334");

       Integer int4 = new Integer("999");

       //Integer对象转化成字符串

       String str1 = int3.toString();

       System.out.println("int能表示的最大整数:"+Integer.MAX_VALUE);  //一些常见int类型相关的常量

    }

就是将基本类型和包装类进行自动的互相转换。

JDK5.0后,将自动装箱/拆箱引入java中。

自动装箱的过程:每当需要一种类型的对象时,这种基本类型就自动地封装到与它相同类型的包装中。

自动拆箱的过程:每当需要一个值时,被装箱对象中的值就被自动地提取出来,没必要再去调用intValue()和doubleValue()方法。

自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的语法,决定是否进行装箱或拆箱动作。例如:

Integer i = 100;    //装箱过程

相当于编译器自动为您作以下的语法编译:

Integer i = newInteger(100);  //拆箱过程

所以自动装箱与拆箱的功能是所谓的“编译器蜜糖”(Compiler Sugar),虽然使用这个功能很方便,但在程序运行阶段您得了解Java的语义。例如下面的程序是可以通过编译的:

Integer i = null;

int j = i;

这样的语法在编译时期是合法的,但是在运行时期会有错误,因为这种写法相当于:

int j = i.intValue();

null表示i没有参考至任何的对象实体,它可以合法地指定给对象参考名称。由于实际上i并没有参考至任何的对象,所以也就不可能操作intValue()方法,这样上面的写法在运行时会出现NullPointerException错误。

     * 测试自动装箱和拆箱

     * 结论:虽然很方便,但是如果不熟悉特殊情况,可能会出错!

    static void testBoxing(){

       Integer b = 23;    //自动装箱

       int a = new Integer(20);    //自动拆箱

       //自动装箱和拆箱,实际上是编译器替我们完成了代码的自动编译,比如:Integer b = 23, 其实运行时执行的仍然是:Integer b = new Integer(23);

       //下面的问题我们需要注意:

//     Integer  c = null;

//     int d = c;    //此处其实就是:c.intValue(),因此抛空指针异常。

       //自动装箱拆箱时,对于-128-127之间的值,编译器仍然会把它当做基本类型处理。

       Integer h = 100;     Integeru = 100;

       Integer h2 = 200;    Integeru2 = 200;

       if(h==u){

           System.out.println("100等于");

       }

       if(h2==u2){

           System.out.println("200等于");

   }

字符串相关类(String、 StringBuffer 、 StringBuilder)

n  String 类对象保存不可修改的Unicode字符序列

n  String类的下述方法能创建并返回一个新的String对象:    concat, replace,  substring, toLowerCase, toUpperCase, trim.

n  提供查找功能的有关方法: endsWith, startsWith, indexOf,,lastIndexOf.

n  提供比较功能的方法: equals, equalsIgnoreCase, compareTo.

n  其它方法: charAt ,length.

n  public static String valueOf(…)可以将基本类型数据转换为字符串。

n  StringBuffer和StringBuilder非常类似,均代表可变的字符序列,而且方法也一样。 (StringBuilder被设计用作 StringBuffer的一个简易替换,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。)

n  StringBuffer类的常见构造方法:

q  StringBuffer()

n  创建一个不包含字符序列的“空”的StringBuffer对象。

q  StringBuffer(String str)

n  创建一个StringBuffer对象,包含与String对象str相同的字符序列。-------------------------------------------------------------------------------------------------

n  重载的public StringBuilder append(…)方法 可以为该StringBuilder 对象添加字符序列,返回添加后的该StringBuilder对象引用。

n  方法 public StringBuilder delete(int start,int end) 可以删除从start开始到end-1为止的一段字符序列,返回修改后的该StringBuilder对象引用。

n  方法 public StringBuilder deleteCharAt(int index)移除此序列指定位置上的 char。

n  重载的public StringBuilder insert(…)方法可以为该StringBuilder 对象在指定位置插入字符序列,返回修改后的该StringBuilder对象引用,例如:

                            publicStringBuilder insert(int offset,String str)

                          publicStringBuilder insert(int offset,double d)

                            … ……

n  方法 public StringBuilder setCharAt(int index,char ch)  

   The character at the specified(详细的、指定的) index is set to ch.

n  和 String 类含义类似的方法:

                             public intindexOf(String str)

                            public int indexOf(String str,int fromIndex)

   public String substring(截取字符串中的字串)(int start)

   public String substring(int start,int end)

   public int length()

   char charAt(int index)

n  方法 public StringBuilder reverse()反向的   用于将字符序列逆序,返回修改后的该StringBuilder对象引用。

n  方法 public String toString() 返回此序列中数据的字符串表示形式。

//String/StringBuffer,StringBuilder基本用法和效率测试

String str ="";

       Date d = new Date();

       for(int i=0;i<10000;i++){

           str +=i;

       Date d2 = new Date();

       System.out.println(d2.getTime()-d.getTime());

//     StringBuilder sb = new StringBuilder();

       StringBuffer sb = new StringBuffer();

       Date d3 = new Date();

           sb.append(i);

       Date d4 = new Date();

       System.out.println(d4.getTime()-d3.getTime());

public static void main(String[] args) {

       StringBuilder sb = new StringBuilder();

       for(int i = 0; i < 7; i++) {

           sb.append((char)('a' + i));

       System.out.println(sb.toString());

       sb.append(", I cansing my abc!");

       StringBuffer sb2 = new StringBuffer("×××");

       sb2.insert(0, "爱").insert(0, "我");

       System.out.println(sb2);//我爱×××

       sb2.delete(0, 2);

       System.out.println(sb2);

       sb2.deleteCharAt(0).deleteCharAt(0);

       System.out.println(sb2.charAt(0));//共

       System.out.println(sb2.reverse());//国和共

       System.out.println();

String使用的陷阱:String一经初始化后,就不会在改变其内容了。对String字符串的操作实际上对其副本(原始拷贝)的操作,原来的字符串一点都没有改变。比如:

    string s="a"; //创建了一个字符串

    s=s+"b"; //实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。

相反,StringBuffer类是对原字符串本身操作的,可以对字符串进行修改而不产生副本拷贝。可以在循环中使用。

String:不可变字符序列

StringBuffer:可变字符序列,并且线程安全,但是效率低

StringBuilder:可变字符序列,线程不安全,但是效率高(一般用他!)

正则表达式对字符串的处理

(讲完javascript后专门给大家讲!)

时间处理相关类

在标准Java类库中包含一个Date类。它的对象表示一个特定的瞬间,精确到毫秒。

q  Date()分配一个Date对象,并初始化此对象为当前的日期和时间精确到毫秒)。

q  Date(long date)分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。[微软用户1] 

q  Boolean after(Date when)测试此日期是否在指定日期之后。 

q  booleanbefore(Date when)  测试此日期是否在指定日期之前。

q  Boolean equals(Object obj)比较两个日期的相等性。

q  Long getTime()返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。

q  String toString()把此 Date 对象转换为以下形式的 String:

   dow mon dd hh:mm:ss zzzyyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

    public static void main(String[] args) {

       Datedate1 = new Date();

       System.out.println(date1.toString());

       long i = date1.getTime();

       Datedate2 = new Date(i -1000);

       Datedate3 = new Date(i +1000);

       System.out.println(date1.after(date2));

       System.out.println(date1.before(date2));

       System.out.println(date1.equals(date2));

       System.out.println(date1.after(date3));

       System.out.println(date1.before(date3));

       System.out.println(date1.equals(date3));

       System.out.println(

           new Date(1000L* 60 * 60 * 24 * 365 * 39L[雨林木风2] ).toString());  //why?

查看API文档大家可以看到很多方法过时了,JDK1.1之前的Date包含了:日期操作、字符串转化成时间对象,时间对象。  1.1之后,日期操作使用:Canlendar类来。 字符串转化:DateFormat。 (日期格式)

作用:把时间对象转化成指定格式的字符串。反之,把指定格式的字符串转化成时间对象。

DateFormat是一个抽象类。一般使用SimpleDateFormat类。

示例:

public static void main(String[] args) throws ParseException {//解析异常

       //new出SimpleDateFormat对象

       SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

       SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd");

       //将时间对象转换成字符串

       String daytime = s1.format(new Date());

       System.out.println(s2.format(new Date()));

       System.out.println(new SimpleDateFormat("hh:mm:ss").format(new Date()));

       //将符合指定格式的字符串转成成时间对象.字符串格式需要和指定格式一致。

       String time= "2007-10-7";

       Date date = s2.parse(time);

       System.out.println("date1:" + date);

       time= "2007-10-7 20:15:30";

       date = s1.parse(time);

       System.out.println("date2:" + date);

还可以采用:printf(写格式化输出), string.format方法来格式化时间,大家还记得吗?

格式化字符的含义:

字母

日期或时间元素

表示

示例

G

Era 标志符

Text

AD

y

Year

1996; 96

M

年中的月份

Month

July; Jul; 07

w

年中的周数

Number

27

W

月份中的周数

2

D

年中的天数

189

d

月份中的天数

10

F

月份中的星期

E

星期中的天数

Tuesday; Tue

a

Am/pm 标记

PM

H

一天中的小时数(0-23)

k

一天中的小时数(1-24)

24

K

am/pm 中的小时数(0-11)

h

am/pm 中的小时数(1-12)

12

m

小时中的分钟数

30

s

分钟中的秒数

55

S

毫秒数

978

z

时区

General time zone

Pacific Standard Time; PST; GMT-08:00

Z

RFC 822 time zone

-0800

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。

GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。

注意月份的表示,一月是0,二月是1,以此类推,是12月是11。因为大多数人习惯于使用单词而不是使用数字来表示月份,这样程序也许更易读,父类Calendar使用常量来表示月份:JANUARY,FEBRUARY,等等。

package chuji;

import java.util.Calendar;

import java.util.Date;

import java.util.GregorianCalendar;

public class AppMain {

       GregorianCalendar calendar = new GregorianCalendar(1999,10,9,22,10,50);

       GregorianCalendar calendar2 = new GregorianCalendar();

       //设置日期

       calendar2.set(Calendar.YEAR, 2009);

       calendar2.set(Calendar.MONTH, Calendar.FEBRUARY);  //月份数:0-11

       calendar2.set(Calendar.DATE, 3);

       calendar2.set(Calendar.HOUR_OF_DAY, 10);

       calendar2.set(Calendar.MINUTE, 20);

       calendar2.set(Calendar.SECOND, 23);

       //得到相关日期元素

       int year = calendar.get(Calendar.YEAR);

       int month = calendar.get(Calendar.MONTH);

       int day = calendar.get(Calendar.DAY_OF_MONTH);

       int day2 = calendar.get(Calendar.DATE); //日:Calendar.DATE和Calendar.DAY_OF_MONTH同义

       int date = calendar.get(Calendar.DAY_OF_WEEK); //星期几       这里是:1-7.周日是1,周一是2,。。。周六是7

       System.out.printf("%d年%d月%d日,星期%d\n",year,month,day,date);

       //日期计算

       GregorianCalendar calendar3 = new GregorianCalendar(1999,10,9,22,10,50);

       calendar3.add(Calendar.MONTH, -7);  //月份减7

       calendar3.add(Calendar.DATE, 7);  //增加7天

       printCalendar(calendar3);

       //日历对象和时间对象转化

       Date d = calendar3.getTime();

       long millSecond = calendar3.getTimeInMillis();

       Date date2 = new Date();

       GregorianCalendar calendar4 = new GregorianCalendar();

       calendar4.setTime(date2);

        long  g =  System.currentTimeMillis();

    static void printCalendar(Calendar calendar){

       int month = calendar.get(Calendar.MONTH)+1;

       int day2 = calendar.get(Calendar.DATE); //日:Calendar.DATE和Calendar.DAY_OF_MONTH同义 

       int date = calendar.get(Calendar.DAY_OF_WEEK)-1; //星期几 

       String week = ""+((date==0)?"日":date);

       System.out.printf("%d年%d月%d日,星期%s\n",year,month,day,week);

    }  

}

n  编写程序,利用GregorianCalendar(阳历)类,打印当前月份的日历,样式如下:

         今天的日期是 2008-02-23 ,如下为今日所在月份的日历

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Scanner;

         public static void main(String[] args) throws ParseException {

                   System.out.println("请输入日期(格式为:2010-3-3):");

                   Scanner  scanner = new Scanner(System.in);

                   String  dateString =scanner.nextLine();    //2010-3-1

                   //将输入的字符串转化成日期类

                   System.out.println("您刚刚输入的日期是:"+dateString);

                   String[]  str = dateString.split("-");

                   int year = Integer.parseInt(str[0]);

                   int month = new Integer(str[1]);

                   int day = new Integer(str[2]);

                   Calendar c = new GregorianCalendar(year,month-1, day);   //Month:0-11 ,1-12

                   //大家自己补充另一种方式:将字符串通过SImpleDateFormat转化成Date对象,再将Date对象转化成日期类

//               SimpleDateFormat sdfDateFormat  = new SimpleDateFormat("yyyy-MM-dd");

//               Date date = sdfDateFormat.parse(dateString);

//               Calendar c = new GregorianCalendar();

//               c.setTime(date);

//               int day = c.get(Calendar.DATE);

                   c.set(Calendar.DATE, 1);

                   int  dow = c.get(Calendar.DAY_OF_WEEK);  //week:1-7 日一二三四五六

                   System.out.println("日\t一\t二\t三\t四\t五\t六");

                   for(int i=0;i<dow-1;i++){

                            System.out.print("\t");

                   }

                   int maxDate = c.getActualMaximum(Calendar.DATE);

//               System.out.println("maxDate:"+maxDate);

                   for(int i=1;i<=maxDate;i++){

                            StringBuilder  sBuilder = new StringBuilder();

                            if(c.get(Calendar.DATE)==day){

                                     sBuilder.append(c.get(Calendar.DATE)+"*\t");

                            }else{

                                     sBuilder.append(c.get(Calendar.DATE)+"\t");

                            }

                            System.out.print(sBuilder);

//                         System.out.print(c.get(Calendar.DATE)+((c.get(Calendar.DATE)==day)?"*":"")+"\t");

                            if(c.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY){

                                     System.out.print("\n");

                            c.add(Calendar.DATE, 1);

         }

         static void printCalendar(Calendar calendar){

                   int year = calendar.get(Calendar.YEAR);

                   int month = calendar.get(Calendar.MONTH)+1;

                   int day = calendar.get(Calendar.DAY_OF_MONTH);

                   int day2 = calendar.get(Calendar.DATE); //日:Calendar.DATE和Calendar.DAY_OF_MONTH同义 

                   int date = calendar.get(Calendar.DAY_OF_WEEK)-1; //星期几 

                   String week = ""+(  (date==0)?"日":date   );

                   System.out.printf("-----%d年%d月%d日,星期%s\n",year,month,day,week);

         }       

Math类

上一篇: JAVA之常用类