目标


•了解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()