1、包装类、时间、字符串,2018/7/6,包装类、时间、字符串,2,包装类,2018/7/6,包装类、时间、字符串,3,包装类示例,int i = 500;Integer t1 = new Integer(i);int j1 = t1.intValue();/ j1 = 500Integer t2 = new Integer.valuseOf(“300”) int j2= t2.intValue();/j2=300,2018/7/6,包装类、时间、字符串,4,包装类特点,xxxValue():返回相关的简单类型的值XXX.valuseOf():返回字符串代表的简单类型的包装类的值注意包装类具有不
2、可变特性,即无法直接修改包装类的值,只能创建新的包装类实例,2018/7/6,包装类、时间、字符串,5,日期与格式化,Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日期, 定制日期的显示格式, 并将文本数据解析成日期对象. 我们将大概的学习日期, 日期格式, 日期的解析和日期的计算.,2018/7/6,包装类、时间、字符串,6,java.util.Date,Date 类实际上只是一个包装类, 它包含的是一个长整型数据long,
3、表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.,2018/7/6,包装类、时间、字符串,7,java.util.Date,让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子. 这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间.Date date= new Date();System.out.println(date.getTime();在星期六, 2001年9月29日, 下午大约是6:50的样子, 上面的例子在系统输出设备上显示的结果是 1001803809710,2018/7/6,包装
4、类、时间、字符串,8,日期数据的定制格式,只要通过向SimpleDateFormat 的构造函数传递格式字符串“EEEE-MMMM-dd-yyyy, 我们就能够指明自己想要的格式. 你应该可以看见, 格式字符串中的ASCII 字符告诉格式化函数下面显示日期数据的哪一个部分. EEEE是星期, MMMM是月, dd是日, yyyy是年. 字符的个数决定了日期是如何格式化的.传递EE-MM-dd-yy会显示 Sat-09-29-01,2018/7/6,包装类、时间、字符串,9,日期数据的定制格式,SimpleDateFormat bartDateFormat =new SimpleDateForm
5、at(EEEE-MMMM-dd-yyyy);Date date = new Date(); System.out.println(bartDateFormat.format(date);,2018/7/6,包装类、时间、字符串,10,将文本数据解析成日期对象,假设我们有一个文本字符串包含了一个格式化了的日期对象, 而我们希望解析这个字符串并从文本日期数据创建一个日期对象. 我们将再次以格式化字符串MM-dd-yyyy 调用SimpleDateFormat类, 但是这一次, 我们使用格式化解析而不是生成一个文本日期数据.,2018/7/6,包装类、时间、字符串,11,将文本数据解析成日期对象,将
6、解析文本字符串9-29-2001并创建一个值为001736000000 的日期对象. SimpleDateFormat bartDateFormat = new SimpleDateFormat(MM-dd-yyyy); String dateStringToParse = 9-29-2001; Date date = bartDateFormat.parse(dateStringToParse); System.out.println(date.getTime();,2018/7/6,包装类、时间、字符串,12,使用标准的日期格式化过程,既然我们已经可以生成和解析定制的日期格式了, 让我们来
7、看一看如何使用内建的格式化过程. 方法 DateFormat.getDateTimeInstance() 让我们得以用几种不同的方法获得标准的日期格式化过程. 在下面的例子中, 我们获取了四个内建的日期格式化过程. 它们包括一个短的, 中等的, 长的, 和完整的日期格式.,2018/7/6,包装类、时间、字符串,13,使用标准的日期格式化,Date date = new Date(); DateFormat shortDateFormat = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT); DateForma
8、t mediumDateFormat =DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);DateFormat longDateFormat =DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG); DateFormat fullDateFormat =DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL); System.out.println(shortDate
9、Format.format(date); System.out.println(mediumDateFormat.format(date); System.out.println(longDateFormat.format(date); System.out.println(fullDateFormat.format(date);,2018/7/6,包装类、时间、字符串,14,使用标准的日期格式化,9/29/01 8:44 PMSep 29, 2001 8:44:45 PMSeptember 29, 2001 8:44:45 PM EDTSaturday, September 29, 2001
10、 8:44:45 PM EDT,2018/7/6,包装类、时间、字符串,15,使用标准的日期格式化,注意我们在对 getDateTimeInstance的每次调用中都传递了两个值. 第一个参数是日期风格, 而第二个参数是时间风格. 它们都是基本数据类型int(整型). 考虑到可读性, 我们使用了DateFormat 类提供的常量: SHORT, MEDIUM, LONG, 和 FULL. 要知道获取时间和日期格式化过程的更多的方法和选项,2018/7/6,包装类、时间、字符串,16,Calendar 类,我们现在已经能够格式化并创建一个日期对象了, 但是我们如何才能设置和获取日期数据的特定部分
11、呢, 比如说小时, 日, 或者分钟? 我们又如何在日期的这些部分加上或者减去值呢? 答案是使用Calendar 类.这个类也是一个抽象类,它有一个子类GregorianCalendar,接下来我会利用这个子类来演示这个过程,请看以下代码,2018/7/6,包装类、时间、字符串,17,Calendar 类,DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);GregorianCalendar cal = new GregorianCalendar();cal.setTime(new Date();System.o
12、ut.println(System Date: + dateFormat.format(cal.getTime();cal.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.FRIDAY);System.out.println(After Setting Day of Week to Friday: +dateFormat.format(cal.getTime();,2018/7/6,包装类、时间、字符串,18,Calendar 类,这段代码当中,首先创建了一个DateFormat对象进行格式设置,接着创建了一个GregorianCalen
13、dar对象cal,接着使用cal.setTime()方法设置cal对象中的时间为当前时间,然后通过format格式化由cal.getTime()返回的时间进行输出,后面利用set方法设置cal的日期为当前星期的FRIDAY,此时cal中存储的时间就是这个星期五的该时刻,而后面利用format格式化输出,假如当前时间为2005年1月27日星期4的11点30分,那么最后将那句将会输出2005年1月28日星期5的11点30分。,2018/7/6,包装类、时间、字符串,19,Calendar 类示例(CalendarExample),下面的例子CalendarExample, 它计算得到下面的第十个星
14、期五是13号. DateFormat dateFormat =DateFormat.getDateInstance(DateFormat.FULL);GregorianCalendar cal = new GregorianCalendar();cal.setTime(new Date();System.out.println(System Date: +dateFormat.format(cal.getTime();cal.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.FRIDAY);System.out.println(After
15、Setting Day of Week to Friday: + dateFormat.format(cal.getTime();int friday13Counter = 0;while (friday13Counter = 10) cal.add(GregorianCalendar.DAY_OF_MONTH, 7);If the day of month is 13 we haveif (cal.get(GregorianCalendar.DAY_OF_MONTH) = 13) friday13Counter+;System.out.println(dateFormat.format(ca
16、l.getTime();,2018/7/6,包装类、时间、字符串,20,Math类,Math类中定义了多个static方法提供常用数学运算功能 截断操作(Truncation): ceil, floor, round 取最大、最小及绝对值: max, min, abs 三角函数: sin, cos, tan, asin, acos, atan, toDegrees, toRadians 对数运算: log , exp 其它: sqrt, pow, random 常量: PI, E,2018/7/6,包装类、时间、字符串,21,Math类方法,abs()返回某数字的绝对值.参数可以是float、
17、double、long或int。如果是byte或short类型,那么它们会被强制转换成int类型。ceil()会找到下一个最大整数。例如参数为9.01时,返回10.0。为-0.1时,返回-0.0。返回比参数大的整数,而且都是双精度类型的。如果参数是整数,则该方法会返回这个参数的双精度型。floor()返回紧邻的最小整数。作用与ceil()正好相反,返回的是比参数小的整数,而且都是双精度型。如果参数为整数,则返回这个参数的双精度型。max()返回两个值中的最大值,只支持float double long int 不支持byte short。,2018/7/6,包装类、时间、字符串,22,Math
18、类方法,min()返回两个值中的最小值,只支持float double long int 不支持byte short。random()返回一个随机数,一个在0.0到1.0之间的双精度数。round()返回与某浮点数值最接近的整数值。参数可以为double和folat两种,而且支持四舍五入。例如:参数为9.01时,返回9,参数为9.5时,返回10,参数为-9.5时,返回-9。sqrt()返回某数值的平方根。如果该参数是“非数字”类型(NaN),或者小于零,则返回是NaN。,2018/7/6,包装类、时间、字符串,23,Math类使用,使用这些方法时,用法为Math.* (*为方法名)。用法如:
19、int a=Math.abs(124); int b=Math.floor(-5.2); double s=Math.sqrt(7);,2018/7/6,包装类、时间、字符串,24,Java字符串,Java语言中,把字符串作为对象来处理,类String和StringBuffer都可以用来表示一个字符串.字符串常量是用双引号括住的一串字符。Hello World!String 类对象保存不可修改的Unicode字符序列,2018/7/6,包装类、时间、字符串,25,创建字符串,生成一个空串String s=new String() ; String s=“” ; 下面用不同方法生成字符串“abc
20、”: String s =“abc” ; char chars1=a,b,c;char chars2=a,b,c,d,e;String s1=new String(chars1);String s2=new String(chars2,0,3);byte ascii1=97,98,99;byte ascii2=97,98,99,100,101;String s3=new String(ascii1,0);String s4=new String(ascii2,0,0,3);,2018/7/6,包装类、时间、字符串,26,字符串比较,String中提供的方法:equals( )和equalsIg
21、noreCase( )它们与运算符= =实现的比较是不同的。运算符= =比较两个对象是否引用同一个实例,而equals( )和equalsIgnoreCase( )则比较两个字符串中对应的每个字符值是否相同。,2018/7/6,包装类、时间、字符串,27,字符串比较,String s1 = Hello; String s2 = hello; if( s1.equals( s2 ) ) System.out.println( Strings are exactly equal including case ); else if( s1.equalsIgnoreCase( s2 ) ) Syste
22、m.out.println( Strings are equal ignoring case ); else System.out.println( Strings are not equal ); ,2018/7/6,包装类、时间、字符串,28,字符串连接,运算符+可用来实现字符串的连接:String s = He is +age+ years old.;其他类型的数据与字符串进行+运算时,将自动转换成字符串。具体过程如下:String s=new StringBuffer(he is).append(age).append(years old).toString();,2018/7/6,包
23、装类、时间、字符串,29,访问字符串, public int length() 此方法返回字符串的字符个数 public char charAt(int index) 此方法返回字符串中index位置上的字符,其中index 值的 范围是0length-1 public int indexOf(int ch) public lastIndexOf(in ch)返回字符ch在字符串中出现的第一个和最后一个的位置 public int indexOf(String str) public int lastIndexOf(String str)返回子串str中第一个字符在字符串中出现的第一个和最后一
24、个的位置 public int indexOf(int ch,int fromIndex) public lastIndexOf(in ch ,int fromIndex)返回字符ch在字符串中位置fromIndex以后出现的第一个和最后一个的位置,2018/7/6,包装类、时间、字符串,30,修改字符串, public String contat(String str);用来将当前字符串对象与给定字符串str连接起来。 public String replace(char oldChar,char newChar);用来把串中出现的所有特定字符替换成指定字符以生成新串。 public Str
25、ing substring(int beginIndex); public String substring(int beginIndex,int endIndex);用来得到字符串中指定范围内的子串。 public String toLowerCase();把串中所有的字符变成小写。 public String toUpperCase();把串中所有的字符变成大写。,2018/7/6,包装类、时间、字符串,31,用StringBuffer表示字符串,StringBuffer( ); /分配16个字符的缓冲区StringBuffer( int len ); /分配len个字符的缓冲区Strin
26、gBuffer( String s ); /除了按照s的大小分配空间外,再分配16个字符的缓冲区*/,2018/7/6,包装类、时间、字符串,32,StringBuffer类的常用方法,方法capacity()用来得到字符串缓冲区的容量,它与方法length()所返回的值通常是不同的。 如果StringBuffer操作后的字符超出已分配的缓冲区,则系统会自动为它分配额外的空间。 public synchronized StringBuffer append(String str);用来在已有字符串末尾添加一个字符串str。 public synchronized StringBuffer in
27、sert(int offset, String str);用来在字符串的索引offset位置处插入字符串str。 public synchronized void setCharAt(int index,char ch);用来设置指定索引index位置的字符值。,2018/7/6,包装类、时间、字符串,33,注意,String中对字符串的操作不是对源操作串对象本身进行的,而是对新生成的一个源操作串对象的拷贝进行的,其操作的结果不影响源串。相反,StringBuffer中对字符串的连接操作是对源串本身进行的,操作之后源串的值发生了变化,变成连接后的串。,2018/7/6,包装类、时间、字符串,3
28、4,掌握重点,熟悉包装类的几种常用方法Java时间日期的处理类及其方法Java字符串的本质和特点字符串的几种常用方法StringBuffer和String有什么不同,2018/7/6,包装类、时间、字符串,35,课后练习,/设计CalendarTest类实现显示当月的日历用递归的方法实现字符串的替换功能,即自己实现String类的replaceAll方法,2018/7/6,包装类、时间、字符串,36,递归替换字符串,public class StrTools public static void main(String args) public static String strReplace
29、(String src,String from,String to,int startpos)String srst = src;int istart = src.indexOf(from,startpos); /取从要求开始替换的位置开始算起的第一次出现from字符串的位置if (istart 0) return srst; /如果没有找到,表示替换没有必要或者已经完成,返回elseString s1 = src.substring(0,istart ); / 取从第一个字符到要求开始替换的位置开始算起找到的第一个出现from字符串的位置之前的所有字符串s1 = s1 + to; /将上面的
30、字符串和to字符串连接 String s2 = src.substring(istart + from.length(); /取找到要求替换的字符串之后的所有字符串,不包含from本身String s3 = s1 + s2 ;srst = strReplace(s3,from,to,istart + to.length(); /调用自身进行递归替换return srst;class TestStrToolspublic static void main(String src)String s1 = abcabcabcbaccabccabcabcc;String s2 = StrTools.strReplace(s1,ca,caaa,0);System.out.println(s2);return ;,