表1:String类的构造方法
方法声明 | 功能描述 |
---|---|
String() | 创建一个内容为空的字符串 |
String(String value) | 根据指定的字符串内容创建对象 |
String(char [ ] value) | 根据指定的字符数组创建对象 |
表2:String类常用方法
方法声明 | 功能描述 |
---|---|
int indexOf(char ch) | 返回指定字符在此字符串中第一次出现出的索引 |
int lastIndexOf(char ch) | 返回指定字符在此字符串中最后一次出现出的索引 |
int indexOf(String str) | 返回指定子字符串在此字符串中第一次出现出的索引 |
int lastIndexOf(String str) | 返回指定子字符串在此字符串中最后一次出现出的索引 |
char charAt(int index) | 返回字符串中index位置上的字符,其中,index的取值范围是0~(字符串长度-1) |
boolean endsWith(String suffix) | 判断此字符串是否以指定的字符串结尾 |
boolean startsWith(String prefix) | 判断此字符串是否以指定的字符串开始 |
int length() | 返回此字符串的长度 |
boolean equals(Object anObject) | 将此字符串与指定的字符串比较 |
boolean isEmpty() | 当且仅当字符串长度为0时返回true |
boolean contains(CharSequence cs) | 判断此字符串是否包含指定的字符序列 |
String toLowerCase() | 使用默认语言环境的规则将String中的所有字符都转换为小写 |
String toUpperCase() | 使用默认语言环境的规则将String中的所有字符都转换为大写 |
static String valueOf(int i) | 返回int参数的字符串表示形式 |
char [ ] toCharArray() | 将此字符串转换为一个数组 |
String replace(CharSequence oldstr,CharSequence newstr) | 返回一个新的字符串,它是通过用newstr替换此字符串中出现的所有oldstr得到的 |
String [ ] split (String regex) | 根据参数regex将原来的字符串分割为若干个字符串 |
String substring(int beginIndex) | 返回一个新的字符串,它包含从指定的beginIndex处开始直到此字符串末尾的所有字符 |
String substring(int beginIndex,int endIndex) | 返回一个新的字符串,它包含从指定的beginIndex处开始直到索引endIndex-1处的所有字符 |
String trim() | 返回一个新字符串,它去除了原字符串首尾的空格 |
1:equals()方法和“==”两种方式的区别。
答:equals()方法用于比较两个字符串中的字符是否相等, = =方法用于比较两个字符串对象的地址是否相同。 对于两个字符串对象,当它们的字符内容完全相同时,使用equals判断结果为true,但使用= =判断时,结果一定为false。
表3:StringBuffer类常用方法
方法声明 | 功能描述 |
---|---|
StringBuffer append(char c) | 添加参数到StringBuffer对象中 |
StringBuffer insert(int offset,String str) | 将字符串中的offset位置插入字符串str |
StringBuffer deletecharAt(int index) | 移除此序列指定位置的字符 |
StringBuffer delete(int start,int end) | 删除StringBuffer对象中的指定范围的字符或字符串序列 |
StringBuffer replace(int start,int end,String s) | 在StringBuffer对象中替换指定的字符或字符串序列 |
void setCharAt(int index,char ch | 修改指定位置index处的字符序列 |
String toString() | 返回StringBuffer缓冲区中的字符串 |
StringBuffer reverse() | 将此字符序列用其反转形式取代 |
注:append()方法始终将这些字符添加到缓冲区的末尾,而insert()方法则可以在指定的位置添加字符。
表4:System类的常用方法
方法声明 | 功能描述 |
---|---|
static void exit(int status) | 该方法用于终止当前正在运行的Java虚拟机,其中,参数status表示状态码,通常指定为0,表示正常退出,否则表示异常终止 |
static void gc() | 运行垃圾回收器,并对垃圾进行回收 |
static native long currentTimeMills() | 返回以毫秒为单位的当前时间 |
Static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length) | 从src引用的指定源数组复制到dest引用的数组,复制从指定的位置开始,到目标数组的指定位置结束 |
static Properties getProperties | 取得当前的系统属性 |
static String getProperty(String key) | 获取指定键描述的系统属性 |
arraycopy()方法用于将一个数组中的元素快速拷贝到另一个数组(替换原有的内容),其中参数的具体作用如下。
- src:表示源数组。
- dest:表示目标数组。
- srcPos:表示源数组中拷贝元素的起始位置。
- destPos:表示拷贝到目标数组的起始位置。
- length:表示拷贝元素的个数。
需要注意的是,在进行数组复制时,目标数组必须有足够的空间来存放拷贝的元素,否则会发生角标越界异常。
2:Runtime类
(1):Runtime类用于表示虚拟机运行时的状态,它用于封装JVM虚拟机进程。每次使用java命令启动虚拟机都对应一个Runtime实例,并且只有一个实例,因此该类采用单例模式进行设计,对象不可直接实例化。若想在程序中获得一个Runtime实例,只能通过以下方式。
Runtime run = Runtime.getRuntime();
由于Runtime类封装了虚拟机进程,因此,在程序中通常会通过该类的实例对象类获取当前虚拟机的相关信息。
public class Ex22 {
public static void main(String[] args){
Runtime rt = Runtime.getRuntime();
System.out.println("处理器的个数:"+rt.availableProcessors()+"个");
System.out.println("空闲内存数量:"+rt.freeMemory()/1024/1024+"M");
System.out.println("最大可用内存数量:"+rt.maxMemory()/1024/1024+"M");
}
}
(2):Runtime类中提供了一个exec()方法,该方法用于执行一个dos命令,从而实现与在命令行窗口中输入dos命令同样的效果。例如,通过执行“notepad.exe”命令打开一个Windows自带的记事本程序。
//打开一个记事本
import java.io.IOException;
public class Ex22 {
public static void main(String[] args) throws IOException {
Runtime rt = Runtime.getRuntime(); //创建Runtime实例对象
rt.exec("notepad.exe"); //调用exec()方法
}
}
//打开一个记事本,调用destory()方法定时关闭进程
public class Ex22 {
public static void main(String[] args) throws Exception {
Runtime rt = Runtime.getRuntime(); //创建一个RUntime实例对象
Process process = rt.exec("notepad.exe"); //得到表示进程的Process对象
Thread.sleep(3000); //程序休眠3秒(3000毫秒)
process.destroy(); //杀掉进程
}
}
3:Math类
public class Ex22 {
public static void main(String[] args){
System.out.println(Math.PI); //3.141592653589793
System.out.println(Math.E); //2.718281828459045
System.out.println("计算绝对值的结果:"+Math.abs(-1)); //1
System.out.println("求大于参数的最小整数:"+Math.ceil(5.6)); //6.0
System.out.println("求小于参数的最大整数:"+Math.floor(-4.2)); //-5.0
System.out.println("求小数进行四舍五入后的结果:"+Math.round(-4.6)); //-5
System.out.println("求两个数的较大值:"+Math.max(2.1,-2.1)); //2.1
System.out.println("求两个数的较小值:"+Math.min(2.1,-2.1)); //-2.1
System.out.println("生成一个大于等于0.0小于1.0的随机值:"+Math.random());
}
}
round()方法用于对某个小数进行四舍五入,此方法会将小数点后面的数字全部省略,返回一个int类型的数,而ceil()方法和floor()方法返回的都是double类型的数,这个数在数值上等于一个整数。
4:Random()类
表5:Random的构造方法
方法声明 | 功能描述 |
---|---|
Random() | 构造方法,用于创建一个伪随机数生成器 |
Random(long seed) | 构造方法,使用一个long型的seed种子创建伪随机数生成器 |
第一个构造方法是无参的,通过它创建的Random实例对象每次使用的种子是随机的,因此每个对象所产生的随机数不同。如果希望创建的多个Random实例对象产生相同序列的随机数,则可以在创建对象时调用第2个构造方法,传入相同的种子即可。
表6:Random类的常用方法
方法声明 | 功能描述 |
---|---|
boolean nextBoolean() | 随机生成boolean类型的随机数 |
double nextDouble() | 随机生成double类型的随机数 |
float nextFloat() | 随机生成float类型的随机数 |
int nextInt() | 随机生成int类型的随机数 |
int nextInt(int n) | 随机生成 [ 0 ,n ) 之间int类型的随机数 |
long nextLong() | 随机生成long类型的随机数 |
5:包装类
通过这些包装类可以将基本类型数据类型的值包装为引用数据类型的对象。
表7:基本类型对应的包装类
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
char | Character |
int | Integer |
short | Short |
long | Long |
floa | Float |
double | Double |
boolean | Boolean |
包装类和基本数据类型在进行转换时,引入了装箱和拆箱的概念。其中,装箱是指将基本数据类型的值转为引用数据类型,反之,拆箱是指将引用数据类型的对象转为基本数据类型。
方法声明 | 功能描述 |
---|---|
static Stiring toBinaryString(int i) | 以二进制无符号整数形式返回一个整数参数的字符串 |
static String toHexString(int i) | 以十六进制无符号整数形式返回一个整数参数的字符串 |
static String toOctalString(int i) | 以八进制无符号整数形式返回一个整数参数的字符串 |
static Integer valueOf(int i) | 返回一个表示指定的int值的Integer实例 |
static Integer valueOf(String s) | 返回保存指定的String的值的Integer对象 |
static int parseInt(String s) | 将字符串参数作为有符号的十进制整数进行解析 |
intValue() | 将Integer类型的值以int类型返回 |
十进制转换成二进制:
String s1= Integer.toBinaryString(10); //s1此时为“1010”
装箱:
int a = 20;
Integer in = new Integer(a);
拆箱:
Integer num = new Integer(20);
int a = 10;
int sum = num.intValue() + a;
parseInt()方法很常用,它是一个静态方法,用于将一个字符串形式的数值转成int类型。
public class Ex22 {
public static void main(String[] args) {
int w = Integer.parseInt("20");
int h = Integer.parseInt("10");
for(int i=0;i<h;i++){
StringBuffer sb = new StringBuffer();
for(int j=0;j<w;j++){
sb.append("*");
}
System.out.println(sb.toString()); //此处的toString()方法是可以省略的
}
}
}
在使用包装类时,需要注意一下几点:
(1):包装类都重写了Object类中的toString()方法,以字符串的形式返回被包装的基本数据类型的值。
(2):除了Character外,包装类都有valueOf(String s)方法,可以根据String类型的参数创建包装类对象,但参数字符串s不能为null,而且字符串必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运行时会报错。
Integer i = Integer.valueOf("123"); //合法
Integer i = Integer.valueOf("12a"); //不合法
(3):除了Character外,包装类都有parseXXX(String s)的静态方法,将字符串转换为对应的基本数据类型。参数不能为null,而且同样必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运行时会报错。
int i = Integer.parseInt("123"); //合法
Integer in = Integer.parseInt("itcast"); //不合法
6:JDK5.0新特性——自动拆箱和装箱
在JDK5.0的版本中提供了自动拆箱和装箱技术,也就是可以自动进行基本数据类型和包装类对象之间的转换,具体示例如下:
int num = 20;
Integer number = num; //自动装箱
上面的代码就是自动装箱,相当于程序自动执行了语句“Integer number = new Integer ( num );”。
Integer number = new Integer(18);
int number2= number; //自动拆箱
上面的代码就是自动拆箱,相当于程序执行了语句“int number2 = number.intvalue();”。
正因为自动拆箱装箱的特性,在JDK5.0版本后,基本类型和包装类型可以进行混合数学运算,也可以直接将两个Integer类型进行数学运算。
public static Integer add(Integer a , Integer b){
return a+b;
}
7:JDK7.0新特性——switch语句支持字符串类型
在JDK7.0中,switch语句的表达式增加了对字符串类型的支持。
public class Ex1 {
public static void main(String[] args){
String week = "Friday";
switch(week){
case "Monday":
System.out.println("星期一");
break;
case "Tuesday":
System.out.println("星期二");
break;
case "Wednesday":
System.out.println("星期三");
break;
case "Thursday":
System.out.println("星期四");
break;
case "Friday":
System.out.println("星期五");
break;
case "Saturday":
System.out.println("星期六一");
break;
case "Sunday":
System.out.println("星期日一");
break;
}
}
}
思考题
1:请简述String类和StringBuffer类的区别。
(1):String类表示的字符串是常量,一旦创建后,内容和长度都是无法改变的。而StringBuffer表示字符容器,其内容和长度可以随时修改。在操作字符串时,如果该字符串仅用于表示数据类型,则使用String即可。但是如果需要对字符串中的字符进行增删操作,则使用StringBuffer类。
(2):String类覆盖了Object类的equals()方法,而StringBuffer类没有覆盖Object类的equals()方法。
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1.equals(s2)); //结果为true
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb1.equals(sb2)); //结果为false
(3):String类对象可以用操作符“+”进行连接,而StringBuffer类对象之间不能。
String s1="a";
String s2="b";
String s3=s1+s2; //合法
System.out.println(s3); //打印输出ab
StringBuffer sb1 = new StringBuffer("a");
StringBuffer sb2 = new StringBuffer("b");
StringBuffer sb3 = sb1+sb2; //编译出错
2:请简述装箱和拆箱的概念。
装箱:把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。int包装成Integer、float包装成Float。
拆箱:和装箱相反,将引用类型的对象简化成值类型的数据。