java.lang包

学习 java.lang 包内的包装类以及 String 类、Math 类、Class 类、Object 类的相关知识。

1.2 实验知识点

包装类
String 类
Math 类
Class 类
Object 类

Java API 简介

Java 的核心 API 是非常庞大的,这给开发者来说带来了很大的方便。所谓的 API 就是一些已经写好、可直接调用的类库。Java 里有非常庞大的 API,其中有一些类库是我们必须得掌握的,只有熟练掌握了 Java 一些核心的 API,我们才能更好的使用 Java。

在程序中,java.lang 包并不需要像其他包一样需要import关键字进行引入。系统会自动加载,所以我们可以直接取用其中的所有类


java.lang 包装类

我们都知道 java 是一门面向对象的语言,类将方法和属性封装起来,这样就可以创建和处理相同方法和属性的对象了。但是 java 中的基本数据类型却不是面向对象的,不能定义基本类型的对象。那如果我们想像处理对象的方式处理基本类型的数据,调用一些方法怎么办呢?

其实 java 为每个基本类型都提供了包装类:

原始数据类型  包装类
byte(字节)    Byte
char(字符)    Character
int(整型)     Integer
long (长整型)  Long
float(浮点型)  Float
double (双精度) Double
boolean (布尔)    Boolean
short(短整型)  Short

在这八个类名中,除了Integer和Character类以后,其它六个类的类名和基本数据类型一致,只是类名的第一个字母大写。

Integer 类

java.lang 包中的 Integer 类、Long 类和 Short 类都是 Number 的子类,他们的区别在于不同子类里面封装着不同的数据类型,比如 Integer 类包装了一个基本类型 int。其包含的方法基本相同。

我们以 Integer 类为例。 Integer 构造方法有两种:

Integer(int value) ,以 int 型变量作为参数创建 Integer 对象。例如Integer a = new Integer(10);

Integer(String s) ,以 String 型变量作为参数创建 Integer 对象,例如Integer a = new Integer("10")

下面列举一下 Integer 的常用方法

方法  返回值     功能描述
byteValue()     byte    以 byte 类型返回该 Integer 的值
CompareTo(Integer anotherInteger)   int     在数字上比较 Integer 对象。如果这两个值相等,则返回0;如果调用对象的数值小于 anotherInteger 的数值,则返回负值;如果调用对象的数值大于 anotherInteger 的数值,则返回正值
equals(Object IntegerObj)   boolean     比较此对象与指定对象是否相等
intValue()  int     以 int 型返回此 Integer 对象
shortValue()    short   以 short 型返回此 Integer 对象
longValue()     long    以 long 型返回此 Integer 对象
floatValue()    float   以 float 型返回此 Integer 对象
doubleValue()   double  以 double 型返回此 Integer 对象
toString()  String  返回一个表示该 Integer 值的 String 对象
valueOf(String str)     Integer     返回保存指定的 String 值的 Integer 对象
parseInt(String str)    int     将字符串参数作为有符号的十进制整数进行解析
public class IntegerTest {
    public static void main(String[] args){
        //初始化一个 Integer 类实例
        Integer a = new Integer("10");
        //初始化一个 Integer 类实例
        Integer b = new Integer(11);
        //判断两个数的大小
        System.out.println(a.compareTo(b));
        // 判断两个实例是否相等
        System.out.println(a.equals(b));
        //将 a 转换成 float 型数
        float c = a.floatValue();
        System.out.println(c);

        String d = "10101110";
        //将字符串转换为数值
        //parseInt(String str) 和 parseInt(String str,int radix) 都是类方法,由类来调用。后一个方法则实现将字符串按照参数 radix 指定的进制转换为 int,
        int e = Integer.parseInt(d, 2);
        System.out.println(e);
    }
}

Character 类

Character 类在对象中包装一个基本类型 char 的值。****Character 类型的对象包含类型为 char 的单个字段。

Character 包装类的常用方法:

