目标
•了解java.lang包
•掌握包装类
•掌握String类和StringBuffer类
•运用Math类中的方法
•运用Object类中的方法
•运用Class类中的方法
java.lang包简介
•java.lang包是java内置的一个基础包,其中包含了一系列程序中经常要用到的类;
在默认情况下,每个java程序都会自动导入该包,因此
无需在程序中显式地声明
包装类
•使用原始数据类型声明的变量,如:
int num = 10;
num只是一个变量,而不是对象;
•在某些必须操作对象的场合,这样的变量就不能使用了;
•Java提供一系列包装类,以便将原始数据类型当作对象进行操作;
•在java.lang包中,对于每个原始数据类型都有一个相应的包装类。
原始数据类型和包装类对照表
原始数据类型 | 包 装 类 |
boolean(布尔型) | Boolean |
byte(字节型) | Byte |
char(字符型) | Character |
short(短整型) | Short |
int(整型) | Integer |
long(长整型) | Long |
float(浮点型) | Float |
double(双精度浮点型) | Double |
包装类的构造方法
•可以使用原始类型作为参数,实例化相应的包装类对象。
public class LangDemo
{
public static void main(String[] args)
{
Boolean objBool = new Boolean(true);
Character objChar = new Character('X');
Integer objInt = new Integer(100);
Long objLong = new Long(2568);
Double objDou = new Double(3.1415);
System.out.println(objBool);
System.out.println(objChar);
System.out.println(objInt);
System.out.println(objLong);
System.out.println(objDou);
}
}
包装类的valueOf方法
•每个包装类都有一个静态的valueOf方法,用于将字符串转换成相应包装类的对象。
public class LangDemo {
public static void main(String[] args) {
String str = "120";
//如果转换失败,将会引发NumberFormatException异常
Byte objByte = Byte.valueOf(str);
Short objShort = Short.valueOf(str);
Integer objInt = Integer.valueOf(str);
Long objLong = Long.valueOf(str);
System.out.println(objByte);
System.out.println(objShort);
System.out.println(objInt);
System.out.println(objLong);
}
}
包装类的parseXxx方法
•除了Boolean类和Character类以外,其它的包装类都有静态的parseXxx方法(Xxx指代具体的数据类型),用于将字符串转换成相对应的原始数据类型值。
public class ParseTest {
public static void main(String[] args) {
String str = "116";
//分别调用各个包装类的paseXxx方法对字符串进行转换,如果转换失败,将报异常
int i = Integer.parseInt(str);
short s = Short.parseShort(str);
byte b = Byte.parseByte(str);
long l = Long.parseLong(str);
float f = Float.parseFloat(str);
double d = Double.parseDouble(str);
System.out.println(i);
System.out.println(s);
System.out.println(b);
System.out.println(l);
System.out.println(f);
System.out.println(d);
}
}
Character类中的常用方法
方 法 原 型 | 说 明 |
boolean isLetter(char ch) | 判断字符ch是否为英文字母 |
boolean isDigit(char ch) | 判断字符ch是否为0~9之间的数字 |
boolean isUpperCase(char ch) | 判断字符ch是否为大写形式 |
boolean isLowerCase(char ch) | 判断字符ch是否为小写形式 |
boolean isWhitespace(char ch) | 判断字符ch是否为空格或换行符 |
以上方法都是静态方法,可以直接通过类名调用,返回值均
为boolean类型,如果是返回true,否则返回false。
Character类常用方法示例
public class CharacterDemo {
public static void main(String[] args) {
char[] charArray = {'*', '7', 'b', ' ', 'A'};
for (int i = 0; i < charArray.length; i++) {
if (Character.isDigit(charArray[i])) {
System.out.println(charArray[i] + "是一个数字。");
}
if (Character.isLetter(charArray[i])) {
System.out.println(charArray[i] + "是一个字母。");
}
if (Character.isWhitespace(charArray[i])) {
System.out.println(charArray[i] + "是一个空格。");
}
if (Character.isLowerCase(charArray[i])) {
System.out.println(charArray[i] + "是小写形式。");
}
if (Character.isUpperCase(charArray[i])) {
System.out.println(charArray[i] + "是大写形式。");
}
}
}
}
String类
•Java中,字符串是String类的对象;
•可以通过使用String类提供的方法来完成对字符串的操作;
•创建一个字符串对象之后,将不能更改构成字符串的字符;
•每当更改了字符串版本时,就创建了一个新的字符串对象,并在其内包含所做的修改,原始字符串保持不变。
String类的构造方法
•String类的构造方法共有13种重载方式,以下是常用的几个:
构造方法 | 说 明 |
String() | 将创建一个空字符串 |
String(String original) | 将新建一个字符串作为指定字符串的副本 |
String(char[] value) | 将根据字符数组构造一个新字符串 |
String(byte[] tytes) | 将通过转换指定的字节数组新建一个字符串 |
String类构造方法示例
public class StringDemo
{
public static void main(String[] args)
{
char[] aryChar = {‘I', 'C', ‘S', ‘S'};
String str1 = “ETC";
//利用一个字符串常量值创建新的字符串
String str2 = new String(“ICSSETC");
//利用一个字符型数组创建新的字符串
String str3 = new String(aryChar);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
}
字符串长度
•String类中提供length成员方法,用来获得字符串的长度,方法原型:int length()
•该方法返回字符串中有效字符的个数。
public class StringDemo
{
public static void main(String[] args)
{
String str1 = "John Smith";
String str2 = new String("I Love Java");
System.out.println(str1.length());
System.out.println(str2.length());
}
}
字符串比较
•要判断两个字符串是否相等,可以使用“==”运算符和equals()方法,但是得到的结果可能不完全相同;
•==运算符用于比较两个引用是否指向同一个对象;
•而equals()方法则是比较两个字符串中的内容是否相同,其原型:
boolean equals(Object anObject)
如果相等返回true,否则返回false。
字符串比较示例
public class StringDemo {
public static void main(String[] args) {
String str1 = “ICSS", str2 = “ICSS";
String str3 = new String(“ETC"), str4 = new String(“ETC");
if (str1 == str2) {
System.out.println("str1和str2指向同一字符串"); }
else {
System.out.println("str1和str2分别指向不同字符串"); }
if (str1.equals(str2)) {
System.out.println("str1和str2的内容完全相同"); }
else {
System.out.println("str1和str2的内容不相同"); }
if (str3 == str4) {
System.out.println("str3和str4指向同一字符串"); }
else {
System.out.println("str3和str4分别指向不同字符串"); }
if (str3.equals(str4)) {
System.out.println("str3和str4的内容完全相同");}
else {
System.out.println("str3和str4的内容不相同"); }
}
}
其它的比较方法
方 法 原 型 | 说 明 |
boolean equalsIgnoreCase(String anotherString) | 判断字符串anotherString是否与当前字符串相等,忽略大小写形式 |
int compareTo(String anotherString) | 根据ASCII码比较字符串anoterString和当前字符串的大小,比较方式类似于C语言中的strcmp函数 |
boolean startsWith(String prefix) | 判断当前字符串是否以字符串prefix为开头 |
boolean endsWith(String suffix) | 判断当前字符串是否以字符串suffix为后缀 |
字符串搜索
•如果需要搜索某个字符(或某个子串)在字符串中是否出现过,这就要使用到indexOf方法和lastIndexOf方法。
方 法 原 型 | 说 明 |
int indexOf(int ch) | 搜索字符ch在当前字符串中第一次出现的索引,没有出现则返回-1 |
int indexOf(String str) | 搜索字符串str在当前字符串中第一次出现的索引,没有出现则返回-1 |
int lastIndexOf(int ch) | 搜索字符ch在当前字符串中最后一次出现的索引,没有出现则返回-1 |
int lastIndexOf(String str) | 搜索字符串str在当前字符串中最后一次出现的索引,没有出现则返回-1 |
字符串搜索示例
public class StringDemo
{
public static void main(String[] args)
{
String strEmail = "java@sun.com";
int index;
System.out.println("E-mail地址:" + strEmail);
index = strEmail.indexOf('@');
System.out.println("@字符出现的索引:" + index);
index = strEmail.indexOf("sun");
System.out.println("字符串\"sun\"出现的索引:" + index);
index = strEmail.lastIndexOf('a');
System.out.println("a字符最后一次出现的索引:" + index);
}
}
提取字符串
方 法 原 型 | 说 明 |
char charAt(int index) | 用于从指定位置提取单个字符,该位置由index指定,索引值必须为非负 |
String substring(int index) | 用于提取从index指定的位置开始的字符串部分 |
String substring(int begin, int end) | 用于提取 begin 和 end 位置之间的字符串部分 |
String concat(String str) | 用于连接两个字符串,并新建一个包含调用字符串的字符串对象 |
String replace(char oldChar, char newChar) | 用于将调用字符串中出现oldChar指定的字符全部都替换为newChar指定的字符 |
replaceAll(String regex, String replacement) | 用于将调用字符串中出现或者匹配regex的字符串全部都替换为replacement指定的字符 |
String trim() | 用于返回一个前后不含任何空格的调用字符串的副本 |
提取字符串示例
public class StringDemo
{
public static void main(String[] args)
{
String str1 = " Java is OOP";
String str2 = new String(“icss");
System.out.println(str1.charAt(2));
System.out.println(str1.substring(5));
System.out.println(str1.substring(2, 9));
System.out.println(str1.concat(str2));
System.out.println(str1 + str2);
System.out.println(str1.replace('a', 'e'));
System.out.println(str1.trim());
}
}
更改字符串的大小写形式
•有时候,我们需要将字符串中字符的大小写形式进行转换。
方 法 原 型 | 说 明 |
String toUpperCase() | 返回当前字符串的全大写形式 |
String toLowerCase() | 返回当前字符串的全小写形式 |
更改大小写形式示例
public class StringDemo
{
public static void main(String[] args)
{
String str1 = "Java is OOP";
String str2;
str2 = str1.toLowerCase();
System.out.println(str2);
str2 = str1.toUpperCase();
System.out.println(str2);
}
}
数据格式转化
•在某些特定的场合,我们可能需要将字符串转化成其它格式的数据进行操作;
方 法 原 型 | 说 明 |
byte[] getBytes() | 返回当前字符串转化成byte型数组的形式(即字符串在内存中保存的最原始的二进制形态, 流的应用) |
char[] toCharArray() | 返回当前字符串的字符数组形式,类似于C语言中字符串的保存形式 |
StringBuffer类
•StringBuffer类用于表示可以修改的字符串;
•使用 + 运算符的字符串将自动创建字符串缓冲对象;
•以下是StringBuffer类的构造方法有4种重载方式,以下是常用的几个:
构造方法 | 说 明 |
StringBuffer() | 创建一个空的StringBuffer对象,默认保留16个字符的缓冲空间 |
StringBuffer(String str) | 根据字符串str的内容创建StringBuffer对象,并默认保留 16 个字符的缓冲空间 |
StringBuffer(int capacity) | 创建一个空的StringBuffer对象,缓冲空间大小由capacity指定 |
StringBuffer类的常用方法
方 法 原 型 | 说 明 |
StringBuffer insert(int index, x x) | 将x插入到索引为index的位置,x可以为任何类型的数据 |
int length() | 获得当前StringBuffer对象的长度 |
void setCharAt(int index, char ch) | 使用 ch 指定的新值替换 index指定的位置上的字符 |
String toString() | 转换为字符串形式 |
StringBuffer reverse() | 将当前StringBuffer对象中的字符序列倒置 |
StringBuffer delete(int start, int end) | 删除当前对象中从start位置开始直到 end 指定的索引 位置的字符序列 |
StringBuffer deleteCharAt(int index) | 将删除 index 指定的索引处的字符 |
StringBuffer replace(int start, int end, String str) | 此方法使用一组字符替换另一组字符。将用替换字符串从 start指定的位置开始替换,直到 end 指定的位置结束 |
StringBuffer示例
public class StringBufferDemo {
public static void main(String[] args) {
StringBuffer strBuf = new StringBuffer("Java");
strBuf.append(“ Guide Ver1/”); //连接 Java Guide Ver1/
System.out.println(strBuf); //Java Guide Ver1/
strBuf.append(3);
System.out.println(strBuf); //Java Guide Ver1/3
strBuf.insert(5, "Student"); //插入
System.out.println(strBuf); //Java StudentGuide Ver1/3
strBuf.setCharAt(20, '.'); //替换字符
System.out.println(strBuf); //Java StudentGuide Ve.1/3
strBuf.reverse(); //倒序
System.out.println(strBuf);
String str = strBuf.toString();
System.out.println(str);
}
}
区别(面试常规题)
•在Java中一旦创建了字符串String就不能直接更改,即字符串的不变性;
•而StringBuffer类正是针对此问题而提供的字符可变序列;
•StringBuffer与String是同等的类,区别是可以进行更改,并且StringBuffer线程安全
String练习
•String s=“10,12;23,34,15;6,7,8”;请将s字符串解析后存入到一个二维数组中.
提示:第一次通过split(“;”)解析,再通过split(“,”)解析
•对一个字符串数组进行排序.
Math类
•Math类中提供了一系列基本数学运算和几何运算的方法;
•该类的构造方法被修饰为private,因此不能实例化;
•该类中的所有方法都是静态的,可以通过类名直接调用;
•该类被修饰为final,因此没有子类。
Math类的常用方法
方 法 原 型 | 说 明 |
static int abs(int a) | 求a的绝对值,有4种重载,还有float,double和long |
static double pow(double a, double b) | 求a的b次方幂 |
static double sqrt(double a) | 求a的平方根 |
static int round(float a) | 求a的四舍五入结果 |
static double ceil(double a) | 返回不小于a的最小整数值 |
static double floor(double a) | 返回不大于a的最大整数值 |
static double sin(double a) | 返回a的正弦值 |
static double cos(double a) | 返回a的余弦值 |
Math类中的常量
•Math类中还包括两个常用的常量:
PI:圆周率π
E:自然常量
•以上常量在Math类中都被声明成静态,可以直接通过类名进行访问。
Object类
•Java中的类体系遵循单根结构,即任何一个类往上追溯都到达同一个父类;
•Object类就是这个单根体系的根,也就是说它是其它所有类的共同父类;
•如果用户定义的类没有扩展任何其它类,则默认扩展自Object类;
•Object类中定义的一些方法,会被继承到所有类中。
Object类的常用方法
方 法 原 型 | 说 明 |
boolean equals(Object obj) | 判断当前对象是否与参数obj(内容)相等,如果有必要,应该在自定义的类中覆盖该方法 |
String toString() | 返回当前对象的字符串表示,如果有必要,应该在自定义的类中覆盖该方法 |
Class getClass() | 返回当前对象的类描述对象,此方法被继承到所有类中 |
protected void finalize() throws Throwable | 当前对象被垃圾回收时调用此方法(类似于C++的析构函数),但无法确定具体何时调用 |
public final void wait() throws InterruptedException | 使当前线程进入等待状态 |
toString方法示例
class Student { //定义Student类,缺省继承于Object类
private String mName;
private int mAge;
public Student(String name, int age) { //构造方法
mName = name;
mAge = age;
}
public String toString() { //覆盖Object类中的toString方法
String str = "姓名:" + mName + ", 年龄:" + mAge + "岁";
return (str);
}
}
public class ToStringDemo { //容纳main方法
public static void main(String[] args) {
Student std = new Student("张三", 18);
System.out.println(std); //默认调用toString方法
}
}
Class类
•Java应用程序实际上都是由一个个对象组成,这些对象分别属于什么类,是从哪个类继承而来,这一系列的信息都是由Class类的实例来记录的;
•Class类的实例用于记录对象的类描述信息;
•如果在程序运行时,需要检索某个对象的相关类信息,可以调用该对象的getClass方法来获得记录其描述信息的Class类实例;
•Class类没有公共的构造方法,无法通过new运算符实例化,只能通过对象的getClass方法,或是通过Class的静态方法forName来获得实例。
Class类的常用方法
方 法 原 型 | 说 明 |
static Class forName(String className) throws ClassNotFoundException | 使用参数className来指定具体的类,来获得相关的类描述对象,该方法有可能抛出类加载异常(ClassNotFoundException),必须捕捉 |
Class getSuperclass() | 获得当前类描述对象的父类的描述对象 |
String getName() | 返回当前类描述对象的类名称 |
类描述对象示例
/*该示例可以检索任意类的继承关系*/
public class ClassDemo {
public static void main(String[] args) {
try {
/*使用forName方法获得任意一个类的类描述对象
这里以StringBuffer类为例
forName方法有可能抛异常,必须捕捉*/
Class cls = Class.forName("java.lang.StringBuffer");
//循环打印父类信息,直到没有父类
while (cls != null) {
System.out.println(cls);
cls = cls.getSuperclass();
}
} catch (ClassNotFoundException cnfe) {
cnfe.printStackTrace();
}
}
}
总结
•java.lang包是Java中最基础的一个包,也是唯一一个无需显示声明就默认导入包;
•包装类共有8个,它们可以以对象的形式封装原始类型的数据;
•Java中的字符串以String类对象的形式存放,该类中提供一系列对字符串进行操作的方法;
•StringBuffer类是另一种形式的字符串,与String类的区别是允许对自身的内容进行修改;
•Math类提供一系列进行算术计算的方法,这些方法都是静态的;
•Object类是其它所有类的父类;
•Class类的实例记录了对象的类信息。
作业:从一段话中查询出最长的单词
作业
1.
•用户从命令行输入一个字符串,要求判断是否为合法的email地址,如果合法,请判断是否为sina的邮箱地址。(PS:记住异常处理)
>合法邮箱规则:
>有且仅有一个@和.
>@在.之前 且@不能是第一位 .不能是最后一位
>@与.不能相邻
>新浪邮箱应当以@sina.com结尾
•用户从命令行输入一个字符串,请判断是否为回文字符串。
2.
•思考上述题!用其他方法判断字符串是否为回文(不用数组)! 12321 abcdcba
•编写一个Student类,包含name、age等属性,要求使用System.out.println()打印Student类的对象引用时,输出的为name的值!可以用equals方法比较是否为同一个学生(name与age全相等)
提示: 重写toString()方法实现
重写equals()方法实现
3.
•String s = new String("xyz");创建了几个String Object?
•是否可以继承String类?
4.
•将整数456转换成二进制,八进制,十六进制输出.
提示: Integer类的toBinaryString(), toHexString(),toOctalString()