2023年6月20日发(作者:)
【⿊马程序员】第六章:JavaAPI------- 、 、期待与您交流! ----------
API(Application Programming Interface)指的是应⽤程序编程接⼝。
⼀、String 类和 StringBuffer 类 在应⽤程序中经常会⽤到字符串,所谓字符串就是指⼀连串的字符,它是由许多单个字符连接⽽成,如多个英⽂字母所组成的⼀个英⽂单词。字符串中可以包含任意字符,这些字符必须包含在⼀对双引号 " " 之内,例如 " abc " 。在 Java 中定义了 String 和 StringBuffer 两个类来封装字符串,并提供了⼀些列操作字符串的⽅法,他们都是位于 包中,因此不需要导包就可以直接使⽤。
1、String 类的初始化 在操作 String 类之前,⾸先需要对 String 类进⾏初始化,在 Java 中可以通过⼀下两种⽅式对 String 类进⾏初始化,具体如下:
1)、使⽤字符串常量直接初始化:String str = "abc"; 2)、使⽤ String 的构造⽅法初始化:String():创建⼀个内容为空的字符串;String(char[] value):根据指定字符数组创建对象;String(String value):根据指定的字符串内容创建对象。class StringDemo{ public static void main(String[] args){ //创建⼀个空的字符串 String str1 = new String(); //创建⼀个内容为 abcd 的字符串 String str2 = new String("abcd"); //创建⼀个内同为字符数组的字符串 char[] charArray = {'d','e','f'}; String str3 = new String(charArray); n("a"+str1+"b"); n(str2); n(str3); }}2、String 类的常见操作 String 类在实际开发中的应⽤⾮常⼴泛,因此灵活地使⽤ String 类是⾮常重要的,接下来介绍⼀下 String 类的常⽤的⼀些⽅法。 1)、字符串的基本操作 在程序中需要对字符串进⾏⼀些基本操作,如获取字符串长度,获得指定位置的字符等,String 类针对每⼀个操作都提供了对应的⽅法。class StringDemo1{ public static void main(String[] args){ String str = "afchaghqcthcagclka"; n("字符串的长度为:"+()); n("字符串中第⼀个字符为:"+(0)); n("字符c第⼀次出现的位置为"+f('c')); n("字符c最后⼀次出现的位置为"+dexOf('c')); }} 2)、字符串的转换操作 程序开发中经常需要对字符串进⾏转换操作,例如将字符串转换为数组的形式,将字符串的字符进⾏⼤⼩写转换等。class StringDemo{ public static void main(String[] args){ String str = "abcd"; ("将字符串转换为字符数组的结果为:"); char[] ch = Array(); for (int x=0; x<; x++){ if (x != -1){ (ch[x]+","); }else{ n(cha[x]); } } n("将int转换为String的结果为:"+f(97)); n("将字符串转换为⼤写的结果为:"+rCase()); }} 3)、字符串的替换和去空格操作 程序开发中⽤户输⼊数据时会有⼀些错误和空格,这时可以使⽤ String 类的 replace() 和 trim() ⽅法,进⾏字符串的替换和去除空格操作。class StringDemo{ public static void main(String[] args){ //替换 String str1 = "itcast"; ("replace替换结果:"+e("it","")); //去空格 String str2 = "i t c a s t"; n("trim去空格结果:"+()); n("replace去空格结果:"+e(" ","")); }} 4)、字符串的判断操作 操作字符串时经常需要进⾏⼀些判断,如判断字符串是否以指定的字符串开始、结束,是否包含指定的字符串,字符串是否为空等。class StringDemo{ public static void main(String[] args){ String s1 = "String"; String s2 = "Str"; n("判断是否以Str开头:"+With("Str")); n("判断是否以ng结尾:"+th("ng")); n("判断是否包含tri:"+ns("tri")); n("判断是否为空:"+y()); n("判断两个字符串是否相等:"+(s2)); }} 在程序中可以通过 == 和 equals() 两种⽅式对字符串进⾏⽐较,但这两种⽅式有明显的区别。equals() ⽅法⽤于⽐较两个字符串中的字符是否相等,== ⽅法⽤于⽐较两个字符串对象的地址是否相等。对于两个字符串对象,当他们的字符内容完全相同时,使⽤ equals 判断结果会为 true,但使⽤ == 判断时,结果⼀定为 false。String s1 = new String("abc");String s2 = new String("abc");m(s1 == s2);//结果为false,因为s1和s2是两个对象。m((s2));//结果为true,因为s1和s2字符内容相同 5)、字符串的截取和分割 在 String 类中针对字符串的截取和分割操作提供了两个⽅法,其中 substring() ⽅法⽤于截取字符串的⼀部分,split() ⽅法可以将字符串按照某个字符进⾏切割。class StringDemo{ public static void main(String[] args){ String str = "⽻⽑球-篮球-乒乓球"; //字符串截取操作 n("从第5个字符开始截取:"+ing(4)); n("从第5个字符截取到第6个:"+ing(4,6)); //字符串分割操作 String[] strs = ("-"); for (int x=0; x<; x++){ if (str != -1){ n(strs[x]+","); }else{ n(strs[x]); } } }}3、StringBuffer 类 由于字符串时常量,因此⼀旦创建,其内容和长度是不可变的。如果需要对⼀个字符串进⾏修改,则只能创建新的字符串。为了⽅便对字符串的修改,在 JDK 中提供了⼀个 StringBuffer 类(也称字符串缓冲区)。StringBuffer 类和 String 类最⼤的区别在于它的内同和长度都是可以改变的。StringBuffer 类似⼀个字符容器,当在其中添加或删除字符时,并不会产⽣新的 StringBuffer 对象。 针对添加和删除字符的操作,StringBuffer 类提供了⼀系列的⽅法。class StringDemo{ public static void main(String[] args){ n("1、添加-------------"); add(); n("2、删除-------------"); remove(); n("3、修改-------------"); alter(); } public static void add(){ StringBuffer sb = new StringBuffer(); ("abcdefg"); n("append结果:"+sb); (2,"123"); n("insert结果:"+sb); } public static void remove(){ StringBuffer sb = new StringBuffer("abcdefg"); (1,5); n("删除1~5的字符:"+sb); CharAt(2); n("删除指定位置的字符:"+sb); (0,()); n("清空字符串缓冲区:"+sb); } public static void alter(){ StringBuffer sb = new StringBuffer("abcdefg"); rAt(0,"p"); n("修改指定位置字符:"+sb); e(1,3,"qq"); n("替换指定位置字符:"+sb); }} StringBuffer 类和String 类有很多相似之处,初学者在使⽤时很容易混淆。接下来针对两个类进⾏对⽐。String 类表⽰的字符串时常量,⼀旦创建后,内容和长度都是⽆法改变的。⽽ StringBuffer 表⽰字符容器,其内容和长度都可以随时修改。在操作字符串时如果该字符串仅⽤于表⽰数据类型,则使⽤ String 类即可,但是如果需要对字符串中的字符进⾏增删操作,则使⽤ StringBuffer 类。String 类覆盖了 Object 类的 equals() ⽅法,⽽ StringBuffer 类没有覆盖 Object 类的 equals() ⽅法,⽰例如下:String s1 = new String("abc");String s2 = new String("abc");m((s2));//结果为trueStringBuffer sb1 = new StringBuffer("abc");StringBuffer sb2 = new StringBuffer("abc");m((sb2));//结果为falseString 类对象可以⽤操作符 + 进⾏连接,⽽ StringBuffer 类对象之间不能,⽰例如下:String s1 = new String("a");String s2 = new String("b");m(s1+s2);//打印abStringBuffer sb1 = new StringBuffer("a");StringBuffer sb2 = new StringBuffer("b");m(sb1+sb2);//编译报错⼆、System 类与 Runtime 类1、System 类 System 类定义了⼀些与系统相关的属性和⽅法,它所提供的属性和⽅法都是静态的,因此想要使⽤这些属性和⽅法,直接使⽤ System类调⽤即可。 1)、getProperties() ⽅法 System 类的 getProperties() ⽅法⽤于获取当前系统的全部属性,该⽅法会返回⼀个 Properties 对象,其中封装了系统的所有属性,这些属性是以键值对的形式存在。import .*;class SystemDemo{ public static void main(String[] args){ //获取当前系统属性 Properties properties = perties(); //获得所有系统属性的key,返回Enumeration对象 Enumeration propertyNames = tyNames(); //循环获取系统属性的键和值 while(eElements()){ String key = (String)ement(); String value = perty(key); n(key+"<-->"+value); } }} 2)、currentTimeMillis() ⽅法 currentTimeMillis() ⽅法返回⼀个 long 类型的值,该值表⽰当前时间与 1970 年 1 ⽉ 1 ⽇ 0 点 0 分 0 秒之间的时间差,单位是毫秒,习惯性的被称为时间戳。import .*;class SystemDemo2{ public static void main(String[] args){ long startTime = tTimeMillis(); int num = 0; for(int x=0;x<10000000;x++){ num += x; } long endTime = tTimeMillis(); n("程序的运⾏时间为:"+(endTime-startTime)+"毫秒"); }} 3)、arraycopy(Object src,int srcPos,Object dest,int destPos,int length) arraycopy() ⽅法⽤于将⼀个数组中的元素快速拷贝到另⼀个数组中,其中的参数作⽤如下:
src:表⽰源数组;dest:表⽰⽬标数组;srcPos:表⽰源数组中拷贝元素的起始位置;destPos:表⽰拷贝到⽬标数组的起始位置;length:表⽰拷贝元素的个数。 需要注意的是,在进⾏数组复制时,⽬标数组必须有⾜够的空间来存放拷贝的元素,否则会发⽣⾓标越界异常。import .*;class SystemDemo3{ public static void main(String[] args){ int[] fromArray = {101,102,103,104,105,106}; int[] toArray = {201,202,203,204,205,206,207}; opy(fromArray,2,toArray,3,4); for(int x=0;x<;x++){ n(x+":"+toArray[x]); } }} 除了以上涉及到的⽅法,System 类还有两个常见的⽅法,分别是 gc() 和 exit(int status) ⽅法。其中 gc() ⽅法⽤来启动 Java 的垃圾回收器,并且对内存中的垃圾对象进⾏回收。exit(int status) ⽅法⽤来终⽌正在运⾏的 Java 虚拟机,其中的参数 status ⽤于表⽰当前⽅式的异常状态,通常指定为 0,表⽰正常退出,否则表⽰异常终⽌。2、Runtime 类 Runtime 类⽤于表⽰虚拟机运⾏时的状态,它⽤于封装 JVM 虚拟机进程。每次使⽤ java 命令启动虚拟机都对应⼀个 Runtime 实例,并且只有⼀个实例,因此该类使⽤单例设计模式,对象不可以直接实例化。若想在程序中获得⼀个 Runtime 实例,只能通过以下⽅法: Runtime run = time(); 由于 Runtime 类封装了虚拟机进程,因此在程序中通常会通过该类的实例对象来获取当前虚拟机的相关信息。class RuntimeDemo{ public static void main(String[] args){ Runtime rt = time(); n("处理器的个数:"+bleProcessors()+"个"); n("空闲内存⼤⼩:"+mory()/1024/1024+"M"); n("最⼤可⽤内存数量:"+ory()/1024/1024+"M"); }} 需要注意的是,由于每个⼈的机器的配置不同,打印的结果可能不同,另外空闲内存数和可⽤最⼤内存数都是以字节为单位计算的。 Runtime 类中提供了⼀个 exec() ⽅法,该⽅法⽤于执⾏⼀个 dos 命令,从⽽实现和在命令⾏窗⼝输⼊ dos 命令同样的效果。exec() ⽅法返回⼀个 Process 对象,该对象表⽰操作系统的⼀个进程,通过该对象可以对产⽣的新进程管理,如关闭此进程只需要调⽤ destory()⽅法即可。class RuntimeDemo{ public static void main(String[] args){ Runtime rt = time(); Process process = (""); (3000); y(); }}三、Math 类与 Random 类1、Math 类 Math 类是数学操作类,提供了⼀系列⽤于数学运算的静态⽅法,包括求绝对值、三⾓函数等,Math 类有两个静态常量 PI 和 E,分别代表数学常量 π 和 e 。class MathDemo{ public static void main(String[] args){ n("绝对值:"+(-1)); n("最⼩整数:"+(5.6)); n("最⼤整数:"+(-2.1)); n("四舍五⼊:"+(-4.6)); n("⽐较最⼤值:"+(2.1,-2.1)); n("⽐较最⼩值:"+(2.1,-2.1)); n("随机数:"+()); }} 需要注意的是,round() ⽅法⽤于对某个⼩数进⾏四舍五⼊,此⽅法会将⼩数点后⾯的数字全部忽略,返回⼀个 int 值;⽽ ceil() ⽅法和floor() ⽅法返回的都是 double 类型的数,这个数在数值上等于⼀个整数。2、Random 类 在 JDK 的 包中有⼀个 Random 类,它可以在指定的取值范围内随机产⽣数字。 在 Random 类中提供了两个构造⽅法,其中第⼀个构造⽅法是⽆参的,通过它创建的 Random 实例对象每次使⽤的种⼦是随机的,因此每个对象产⽣的随机数不同。import ;class RandomDemo1{ public static void main(String[] args){ Random r = new Random(); for(int x=0;x<10;x++){ n(t(100)); }} 如果希望创建的多个 Random 实例对象产⽣相同序列的随机数,则可以在创建对象时调⽤第⼆个构造⽅法,传⼊相同的种⼦即可。import ;class RandomDemo2{ public static void main(String[] args){ Random r = new Random(13); for(int x=0;x<10;x++){ n(t(100)); }} 从运⾏结果看,因为创建 Random 的实例对象时没有指定种⼦,系统会以当前时间戳为种⼦,产⽣随机数。如果指定了相同的种⼦,则每个实例对象产⽣的随机数具有相同的序列。 相对于 Math 类的 random() ⽅法⽽⾔,Random 类提供了更多的⽅法来⽣产各种伪随机数,不仅可以⽣成证书类型的随机数,还可以⽣成浮点类型的随机数,下⾯列举了 Random 类中的常⽤⽅法。import ;class RandomDemo3{ public static void main(String[] args){ Random r = new Random(13); for(int x=0;x<10;x++){ n("产⽣float类型随机数:"+oat()); n("产证0~100之间的随机数:"+t(100)); n("产⽣double类型的随机数:"+uble()); }}四、包装类 在 Java 中,很多类的⽅法都需要接收引⽤类型的对象,此时就⽆法将⼀个基本数据类型的值传⼊。为了解决这样的问题,JDK 中提供了⼀系列的包装类,通过这些包装类可以将基本数据类型的值包装为引⽤数据类型的对象。 每种基本数据类型都有对应的包装类,其中除了 Integer 和 Character 类,其他包装类的名称和基本数据类型的名称⼀致,只是类名的第⼀个字母⼤写即可。 包装类和基本数据类型在进⾏转换时,引⼊了装箱和拆箱的概念,其中装箱是指将基本数据类型的值转为引⽤数据类型;反之,拆箱是指将引⽤数据类型的对象转为基本数据类型。 Integer 类的⼀些特有⽅法: 使⽤包装类需要注意以下⼏点:包装类都重写了 Object 类中的 toString() ⽅法,以字符串的形式返回被包装的基本数据类型的值。除了 Character 外,包装类都有 valueOf(String s) ⽅法,可以根据 String 类型的参数创建包装类对象,但参数字符串 s 不能为null,⽽且字符串必须是可以解析为相应基本类型的数据,否则虽然编译通过,但是运⾏时会报错。除了 Character 外,包装类都有 parseXXX(String s) 的静态⽅法,将字符串转换为对应的基本类型的数据,参数 s 不能为 null,⽽且同样必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运⾏时报错。五、Date 类、Calendar 类与 DateFormat 类 在 Java 程序中,针对⽇期类型的操作提供了三个类,分别是 、ar 和 rmat。1、Date 类 在 JDK 的 包中提供了⼀个 Date 类⽤于表⽰⽇期和时间。Date 类中⼤部分构造⽅法都被声明已过时,只有两个构造⽅法是建议使⽤的:1)、⼀个是⽆参的构造⽅法 Date() ,⽤来创建当前⽇期时间的 Date 对象;2)、另⼀个是接收 long 类型参数的 Date(long date),⽤于创建指定时间的 Date 对象,其中 date 参数表⽰ 1970 年 1 ⽉ 1 ⽇ 00:00:00 (称为历元)以来的毫秒数,即时间戳。import .*;class DateDemo{ public static void main(String[] args){ Date date1 = new Date(); Date date2 = new Date(966666666661); n(date1); n(date2); }} 对于 Date 类,只需要了解如何通过创建对象封装时间值即可。由于 Date 类在设计之初,没有考虑国际化的问题,因此从 JDK1.1 开始,Calendar 类取代了 Date 类⼤部分功能。2、Calendar 类 Calender 类⽤于完成⽇期和时间字段的操作,它可以通过特定的⽅法设置和读取⽇期的特定部分,⽐如年、⽉、⽇、时、分和秒等。Calendar 类是⼀个抽象类,不可以被实例化,在程序中需要调⽤其静态⽅法 getInstance() 来得到⼀个 Calendar 对象,然后调⽤其相应的⽅法。 Calendar calendar = tance(); Calendar 类为操作⽇期和时间提供了⼤量的⽅法,下⾯列举了⼀些常见的⽅法: 在这些⽅法中都⽤到了 int 类型的参数 field,该参数需要接受 Calendar 类中定义的常量值,这些常量值分别表⽰不同的字段,如 ⽤于表⽰年份,⽤于表⽰⽉份, ⽤于表⽰秒等。其中在使⽤ 字段时尤其需要注意,⽉份的起始值是从 0 开始⽽不是 1,。import .*;class CalendarDemo{ public static void main(String[] args){ //获取当前⽇期 Calendar calendar1 = tance(); int year = (); int month = ()+1; int date = (); int hour = (); int minute = (); int second = (); n("当前时间为"+year+"年"+month+"⽉"+date+"⽇"+hour+"时"+minute+"分"+second+"秒"); //设置或修改某个时间 Calendar calendar2 = tance(); (2008,7,8); (,100); int year2 = (); int month2 = ()+1; int date2 = (); n("100天后的⽇期为"+year2+"年"+month2+"⽉"+date2+"⽇"); }} Calendar 类的 getTime() ⽅法返回⼀个表⽰ Calendar 时间值的 Date 对象,同时 Calendar 有⼀个 setTime() ⽅法接收 Date 对象,将 Date 对象表⽰的时间值设置给 Calendar 对象,通过这两个⽅法可以完成 Date 和 Calendar 对象之间的转换。3、DateFormat 类 DateFormat 类专门⽤于将⽇期格式化为字符串或者⽤特定格式显⽰的⽇期字符串转换为⼀个 Date 对象。DateFormat 是抽象类,不能被直接实例化,但它提供了静态⽅法,通过这些⽅法可以获取 DateFormat 类的实例对象,并调⽤其他相应的⽅法进⾏操作。 DateFormat 类汇总提供的常见⽅法如下表,DateFormat 类的四个静态⽅法都⽤于获得 DateFormat 类的实例对象,每种⽅法返回的对象都具有不同的作⽤,他们可以分别对⽇期或事件部分进⾏格式化。在 DateFormat 类中定义了四个常量值⽤于作为参数传递给这些⽅法,其中包含 FULL、LONG、MEDIUM 和 SHORT。FULL 常量⽤于表⽰完成格式,LONG 常量⽤于表⽰长格式,MEDIUM 常量⽤于表⽰普通格式,SHORT 常量⽤于表⽰短格式。import .*;class DateFormatDemo1{ public static void main(String[] args){ Date date = new Date(); DateFormat fullFormat = eInstance(); DateFormat longFormat = eInstance(); DateFormat mediumFormat = eTimeInstance(,); DateFormat shortFormat = eTimeInstance(,); n("当前⽇期的完整格式:"+(date)); n("当前⽇期的长格式:"+(date)); n("当前⽇期的普通格式:"+(date)); n("当前⽇期的短格式:"+(date)); }}import .*;class DateFormatDemo2{ public static void main(String[] args){ DateFormat df = tance(); String d = "2008年8⽉8⽇"; n((d));}4、SimpleFormat 类 在使⽤ DateFormat 对象将字符串解析为⽇期时,需要输⼊固定格式的字符串,这显然不够灵活。JDK 中提供了⼀个SimpleDateFormat 类,该类时 DateFormat 的⼦类。SimpleDateFormat 类可以使⽤ new 关键字创建实例对象,它的构造⽅法接收⼀个格式字符串参数,表⽰⽇期格式模板。import .*;class SimpleDateFormatDemo1{ public static void main(String[] args){ SimpleDateFormat sdf = new SimpleDateFormat("Gyyyy年MM⽉dd⽇:今天是yyyy年的第D天,E"); n((new Date()));}import .*;class SimpleDateFormatDemo2{ public static void main(String[] args){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MMM/dd"); String dt = "2012年/8⽉/8⽇"; n((dt));}六、JDK7 新特性 在 JDK7 中,switch 语句的判断条件增加了对字符串类型的⽀持,由于字符串的操作在编程中使⽤频繁,这个新特性的出现为 Java 编程带来了⽅便。import .*;class SwitchDemo{ public static void main(String[] args){ String week = "Friday"; switch(week){ case "Monday": n("星期⼀"); break; case "Tuesday": n("星期⼆"); break; case "Wednesday": n("星期三"); break; case "Thursday": n("星期四"); break; case "Friday": n("星期五"); break; case "Saturday": n("星期六"); break; case "Sunday": n("星期⽇"); break; default: n("您的输⼊有误!"); }}
2023年6月20日发(作者:)
【⿊马程序员】第六章:JavaAPI------- 、 、期待与您交流! ----------
API(Application Programming Interface)指的是应⽤程序编程接⼝。
⼀、String 类和 StringBuffer 类 在应⽤程序中经常会⽤到字符串,所谓字符串就是指⼀连串的字符,它是由许多单个字符连接⽽成,如多个英⽂字母所组成的⼀个英⽂单词。字符串中可以包含任意字符,这些字符必须包含在⼀对双引号 " " 之内,例如 " abc " 。在 Java 中定义了 String 和 StringBuffer 两个类来封装字符串,并提供了⼀些列操作字符串的⽅法,他们都是位于 包中,因此不需要导包就可以直接使⽤。
1、String 类的初始化 在操作 String 类之前,⾸先需要对 String 类进⾏初始化,在 Java 中可以通过⼀下两种⽅式对 String 类进⾏初始化,具体如下:
1)、使⽤字符串常量直接初始化:String str = "abc"; 2)、使⽤ String 的构造⽅法初始化:String():创建⼀个内容为空的字符串;String(char[] value):根据指定字符数组创建对象;String(String value):根据指定的字符串内容创建对象。class StringDemo{ public static void main(String[] args){ //创建⼀个空的字符串 String str1 = new String(); //创建⼀个内容为 abcd 的字符串 String str2 = new String("abcd"); //创建⼀个内同为字符数组的字符串 char[] charArray = {'d','e','f'}; String str3 = new String(charArray); n("a"+str1+"b"); n(str2); n(str3); }}2、String 类的常见操作 String 类在实际开发中的应⽤⾮常⼴泛,因此灵活地使⽤ String 类是⾮常重要的,接下来介绍⼀下 String 类的常⽤的⼀些⽅法。 1)、字符串的基本操作 在程序中需要对字符串进⾏⼀些基本操作,如获取字符串长度,获得指定位置的字符等,String 类针对每⼀个操作都提供了对应的⽅法。class StringDemo1{ public static void main(String[] args){ String str = "afchaghqcthcagclka"; n("字符串的长度为:"+()); n("字符串中第⼀个字符为:"+(0)); n("字符c第⼀次出现的位置为"+f('c')); n("字符c最后⼀次出现的位置为"+dexOf('c')); }} 2)、字符串的转换操作 程序开发中经常需要对字符串进⾏转换操作,例如将字符串转换为数组的形式,将字符串的字符进⾏⼤⼩写转换等。class StringDemo{ public static void main(String[] args){ String str = "abcd"; ("将字符串转换为字符数组的结果为:"); char[] ch = Array(); for (int x=0; x<; x++){ if (x != -1){ (ch[x]+","); }else{ n(cha[x]); } } n("将int转换为String的结果为:"+f(97)); n("将字符串转换为⼤写的结果为:"+rCase()); }} 3)、字符串的替换和去空格操作 程序开发中⽤户输⼊数据时会有⼀些错误和空格,这时可以使⽤ String 类的 replace() 和 trim() ⽅法,进⾏字符串的替换和去除空格操作。class StringDemo{ public static void main(String[] args){ //替换 String str1 = "itcast"; ("replace替换结果:"+e("it","")); //去空格 String str2 = "i t c a s t"; n("trim去空格结果:"+()); n("replace去空格结果:"+e(" ","")); }} 4)、字符串的判断操作 操作字符串时经常需要进⾏⼀些判断,如判断字符串是否以指定的字符串开始、结束,是否包含指定的字符串,字符串是否为空等。class StringDemo{ public static void main(String[] args){ String s1 = "String"; String s2 = "Str"; n("判断是否以Str开头:"+With("Str")); n("判断是否以ng结尾:"+th("ng")); n("判断是否包含tri:"+ns("tri")); n("判断是否为空:"+y()); n("判断两个字符串是否相等:"+(s2)); }} 在程序中可以通过 == 和 equals() 两种⽅式对字符串进⾏⽐较,但这两种⽅式有明显的区别。equals() ⽅法⽤于⽐较两个字符串中的字符是否相等,== ⽅法⽤于⽐较两个字符串对象的地址是否相等。对于两个字符串对象,当他们的字符内容完全相同时,使⽤ equals 判断结果会为 true,但使⽤ == 判断时,结果⼀定为 false。String s1 = new String("abc");String s2 = new String("abc");m(s1 == s2);//结果为false,因为s1和s2是两个对象。m((s2));//结果为true,因为s1和s2字符内容相同 5)、字符串的截取和分割 在 String 类中针对字符串的截取和分割操作提供了两个⽅法,其中 substring() ⽅法⽤于截取字符串的⼀部分,split() ⽅法可以将字符串按照某个字符进⾏切割。class StringDemo{ public static void main(String[] args){ String str = "⽻⽑球-篮球-乒乓球"; //字符串截取操作 n("从第5个字符开始截取:"+ing(4)); n("从第5个字符截取到第6个:"+ing(4,6)); //字符串分割操作 String[] strs = ("-"); for (int x=0; x<; x++){ if (str != -1){ n(strs[x]+","); }else{ n(strs[x]); } } }}3、StringBuffer 类 由于字符串时常量,因此⼀旦创建,其内容和长度是不可变的。如果需要对⼀个字符串进⾏修改,则只能创建新的字符串。为了⽅便对字符串的修改,在 JDK 中提供了⼀个 StringBuffer 类(也称字符串缓冲区)。StringBuffer 类和 String 类最⼤的区别在于它的内同和长度都是可以改变的。StringBuffer 类似⼀个字符容器,当在其中添加或删除字符时,并不会产⽣新的 StringBuffer 对象。 针对添加和删除字符的操作,StringBuffer 类提供了⼀系列的⽅法。class StringDemo{ public static void main(String[] args){ n("1、添加-------------"); add(); n("2、删除-------------"); remove(); n("3、修改-------------"); alter(); } public static void add(){ StringBuffer sb = new StringBuffer(); ("abcdefg"); n("append结果:"+sb); (2,"123"); n("insert结果:"+sb); } public static void remove(){ StringBuffer sb = new StringBuffer("abcdefg"); (1,5); n("删除1~5的字符:"+sb); CharAt(2); n("删除指定位置的字符:"+sb); (0,()); n("清空字符串缓冲区:"+sb); } public static void alter(){ StringBuffer sb = new StringBuffer("abcdefg"); rAt(0,"p"); n("修改指定位置字符:"+sb); e(1,3,"qq"); n("替换指定位置字符:"+sb); }} StringBuffer 类和String 类有很多相似之处,初学者在使⽤时很容易混淆。接下来针对两个类进⾏对⽐。String 类表⽰的字符串时常量,⼀旦创建后,内容和长度都是⽆法改变的。⽽ StringBuffer 表⽰字符容器,其内容和长度都可以随时修改。在操作字符串时如果该字符串仅⽤于表⽰数据类型,则使⽤ String 类即可,但是如果需要对字符串中的字符进⾏增删操作,则使⽤ StringBuffer 类。String 类覆盖了 Object 类的 equals() ⽅法,⽽ StringBuffer 类没有覆盖 Object 类的 equals() ⽅法,⽰例如下:String s1 = new String("abc");String s2 = new String("abc");m((s2));//结果为trueStringBuffer sb1 = new StringBuffer("abc");StringBuffer sb2 = new StringBuffer("abc");m((sb2));//结果为falseString 类对象可以⽤操作符 + 进⾏连接,⽽ StringBuffer 类对象之间不能,⽰例如下:String s1 = new String("a");String s2 = new String("b");m(s1+s2);//打印abStringBuffer sb1 = new StringBuffer("a");StringBuffer sb2 = new StringBuffer("b");m(sb1+sb2);//编译报错⼆、System 类与 Runtime 类1、System 类 System 类定义了⼀些与系统相关的属性和⽅法,它所提供的属性和⽅法都是静态的,因此想要使⽤这些属性和⽅法,直接使⽤ System类调⽤即可。 1)、getProperties() ⽅法 System 类的 getProperties() ⽅法⽤于获取当前系统的全部属性,该⽅法会返回⼀个 Properties 对象,其中封装了系统的所有属性,这些属性是以键值对的形式存在。import .*;class SystemDemo{ public static void main(String[] args){ //获取当前系统属性 Properties properties = perties(); //获得所有系统属性的key,返回Enumeration对象 Enumeration propertyNames = tyNames(); //循环获取系统属性的键和值 while(eElements()){ String key = (String)ement(); String value = perty(key); n(key+"<-->"+value); } }} 2)、currentTimeMillis() ⽅法 currentTimeMillis() ⽅法返回⼀个 long 类型的值,该值表⽰当前时间与 1970 年 1 ⽉ 1 ⽇ 0 点 0 分 0 秒之间的时间差,单位是毫秒,习惯性的被称为时间戳。import .*;class SystemDemo2{ public static void main(String[] args){ long startTime = tTimeMillis(); int num = 0; for(int x=0;x<10000000;x++){ num += x; } long endTime = tTimeMillis(); n("程序的运⾏时间为:"+(endTime-startTime)+"毫秒"); }} 3)、arraycopy(Object src,int srcPos,Object dest,int destPos,int length) arraycopy() ⽅法⽤于将⼀个数组中的元素快速拷贝到另⼀个数组中,其中的参数作⽤如下:
src:表⽰源数组;dest:表⽰⽬标数组;srcPos:表⽰源数组中拷贝元素的起始位置;destPos:表⽰拷贝到⽬标数组的起始位置;length:表⽰拷贝元素的个数。 需要注意的是,在进⾏数组复制时,⽬标数组必须有⾜够的空间来存放拷贝的元素,否则会发⽣⾓标越界异常。import .*;class SystemDemo3{ public static void main(String[] args){ int[] fromArray = {101,102,103,104,105,106}; int[] toArray = {201,202,203,204,205,206,207}; opy(fromArray,2,toArray,3,4); for(int x=0;x<;x++){ n(x+":"+toArray[x]); } }} 除了以上涉及到的⽅法,System 类还有两个常见的⽅法,分别是 gc() 和 exit(int status) ⽅法。其中 gc() ⽅法⽤来启动 Java 的垃圾回收器,并且对内存中的垃圾对象进⾏回收。exit(int status) ⽅法⽤来终⽌正在运⾏的 Java 虚拟机,其中的参数 status ⽤于表⽰当前⽅式的异常状态,通常指定为 0,表⽰正常退出,否则表⽰异常终⽌。2、Runtime 类 Runtime 类⽤于表⽰虚拟机运⾏时的状态,它⽤于封装 JVM 虚拟机进程。每次使⽤ java 命令启动虚拟机都对应⼀个 Runtime 实例,并且只有⼀个实例,因此该类使⽤单例设计模式,对象不可以直接实例化。若想在程序中获得⼀个 Runtime 实例,只能通过以下⽅法: Runtime run = time(); 由于 Runtime 类封装了虚拟机进程,因此在程序中通常会通过该类的实例对象来获取当前虚拟机的相关信息。class RuntimeDemo{ public static void main(String[] args){ Runtime rt = time(); n("处理器的个数:"+bleProcessors()+"个"); n("空闲内存⼤⼩:"+mory()/1024/1024+"M"); n("最⼤可⽤内存数量:"+ory()/1024/1024+"M"); }} 需要注意的是,由于每个⼈的机器的配置不同,打印的结果可能不同,另外空闲内存数和可⽤最⼤内存数都是以字节为单位计算的。 Runtime 类中提供了⼀个 exec() ⽅法,该⽅法⽤于执⾏⼀个 dos 命令,从⽽实现和在命令⾏窗⼝输⼊ dos 命令同样的效果。exec() ⽅法返回⼀个 Process 对象,该对象表⽰操作系统的⼀个进程,通过该对象可以对产⽣的新进程管理,如关闭此进程只需要调⽤ destory()⽅法即可。class RuntimeDemo{ public static void main(String[] args){ Runtime rt = time(); Process process = (""); (3000); y(); }}三、Math 类与 Random 类1、Math 类 Math 类是数学操作类,提供了⼀系列⽤于数学运算的静态⽅法,包括求绝对值、三⾓函数等,Math 类有两个静态常量 PI 和 E,分别代表数学常量 π 和 e 。class MathDemo{ public static void main(String[] args){ n("绝对值:"+(-1)); n("最⼩整数:"+(5.6)); n("最⼤整数:"+(-2.1)); n("四舍五⼊:"+(-4.6)); n("⽐较最⼤值:"+(2.1,-2.1)); n("⽐较最⼩值:"+(2.1,-2.1)); n("随机数:"+()); }} 需要注意的是,round() ⽅法⽤于对某个⼩数进⾏四舍五⼊,此⽅法会将⼩数点后⾯的数字全部忽略,返回⼀个 int 值;⽽ ceil() ⽅法和floor() ⽅法返回的都是 double 类型的数,这个数在数值上等于⼀个整数。2、Random 类 在 JDK 的 包中有⼀个 Random 类,它可以在指定的取值范围内随机产⽣数字。 在 Random 类中提供了两个构造⽅法,其中第⼀个构造⽅法是⽆参的,通过它创建的 Random 实例对象每次使⽤的种⼦是随机的,因此每个对象产⽣的随机数不同。import ;class RandomDemo1{ public static void main(String[] args){ Random r = new Random(); for(int x=0;x<10;x++){ n(t(100)); }} 如果希望创建的多个 Random 实例对象产⽣相同序列的随机数,则可以在创建对象时调⽤第⼆个构造⽅法,传⼊相同的种⼦即可。import ;class RandomDemo2{ public static void main(String[] args){ Random r = new Random(13); for(int x=0;x<10;x++){ n(t(100)); }} 从运⾏结果看,因为创建 Random 的实例对象时没有指定种⼦,系统会以当前时间戳为种⼦,产⽣随机数。如果指定了相同的种⼦,则每个实例对象产⽣的随机数具有相同的序列。 相对于 Math 类的 random() ⽅法⽽⾔,Random 类提供了更多的⽅法来⽣产各种伪随机数,不仅可以⽣成证书类型的随机数,还可以⽣成浮点类型的随机数,下⾯列举了 Random 类中的常⽤⽅法。import ;class RandomDemo3{ public static void main(String[] args){ Random r = new Random(13); for(int x=0;x<10;x++){ n("产⽣float类型随机数:"+oat()); n("产证0~100之间的随机数:"+t(100)); n("产⽣double类型的随机数:"+uble()); }}四、包装类 在 Java 中,很多类的⽅法都需要接收引⽤类型的对象,此时就⽆法将⼀个基本数据类型的值传⼊。为了解决这样的问题,JDK 中提供了⼀系列的包装类,通过这些包装类可以将基本数据类型的值包装为引⽤数据类型的对象。 每种基本数据类型都有对应的包装类,其中除了 Integer 和 Character 类,其他包装类的名称和基本数据类型的名称⼀致,只是类名的第⼀个字母⼤写即可。 包装类和基本数据类型在进⾏转换时,引⼊了装箱和拆箱的概念,其中装箱是指将基本数据类型的值转为引⽤数据类型;反之,拆箱是指将引⽤数据类型的对象转为基本数据类型。 Integer 类的⼀些特有⽅法: 使⽤包装类需要注意以下⼏点:包装类都重写了 Object 类中的 toString() ⽅法,以字符串的形式返回被包装的基本数据类型的值。除了 Character 外,包装类都有 valueOf(String s) ⽅法,可以根据 String 类型的参数创建包装类对象,但参数字符串 s 不能为null,⽽且字符串必须是可以解析为相应基本类型的数据,否则虽然编译通过,但是运⾏时会报错。除了 Character 外,包装类都有 parseXXX(String s) 的静态⽅法,将字符串转换为对应的基本类型的数据,参数 s 不能为 null,⽽且同样必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运⾏时报错。五、Date 类、Calendar 类与 DateFormat 类 在 Java 程序中,针对⽇期类型的操作提供了三个类,分别是 、ar 和 rmat。1、Date 类 在 JDK 的 包中提供了⼀个 Date 类⽤于表⽰⽇期和时间。Date 类中⼤部分构造⽅法都被声明已过时,只有两个构造⽅法是建议使⽤的:1)、⼀个是⽆参的构造⽅法 Date() ,⽤来创建当前⽇期时间的 Date 对象;2)、另⼀个是接收 long 类型参数的 Date(long date),⽤于创建指定时间的 Date 对象,其中 date 参数表⽰ 1970 年 1 ⽉ 1 ⽇ 00:00:00 (称为历元)以来的毫秒数,即时间戳。import .*;class DateDemo{ public static void main(String[] args){ Date date1 = new Date(); Date date2 = new Date(966666666661); n(date1); n(date2); }} 对于 Date 类,只需要了解如何通过创建对象封装时间值即可。由于 Date 类在设计之初,没有考虑国际化的问题,因此从 JDK1.1 开始,Calendar 类取代了 Date 类⼤部分功能。2、Calendar 类 Calender 类⽤于完成⽇期和时间字段的操作,它可以通过特定的⽅法设置和读取⽇期的特定部分,⽐如年、⽉、⽇、时、分和秒等。Calendar 类是⼀个抽象类,不可以被实例化,在程序中需要调⽤其静态⽅法 getInstance() 来得到⼀个 Calendar 对象,然后调⽤其相应的⽅法。 Calendar calendar = tance(); Calendar 类为操作⽇期和时间提供了⼤量的⽅法,下⾯列举了⼀些常见的⽅法: 在这些⽅法中都⽤到了 int 类型的参数 field,该参数需要接受 Calendar 类中定义的常量值,这些常量值分别表⽰不同的字段,如 ⽤于表⽰年份,⽤于表⽰⽉份, ⽤于表⽰秒等。其中在使⽤ 字段时尤其需要注意,⽉份的起始值是从 0 开始⽽不是 1,。import .*;class CalendarDemo{ public static void main(String[] args){ //获取当前⽇期 Calendar calendar1 = tance(); int year = (); int month = ()+1; int date = (); int hour = (); int minute = (); int second = (); n("当前时间为"+year+"年"+month+"⽉"+date+"⽇"+hour+"时"+minute+"分"+second+"秒"); //设置或修改某个时间 Calendar calendar2 = tance(); (2008,7,8); (,100); int year2 = (); int month2 = ()+1; int date2 = (); n("100天后的⽇期为"+year2+"年"+month2+"⽉"+date2+"⽇"); }} Calendar 类的 getTime() ⽅法返回⼀个表⽰ Calendar 时间值的 Date 对象,同时 Calendar 有⼀个 setTime() ⽅法接收 Date 对象,将 Date 对象表⽰的时间值设置给 Calendar 对象,通过这两个⽅法可以完成 Date 和 Calendar 对象之间的转换。3、DateFormat 类 DateFormat 类专门⽤于将⽇期格式化为字符串或者⽤特定格式显⽰的⽇期字符串转换为⼀个 Date 对象。DateFormat 是抽象类,不能被直接实例化,但它提供了静态⽅法,通过这些⽅法可以获取 DateFormat 类的实例对象,并调⽤其他相应的⽅法进⾏操作。 DateFormat 类汇总提供的常见⽅法如下表,DateFormat 类的四个静态⽅法都⽤于获得 DateFormat 类的实例对象,每种⽅法返回的对象都具有不同的作⽤,他们可以分别对⽇期或事件部分进⾏格式化。在 DateFormat 类中定义了四个常量值⽤于作为参数传递给这些⽅法,其中包含 FULL、LONG、MEDIUM 和 SHORT。FULL 常量⽤于表⽰完成格式,LONG 常量⽤于表⽰长格式,MEDIUM 常量⽤于表⽰普通格式,SHORT 常量⽤于表⽰短格式。import .*;class DateFormatDemo1{ public static void main(String[] args){ Date date = new Date(); DateFormat fullFormat = eInstance(); DateFormat longFormat = eInstance(); DateFormat mediumFormat = eTimeInstance(,); DateFormat shortFormat = eTimeInstance(,); n("当前⽇期的完整格式:"+(date)); n("当前⽇期的长格式:"+(date)); n("当前⽇期的普通格式:"+(date)); n("当前⽇期的短格式:"+(date)); }}import .*;class DateFormatDemo2{ public static void main(String[] args){ DateFormat df = tance(); String d = "2008年8⽉8⽇"; n((d));}4、SimpleFormat 类 在使⽤ DateFormat 对象将字符串解析为⽇期时,需要输⼊固定格式的字符串,这显然不够灵活。JDK 中提供了⼀个SimpleDateFormat 类,该类时 DateFormat 的⼦类。SimpleDateFormat 类可以使⽤ new 关键字创建实例对象,它的构造⽅法接收⼀个格式字符串参数,表⽰⽇期格式模板。import .*;class SimpleDateFormatDemo1{ public static void main(String[] args){ SimpleDateFormat sdf = new SimpleDateFormat("Gyyyy年MM⽉dd⽇:今天是yyyy年的第D天,E"); n((new Date()));}import .*;class SimpleDateFormatDemo2{ public static void main(String[] args){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MMM/dd"); String dt = "2012年/8⽉/8⽇"; n((dt));}六、JDK7 新特性 在 JDK7 中,switch 语句的判断条件增加了对字符串类型的⽀持,由于字符串的操作在编程中使⽤频繁,这个新特性的出现为 Java 编程带来了⽅便。import .*;class SwitchDemo{ public static void main(String[] args){ String week = "Friday"; switch(week){ case "Monday": n("星期⼀"); break; case "Tuesday": n("星期⼆"); break; case "Wednesday": n("星期三"); break; case "Thursday": n("星期四"); break; case "Friday": n("星期五"); break; case "Saturday": n("星期六"); break; case "Sunday": n("星期⽇"); break; default: n("您的输⼊有误!"); }}
发布评论