方法  返回值     说明
isDigit(char ch)    boolean     确定字符是否为数字
isLetter(char ch)   boolean     确定字符是否为字母
isLowerCase(char ch)    boolean     确定字符是否为小写字母
isUpperCase(char ch)    boolean     确定字符是否为大写字母
isWhitespace(char ch)   boolean     确定字符是否为空白字符
isUnicodeIdentifierStart(char ch)   boolean     确定是否允许将指定字符作为 Unicode 标识符中的首字符
public class CharacterTest {
   
    public static void main(String[] args){
        int count;
        //定义了一个字符数组
        char[] values = {
  '*', '_', '%', '8', 'L', 'l'};
        //遍历字符数组
        for (count = 0; count < values.length; count++){
            if(Character.isDigit(values[count])){
                System.out.println(values[count]+"是一个数字");
            }
            if(Character.isLetter(values[count])){
                System.out.println(values[count]+ "是一个字母");
            }
            if(Character.isUpperCase(values[count])){
                System.out.println(values[count]+"是大写形式");
            }
            if(Character.isLowerCase(values[count])){
                System.out.println(values[count]+"是小写形式");
            }
            if(Character.isUnicodeIdentifierStart(values[count])){
                System.out.println(values[count]+"是Unicode标志符的第一个有效字符");
            }
        }
        //判断字符c是否是空白字符
        char c = ' ';
        System.out.println("字符c是空白字符吗?"+Character.isWhitespace(c));
    }
}

Boolean 类

Boolean 类将基本类型为 boolean 的值包装在一个对象中。一个 Boolean 类型的对象只包含一个类型为 boolean 的字段。

Boolean 类的构造方法也有两个:

Boolean(boolean value),创建一个表示 value 参数的 Boolean 对象,如Boolean b = new Boolean(true)
Boolean(String s),如果 String 参数不为 null 且在忽略大小写时等于 "true",创建一个表示 true 值的 Boolean 对象,如Boolean b = new Boolean("ok"),为 false。

Boolean 包装类的常用方法:

方法  返回值     说明
booleanValue()  boolean     将 Boolean 对象的值以对应的 boolean 值返回
equals(Object obj)  boolean     判断调用该方法的对象与 obj 是否相等。当且仅当参数不是 null,而且与调用该方法的对象一样都表示同一个 boolean 值的 Boolean 对象时,才返回 true
parseBoolean(String s)  boolean     将字符串参数解析为 boolean 值
toString()  String  返回表示该 boolean 值的 String 对象
valueOf(String s)   Boolean     返回一个用指定得字符串表示值的 boolean 值

java.lang 类 String

我们经常使用 String 类来定义一个字符串。字符串是常量,它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。

String 对象的初始化格式有如下两种:

String s0 = "abc";

String s1 = new String("abd");

String 类具有丰富的方法,比如计算字符串的长度、连接字符串、比较字符串、提取字符串等等。


计算字符串长度

length()方法

//方法原型
public int length(){
}

调用方法:字符串标识符.length();

返回一个int类型的整数(字符串中字符数,中文字符也是一个字符)。例如:

String s1 = "abc";
String s2 = "Java语言";
int len1 = s1.length();
int len2 = s2.length();

则变量len1的值是3,变量len2的值是6。


字符串比较

equals() 方法,该方法的作用是判断两个字符串对象的内容是否相同。如果相同则返回true,否则返回false。

equals() 方法比较是从第一字符开始,一个字符一个字符依次比较。

如果我想忽略掉大小写关系,比如:java 和 Java 是一样的,我们怎么办呢?我们可以调用equalsIgnoreCase()方法,其用法与 equals 一致,不过它会忽视大小写。

public class StringTest {
    public static void main(String[] args){
        String s = new String("Java");
        String m = "java";
        System.out.println("用equals()比较,java和Java结果为"+s.equals(m));
        System.out.println("用equalsIgnoreCase()比较,java和Java结果为"+s.equalsIgnoreCase(m));
    }
}

而使用”==”比较的是两个对象在内存中存储的地址是否一样。例如:

String s1 = "abc";

String s2 = new String("abc");

boolean b = (s1 == s2);

变量b的值是false,因为s1对象对应的地址是”abc”的地址,而s2使用new关键字申请新的内存,所以内存地址和s1的”abc”的地址不一样,所以获得的值是false。


字符串连接

字符串连接有两种方法:

使用+,比如String s = "Hello " + "World!"

使用 String 类的 concat() 方法
String s0 = new String("Hello ");
String s1 = "World" + "!";   //+号连接
String s2 = s0.concat(s1); //concat()方法连接
System.out.println(s2);

使用+进行连接,不仅可以连接字符串,也可以连接其他类型。但是要求进行连接时至少有一个参与连接的内容是字符串类型。


charAt()方法

charAt()方法的作用是按照索引值(规定字符串中第一个字符的索引值是0,第二个字符的索引值是1,依次类推),获得字符串中的指定字符。例如:

     String s = "abc";
     char c = s.charAt(1);

字符串常用提取方法

方法  返回值     功能描述
indexOf(int ch)     int     搜索字符 ch 第一次出现的索引
indexOf(String value)   int     搜索字符串 value 第一次出现的索引
lastIndexOf(int ch)     int     搜索字符ch最后一次出现的索引
lastIndexOf(String value)   int     搜索字符串 value 最后一次出现的索引
substring(int index)    String  提取从位置索引开始到结束的字符串
substring(int beginindex, int endindex)     String  提取beginindex和endindex之间的字符串部分
trim()  String  返回一个前后不含任何空格的调用字符串的副本

说明:在字符串中,第一个字符的索引为0,子字符串包含beginindex的字符,但不包含endindex的字符。

public class StringTest {
    public static void main(String[] args) {
         String s = "abcdefabc";
         System.out.println("字符a第一次出现的位置为"+s.indexOf('a'));
         System.out.println("字符串bc第一次出现的位置为"+s.indexOf("bc"));
         System.out.println("字符a最后一次出现的位置为"+s.lastIndexOf('a'));
         System.out.println("从位置3开始到结束的字符串"+s.substring(3));
         System.out.println("从位置3开始到6之间的字符串"+s.substring(3,6));
    }
}

StringBuffer

String s = "Hello ";
s.concat("World!");   //字符串连接
System.out.println(s); //输出s,还是"Hello "
s = s.concat("World!");  //把字符串对象连接的结果赋给了s引用
System.out.println(s);  //输出s,变成了"Hello World!"

/*
上述三条语句其实产生了3String对象,"Hello ""World!""Hello World!"。第2条语句确实产生了"Hello World"字符串,但是没有指定把该字符串的引用赋给谁,因此没有改变s引用。第3条语句根据不变性,并没有改变"Hello "JVM创建了一个新的对象,把"Hello ""World!"的连接赋给了s引用,因此引用变了,但是原对象没变。
*/

String 的不变性的机制显然会在 String 常量内有大量的冗余。比如我创建一个循环,使字符’1’依次连接到’n’,那么系统就得创建 n+(n-1) 个 String 对象。那有没有可变的 String 类呢?

StringBuffer 类是可变的。它是 String 的对等类,它可以增加和编写字符的可变序列,并且能够将字符插入到字符串中间或附加到字符串末尾(当然是不用创建其他对象的,这里建议大家去看一看 String 类与 StringBuffer 类的区别,理解一下他们在内存中的存储情况)

先上 StringBuffer 的构造方法

构造方法    说明
StringBuffer()  构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符
StringBuffer(CharSequence seq)  构造一个字符串缓冲区,它包含与指定的 CharSequence 相同的字符
StringBuffer(int capacity)  构造一个不带字符,但具有指定初始容量的字符串缓冲区
StringBuffer(String str)    构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容

StringBuffer类的常用方法:

方法  返回值     功能描述
insert(int offsetm,Object s)    StringBuffer    在 offsetm 的位置插入字符串s
append(Object s)    StringBuffer    在字符串末尾追加字符串s
length()    int     确定 StringBuffer 对象的长度
setCharAt(int pos,char ch)  void    使用 ch 指定的新值设置 pos 指定的位置上的字符
toString()  String  转换为字符串形式
reverse()   StringBuffer    反转字符串
delete(int start, int end)  StringBuffer    删除调用对象中从 start 位置开始直到 end 指定的索引(end-1)位置的字符序列
replace(int start, int end, String s)   StringBuffer    使用一组字符替换另一组字符。将用替换字符串从 start 指定的位置开始替换,直到 end 指定的位置结束ringBuffer类的常用方法:**
public class StringTest {

    public static void main(String[] args){
        //定义和初始化一个StringBuffer类的字串s
        StringBuffer s = new StringBuffer("I");
        //在s后面添加字串" java"
        s.append(" java");
        //在s[1]的位置插入字串
        s.insert(1, " love");
        String t = s.toString(); //转为字符串
        System.out.println(t);
    }
}

java.lang 类 Math

我们在编程的过程中,经常对一些数字进行数学操作,比如我们想要求绝对值或余弦什么的。那这些方法是否需要我们自己实现吗?其实在 java.lang 里的 Math 类Math 类包含用于执行基本数***算的方法,如初等指数、对数、平方根和三角函数。我们就来学习一下吧!

方法  返回值     功能描述
sin(double numvalue)    double  计算角 numvalue 的正弦值
cos(double numvalue)    double  计算角 numvalue 的余弦值
acos(double numvalue)   double  计算 numvalue 的反余弦
asin(double numvalue)   double  计算 numvalue 的反正弦
atan(double numvalue)   double  计算 numvalue 的反正切
pow(double a, double b)     double  计算 a 的 b 次方
sqrt(double numvalue)   double  计算给定值的正平方根
abs(int numvalue)   int     计算 int 类型值 numvalue 的绝对值,也接收 long、float 和 double 类型的参数
ceil(double numvalue)   double  返回大于等于 numvalue 的最小整数值
floor(double numvalue)  double  返回小于等于 numvalue 的最大整数值
max(int a, int b)   int     返回 int 型 a 和 b 中的较大值,也接收 long、float 和 double 类型的参数
min(int a, int b)   int     返回 a 和 b 中的较小值,也可接受 long、float 和 double 类型的参数
rint(double numvalue)   double  返回最接近 numvalue 的整数值
round(T arg)    arg 为 double 时返回 long,为 float 时返回 int   返回最接近arg的整数值
random()    double  返回带正号的 double 值,该值大于等于 0.0 且小于 1.0

上面都是一些常用的方法,如果同学们以后还会用到极坐标、对数等,就去查一查手册吧。

public class MathTest {
    public static void main(String[] args) {
        System.out.println(Math.abs(-12.7));
        System.out.println(Math.ceil(12.7));
        System.out.println(Math.rint(12.4));
        System.out.println(Math.random());
    }
}

java.lang 类 Class

Class 类的实例表示正在运行的 Java 应用程序中的类或接口。在 Java 中,每个 Class 都有一个相应的 Class 对象,即每一个类,在生成的.class文件中,就会产生一个 Class 对象,用于表示这个类的类型信息。我们获取 Class 实例有三种方法:

利用对象调用 getClass()方法获取该对象的 Class 实例

使用 Class 类的静态方法 forName(String className),用类的名字获取一个 Class 实例

运用.class的方式来获取 Class 实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的 Class 实例


java.lang 类 Object

Object 类是所有类的父类,所有对象(包括数组)都实现这个类的方法。所以在默认的情况下,我们定义的类扩展自 Object 类,那我们当然可以调用和重写 Object 类里的所有方法了。

Object 类里都定义了哪些方法。

方法  返回值     功能描述
equals(Objectobj)   boolean     将当前对象实例与给定的对象进行比较,检查它们是否相等
finalize() throws Throwable     void    当垃圾回收器确定不存在对象的更多引用时,由对象的垃圾回收器调用此方法。通常被子类重写
getClass()  Class   返回当前对象的 Class 对象
toString()  String  返回此对象的字符串表示
wait() throws InterruptedException  void    在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,使当前线程进入等待状态