java.lang包 -《Java/Java EE软件工程师就业求职手册》

本章介绍常见的Java基础类,这些类是Java软件开发的基础,也是在项目开发中经常使用的。Java基础类集中在以下包中。

q  ● lang包。

q  ● util包。

q  ● io包。

这些内容是在Java面试中经常考查的知识点,求职者必须掌握。

10.1  java.lang包

java.lang包是Java的基础包,在进行Java编程时,该包是必不可少的。在编译时,java.lang包被自动导入源文件。java.lang包含Object类和包装类(Boolean、Character、Byte、Short、Integer、Long、Float和Double)还包含了一些常用接口和异常等内容。在进行Java编程时,该包是必不可少的。

10.1.1  所有类的父类Object

面试例题1:Object类中的hasCode()方法的返回类型是什么?

请从下面选项中选择正确的答案:

(a)String。

(b)int。

(c)long。

(d)Object。

(e)Class。

考点:考查求职者对Object类的掌握。

出现频率:★★★★

解析

Object类是所有Java类的祖先。每个类都使用 Object 作为超类。所有对象(包括数组)都实现了这个类的方法。

q  ● 在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类。

q  ● 可以使用类型为Object的对象指向任意类型的对象。

q  ● Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法。

q  ● Object类的对象只能用作各种对象的通用持有者。对它们进行任何专门的操作,都需要知道它们的原始类型并进行类型转换。例如:

      Object obj = new MyObject();

      MyObject x = (MyObject)obj;

1.Object类的主要方法

q  ● Object():默认构造方法。

q  ● clone():创建并返回此对象的一个副本。

q  ● equals(Object obj):判断某个其他对象是否与此对象“相等”。

q  ● finalize():当垃圾回收器确定不存在对该对象的引用时,由对象的垃圾回收器调用此方法。

q  ● getClass():返回一个对象的运行时类。

q  ● hashCode():返回该对象的哈希码值。

q  ● notify():唤醒在此对象监视器上等待的单个线程。

q  ● notifyAll():唤醒在此对象监视器上等待的所有线程。

q  ● toString():返回该对象的字符串表示。

q  ● wait():导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法。

q  ● wait(long timeout):导致当前的线程在指定时间(timeout 毫秒)内等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,超过指定的时间量,线程进入就绪状态。

q  ● wait(long timeout, int nanos):导致当前的线程在指定时间(timeout 毫秒,nanos 纳秒)内等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者其他某个线程中断当前线程,或者已超过指定时间量,线程进入就绪状态。

2.equals()方法

equals()方法用于测试某个对象是否同另一个对象相等,它在Object类中的实现是判断两个对象是否指向同一块内存区域。这种测试用处不大,因为即使内容相同的对象,内存区域也是不同的。如果想测试对象是否相等,就需要覆盖此方法,进行更有意义的比较。示例代码如下:

class Employee{

    public boolean equals(Object otherObj){

        //快速测试是否是同一个对象

        if(this == otherObj) return true;

        //如果显式参数为null,必须返回false

        if(otherObj == null) reutrn false;

        //如果类不匹配,就不可能相等

        if(getClass() != otherObj.getClass()) return false;

       

        //现在已经知道otherObj是个非空的Employee对象

        Employee other = (Employee)otherObj;

        //测试所有的字段是否相等

        return name.equals(other.name)

            && salary == other.salary

            && hireDay.equals(other.hireDay);

    }

}

Java语言规范要求equals()方法具有如下所示的特点。

q  ● 自反性:对于任何非空引用值x,x.equals(x)都应返回true。

q  ● 对称性:对于任何非空引用值x和y,当且仅当y.equals(x)返回true 时,x.equals(y)才应返回true。

q  ● 传递性:对于任何非空引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)应返回true。

q  ● 一致性:对于任何非空引用值x和y,多次调用x.equals(y)始终返回true,或者始终返回false,前提是equals比较中所用的信息没有被修改。

说明:对于任何非空引用值x,x.equals(null)都应返回false。从这里看出,上面的例子是Java equals()方法的标准实现。

3.toString()方法

toString()方法返回该对象的字符串表示。Object类中的toString()方法会打印出类名和对象的内存位置。几乎每个类都会覆盖该方法,以便打印对该类的对象当前状态的表示。大多数(非全部)toString()方法都遵循如下格式:类名[字段名=值,字段名=值...]。当然,子类应该定义自己的toString()方法。例如:

public String toString(){

    reurn "Employee[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]";

}

toString()方法是非常重要的调试工具,很多标准类库中的类都定义了toString()方法,以便程序员获得有用的调试信息。

4.hashCode()方法

每个类都可以覆盖Object类中的hashCode()方法。Object类中的hashCode()方法就是简单地将对象在内存中的地址转换成int类型并返回。这样,如果一个类没有覆盖hashCode()方法,那么它的hashCode()方法就是简单地返回对象在内存中的地址。

注意:在JDK中,对hashCode()方法也定义了一系列约束,其中有一条就是如果两个对象是“equal”的,那么它们的hashCode()方法返回的整数值必须相同;如果两个对象是“unequal”,那么它们的hashCode()方法的返回值不一定必须不同。正因为这个约束,如果重写了equals()方法,一般也要重写hashCode()方法。

很明显,面试例题1的返回值为int类。

答案:(b)。

面试例题2:Object类的clone()方法可以抛出哪个异常?

请从下面选项中选择正确的答案。

(a)CloneNotSupportedException。

(b)NotCloneableException。

(c)IllegalCloneException。

(d)NoClonesAllowedException。

考点:考查求职者对Object类的掌握。

出现频率:★★★★

解析

如果对象的类没有实现Cloneable接口,Object类的clone()方法就会抛出CloneNotSupportedException异常。

答案:(a)。

面试例题3:下面说法哪些是正确的?

请从下面的选项中选择正确的答案。

(a)如果引用x和引用y表示2个不同的对象,那么表达式x.equals(y)始终为false。

(b)如果引用x和引用y表示2个不同的对象,那么表达式(x.hasCode()==y.hasCode())始终为false。

(c)Object类中的hasCode()方法被声明为final。

(d)Object类中的equals()方法被声明为final。

(e)所有数组都有一个clone()方法。

考点:考查求职者对Object类的掌握。

出现频率:★★★★

解析

在Object类中,hasCode()和equals()都没有声明为final,不能保证这些方法能够区分所有的对象,所以(a)、(b)、(c)、(d)都是错误的。

数组是一个对象,继承了Object类,有clone()方法。

答案:(e)。

10.1.2  数字计算Math类

Math类是一个声明为final的类,该类提供了一组静态方法,提供了常见的数字计算功能,包括取整函数、三角函数、生成随机函数、求最大值最小值等。Math不能被实例化,只能使用类名来调用静态方法。

面试例题4:Math.abs(10,4)函数返回下面哪个值?

调用Math.abs(10,4)函数返回下面哪个值?

(a)10.0。

(b)10.4。

(c)11.0。

(d)-10.4。

考点:考查求职者对于Java数字计算Math类的方法函数的掌握。

出现频率:★★★★★

解析

数学类包含了许多数学函数,如sin()、cos()、exp()、abs()等。Math类是一个工具类,它在解决与数学有关的问题时有着非常重要的作用。

这个类有两个静态属性:E和PI。E代表数学中的e(2.7182818),而PI代表派pi (3.1415926)。引用时分别为Math.E和Math.PI。

Math类的常用API如下。

q  ● static double abs(double a):返回double值的绝对值。

q  ● static float abs(float a):返回float值的绝对值。

q  ● static int abs(int a):返回int值的绝对值。

q  ● static long abs(long a):返回long值的绝对值。

q  ● static double acos(double a):返回角的反余弦,范围在0.0~pi之间。

q  ● static double asin(double a):返回角的反正弦,范围在-pi/2~pi/2之间。

q  ● static double atan(double a):返回角的反正切,范围在-pi/2~pi/2之间。

q  ● static double atan2(double y, double x):将矩形坐标(x, y)转换成极坐标(r, theta)。

q  ● static double cbrt(double a):返回double值的立方根。

q  ● static double ceil(double a):返回最小的(最接近负无穷大)double值,该值大于或等于参数,并且等于某个整数。

q  ● static double cos(double a):返回某角度的三角余弦。

q  ● static double cosh(double x):返回double值的双曲线余弦。

q  ● static double exp(double a):返回欧拉数e的double次幂的值。

q  ● static double expm1(double x):返回exp(double x)-1的值。

q  ● static double floor(double a):返回最大的(最接近正无穷大)double值,该值小于或等于参数,并且等于某个整数。

q  ● static double hypot(double x, double y):返回sqrt(x2 +y2),没有中间溢出或下溢。

q  ● static double IEEEremainder(double f1,double f2):按照IEEE 754 标准的规定,对两个参数进行余数运算。

q  ● static double log(double a):返回double 值的自然对数(底数是e)。

q  ● static double log10(double a):返回 double 值的底数为 10 的对数。

q  ● static double log1p(double x):返回参数与 1 的和的自然对数。

q  ● static double max(double a, double b):返回两个 double 值中较大的一个。

q  ● static float max(float a, float b):返回两个 float 值中较大的一个。

q  ● static int max(int a, int b):返回两个 int 值中较大的一个。

q  ● static long max(long a, long b):返回两个 long 值中较大的一个。

q  ● static double min(double a, double b):返回两个 double 值中较小的一个。

q  ● static float min(float a, float b):返回两个 float 值中较小的一个。

q  ● static int min(int a, int b):返回两个 int 值中较小的一个。

q  ● static long min(long a, long b):返回两个 long 值中较小的一个。

q  ● static double pow(double a, double b):返回第1个参数的第2个参数次幂的值。

q  ● static double random():返回带正号的 double 值,大于或等于 0.0,小于 1.0。

q  ● static double rint(double a):返回其值最接近参数并且是整数的 double 值。

q  ● static long round(double a):返回最接近参数的 long值。

q  ● static int round(float a):返回最接近参数的 int值。

q  ● static double signum(double d):返回参数的符号函数;如果参数是零,则返回零;如果参数大于零,则返回 1.0;如果参数小于零,则返回 -1.0。

q  ● static float signum(float f):返回参数的符号函数;如果参数是零,则返回零;如果参数大于零,则返回 1.0;如果参数小于零,则返回 -1.0。

q  ● static double sin(double a):返回某角度的三角正弦。

q  ● static double sinh(double x):返回 double 值的双曲线正弦。

qstatic double sqrt(double a):返回四舍五入的 double 值的正平方根。

q  ● static double tan(double a):返回某角度的三角正切。

q  ● static double tanh(double x):返回 double 值的双曲线余弦。

q  ● static double toDegrees(double angrad):将用弧度测量的角转换为近似相等的用度数测量的角。

q  ● static double toRadians(double angdeg):将用度数测量的角转换为近似相等的用弧度测量的角。

q  ● static double ulp(double d):返回参数的ulp大小。

q  ● static float ulp(float f):返回参数的ulp大小。

面试例题4是求绝对值,10.4的绝对值就是10.4。

答案:(b)。

面试例题5:下面程序代码哪些部分能够打印出11?

public class MyClass {

    public static void main(String[] args) {

        double v = 10.5;

        System.out.println(Math.ceil(v));// (1)

        System.out.println(Math.round(v));// (2)

        System.out.println(Math.floor(v));// (3)

        System.out.println((int) Math.ceil(v));// (4)

        System.out.println((int) Math.floor(v));// (5)

    }

}

请选择正确的答案。

(a)标记为(1)处的代码。

(b)标记为(2)处的代码。

(c)标记为(3)处的代码。

(d)标记为(4)处的代码。

(e)标记为(5)处的代码。

考点:考查求职者对于Java数字计算Math类的方法函数的掌握。

出现频率:★★★★

解析

标记为(2)和(4)的行将会正确打印出11,因为它们的表达式会返回整数型值11,表达式Math.ceil(v)将返回双精度值11.0,打印出来也是11.0,表达式Math.floor(v)将返回10.0d。

答案:(b)(d)。

面试例题6:Math. ceil(-5.5)返回值是哪个?

请从下面选项中选择Math. ceil(-5.5)的返回值。

(a)-6.0。

(b)-5.0。

(c)-5.5。

(d)-4.0。

考点:考查求职者对于Java数字计算Math类的方法函数的掌握。

出现频率:★★★★

解析

ceil()方法的含义是返回最小的(最接近负无穷大的)double值,该值大于或等于参数,并且等于某个整数。正确答案为-5.0。

答案:(b)。

10.1.3  最常用的String类

面试例题7:下面哪些运算符不能用于合并字符串对象?

请从下面选项中选择不能用于合并字符串对象的运算符。

(a)+

(b)-

(c)+=

(d).

(e)&

考点:考查求职者对Java的String类的掌握。

出现频率:★★★★★

解析

Java开发中, String类使用相当频繁,Java的String是类而不是原始数据类型,这一点应当时刻注意。String类的常用方法如下。

1.String (char a[])

下面示例用一个字符数组a创建一个字符串对象,代码如下:

  char a[]={¢b¢,¢o¢,¢y¢};

  String s=new String(a);

上述过程相当于“String s= "boy";”。

2.String(char a[],int startIndex,int count)

提取字符数组a 中的一部分字符创建一个字符串对象,参数startIndex 和count 分别指定在a中提取字符的起始位置和从该位置开始截取的字符个数,例如:

char a[]={¢s¢,¢t¢,¢b¢,¢u¢,¢s¢,¢¢n¢};

String s=new String(a,2,3);

上述过程相当于 String s= "bus";

3.equals()方法

与equals()方法类似,equalsIgnoreCase()方法忽略大小写。字符串对象调用String类中的public boolean equals(String s)方法比较当前字符串对象的实体是否与参数指定的字符串s的实体相同。示例代码如下:

String tom=new String( "we are students");

String boy=new String( "We are students");

String jerry= new String("we are students");

tom.equals(boy)的值是false。

tom.equals(jerry)的值是 true。

4.startsWith()和endsWith()方法

startsWith()和endsWith()方法用于判断字符串是否以指定字符串作为开头或者是结尾,返回值为布尔类型。示例代码如下:

String tom= "220302620629021";

jerry= "21079670924022";

tom.startsWith("220")的值是true。

jerry.startsWith("220")的值是false。

5.regionMatches()方法

字符串调用public boolean regionMatches(int firstStart,String other,int ortherStart,int length)方法,从当前字符串参数firstStart指定的位置处开始,取长度为length的一个子串,并将这个子串和参数other指定的一个子串进行比较,其中,other指定的子串是从参数othertStart指定的位置开始,从other中取长度为length的一个子串。如果两个子串相同,该方法就返回true,否则返回false。该方法存在重载方法:

public boolean regionMatches(boolean b,int firstStart,String other,int ortherStart,intlength)

可以通过参数b决定是否忽略大小写,当b取true时,忽略大小写。

6.compareTo()和compareToIgnoreCase()方法

字符串对象可以使用String类中的compareTo()方法,按词典顺序与参数s指定的字符串比较大小。

如果当前字符串与s相同,该方法返回值0;如果当前字符串对象大于s,该方法返回正值;如果小于s,该方法返回负值。

7.indexOf ()方法

字符串调用public int indexOf(String s)方法从当前字符串的头开始检索字符串s,并返回首次出现s的位置。如果没有检索到字符串s,该方法的返回值是-1。

字符串调用public int indexOf(String s ,int startpoint)方法从当前字符串的startpoint位置处开始检索字符串s,并返回首次出现s的位置。如果没有检索到字符串s,该方法返回的值是-1。

字符串调用public int lastIndexOf (String s)方法从当前字符串的头开始检索字符串s,返回最后出现s的位置。如果没有检索到字符串s,该方法返回的值是-1。

字符串调用public int lastIndexOf(String s ,int startpoint)方法从当前字符串的startpoint位置处开始检索字符串s,并返回最后出现s的位置。如果没有检索到字符串s,该方法返回的值是-1。

8.substring()方法

字符串对象调用public String substring(int startpoint)方法获得一个当前字符串的子串,该子串是从当前字符串的startpoint处截取到最后所得到的字符串。

字符串对象调用public String substring(int start ,int end)方法获得一个当前字符串的子串,该子串是从当前字符串的start处截取到end处所得到的字符串,但不包括end处所对应的字符。

9.replace()方法

字符串对象调用public String replace(char oldChar,char newChar)方法可以获得一个新字符串对象,这个对象是用参数newChar指定的字符替换原字符串中由oldChar指定的所有字符而得到的字符串。

字符串对象调用 public String replaceAll(String old ,String new)方法可以获得一个新字符串对象,这个对象是通过用参数new指定的字符串替换原字符串中由old指定的所有字符串而得到的字符串。

字符串通过调用Public String trim()方法得到一个新的字符串对象,该字符串对象是去掉前后空格后的字符串。

10.整型转化

java.lang包中的Integer类调用public static int parseInt(String s)方法可以将“数字”格式的字符串转化为int型数据。示例如下:

int x;

String s="6542";

x=Integer.parseInt("6542");

类似地,使用java.lang包中的Byte、Short、Long类可以调用相应的类方法,将“数字”格式的字符串转换为相应的基本数据类型。类方法如下所示:

public static byte parseByte(String s)

public static short parseShort(String s)

public static long parseLong(String s)

11.float型或double型转化

java.lang包中的Float类调用其类方法public static int parseFloat (String s)可以将 “数字”格式的字符串转化为float型数据。代码如下:

  float n=Float.parseFloat("12387.8976")

或:

  String s= new String(“12387.8976”);

  float n=Float.parseFloat(s)

12. StringvalueOf()方法

转换其他类型为字符串的函数,使用方法如下:

public StringvalueOf( byte n)

  public StringvalueOf (int n)

  public StringvalueOf (long n)

  public StringvalueOf (float n)

  public StringvalueOf (double n)

示例如下:

String str=String.valueOf(12313.9876);

float x=123.987f;

String temp=String.valueOf(x);

13.将字符串中的字符复制到字符数组

字符串调用public void getChars(int start,int end,char c[],int offset )方法将前字符串中从位置start到end-1位置上的字符复制的数组c中,并从数组c的offset处开始存放这些字符。需要注意的是,必须保证数组c能容纳下要被复制的字符。

面试例题7中,运算符-和&不能处理String对象, +和+=可以用来进行字符串串联。

答案:(b)(e)。

面试例题8:如何提取字符串?

为了提取字符串String str=“helloworld”中的“llo”子字符串,下面哪个表达式是正确的?请选择正确的答案。

(a)str.substring(2,2)

(b)str.substring(2,3)

(c)str.substring(2,4)

(d)str.substring(2,5)

(e)str.substring(3,3)

考点:考查求职者对Java的String类的掌握。

出现频率:★★★★

解析

字符串对象调用public String substring(int start ,int end)方法获得一个当前字符串的子串,该子串是从当前字符串的start处截取到end处所得到的字符串,但不包括end处所对应的字符。

根据以上的定义,可以知道str.substring(2,5)将提取“llo”子字符串。

答案:(d)。

面试例题9:String类的trim()方法有什么作用?

请选择正确的答案。

(a)trim()方法将移除原字符串开始位置的空白字符,并返回移除后的字符串。

(b)trim()方法将移除原字符串结尾的空白字符,并返回移除后的字符串。

(c) trim()方法将移除原字符串开始位置和结尾位置的空白字符,并返回移除后的字符串。

(d)trim()方法将移除原字符串所有的空白字符,并返回移除后的字符串。

(e)以上都不是。

考点:考查求职者对Java的String类的掌握。

出现频率:★★★★

解析

String类的trim()方法的作用就是返回一个字符串,该字符串将原来字符串的头尾空白部分去掉。

答案:(c)。

面试例题10:String类的concat方法

编译并运行下面的程序,其结果是什么?

public class MyClass {

    public static void main(String[] args) {

        String str1 = "str1";

        String str2 = "str2";

        String str3 = "str3";

        str1.concat(str2);

        System.out.println(str3.concat(str1));

    }

}

请选择正确的答案。

(a)代码不能通过编译,因为表达式str3.concat(str1)不是println()函数的合法参数。

(b)程序在运行时将会打印str3str1str2。

(c)程序在运行时将会打印str3。

(d)程序在运行时将会打印str3str1。

(e)程序在运行时将会打印str3str2。

考点:考查求职者对Java的String类的掌握。

出现频率:★★★★

解析

String类的concat()方法的作用就是将当前的String对象和参数的String对象串联起来,并返回一个新的字符串对象。

面试例题10中虽然使用了str1.concat(str2),但是并没有改变对象的引用,所以输出的字符串就是str3.concat(str1),即“str3str1”。

答案:(d)。

面试例题11:下面哪些表达式是非法的?

请从下面选项中选择3个非法表达式。

(a)"hel".concat("lo");

(b)("hel"+"lo");

(c)('h'+'e'+'l'+'l'+'o');

(d)("hel"+new String('l'+'o'));

(e)"hel"+new String("lo");

考点:考查求职者对Java的String类的掌握。

出现频率:★★★★

解析

(a)是合法的,“hel”就是一个String对象;(b)是非法的,因为表达式是不完整的;(c)和(d)是非法的,(c)的错误之处同(b)是一样的;(d)是错误的,因为'l'+'o'是1个int类型值;(e)表达式是正确的。

答案:(b)(c)(d)。

面试例题12:下面哪个表达式结果为true?

请选择运行结果为true的表达式。

(a)"hello:world!".equals("hello world");

(b)"HELLO WORLD".equals("hello world");

(c)("hello".concat("world")).equals("hello world");

(d)"Hello World".compareTo("hello world") == 0;

(e)"Hello World".toLowerCase().equals("hello world");

考点:考查求职者对Java的String类的掌握。

出现频率:★★★

解析

String类中的public boolean equals(String s)方法比较当前字符串对象的实体是否与参数指定的字符串s的实体相同,如果相同,则返回true。

面试例题12的几个表达式中,只有(e)可以返回true。

答案:(e)。

面试例题13:String对象的length方法的使用。

编译并运行下面的程序,结果是什么?

public class MyClass {

    public static void main(String[] args) {

        String s = "Java 你好";

        System.out.println(s.length);

    }

}

请选择正确答案:

(a)9

(b)7

(c)11

(d)编译错误

考点:考查求职者对Java的String类的掌握。

出现频率:★★★

解析

面试例题13的考查点并不是String对象含有汉字的问题,而是String对象的length()方法的使用。与数组不同,String对象成员方法length()来返回字符串长度。

值得注意的是,使用length()方法时,1个汉字字符算1个长度,因为Java使用的是Unicode编码。

答案:(d)。

10.1.4  容易混淆的StringBuffer类

面试例题14:理解StringBuffer类。

编译并运行下面程序,结果是什么?

public class MyClass {

    public static void main(String[] args) {

        String s = "hello";

        StringBuffer sb = new StringBuffer(s);

        sb.reverse();

        if (s == sb)

            System.out.println("a");

        if (s.equals(sb))

            System.out.println("b");

        if (sb.equals(s))

            System.out.println("c");

    }

}

请选择正确的答案。

(a)代码不能正确编译,因为没有正确调用String类的构造函数。

(b)代码不能正确编译,因为表达式s==sb是非法的。

(c)代码不能正确编译,因为表达式s.equals(sb)是非法的。

(d)运行时打印c。

(e)运行时打印b。

考点:考查求职者对于Java的StringBuffer类的理解和掌握。

出现频率:★★★★

解析

StringBuffer字符串缓冲区实现可变字符序列。字符串缓冲区可以被多个线程安全地使用。这些方法在需要的时侯可以同步执行,因而任一特定实例的所有操作就好像是以串行的次序发生。

字符串缓冲区中连接两个字符串使用+运算符。示例代码如下:

     x = "a" + 4 + "c"

被等价编译成如下代码:

     x = new StringBuffer().append("a").append(4).append("c").toString()

StringBuffer的基本操作是append()和insert()方法,它们都被重载以接受任意类型的数据。每个方法都迅速地把所给的数据转换成一个字符串,并且把该字符串的字符添加或插入到字符串缓冲区中。append()方法常常把这些字符添加到缓冲区的末端,而insert()方法则把这些字符添加到指定的地方。

例如,如果z指的是一个字符串缓冲区内的对象,当前的内容是“start”,通过调用方法z.append("le")会使字符串缓冲区的内容变成"startle",调用z.insert(4, "le")将使缓冲区的内容变成"starlet"。

每一个字符串缓冲区都有一定的容量。只要字符串缓冲区存储的字符序列的长度没有超过它的容量,就无须申请新的内部缓冲数组。如果内部的缓冲区溢出,它将自动加以扩大。

1.构造器

q  ● StringBuffer():构造一个不包含字符的字符串缓冲区,其初始的容量设为16个字符。

q  ● StringBuffer(int length):构造一个不包含字符的字符串缓冲区,其初始容量由参数length设定。

q  ● StringBuffer(String s):构造一个字符串缓冲区,使它表示和字符串参数相同的字符序列。

2.常见方法

q  ● append(boolean b):把boolean型参数的字符串表示添加到字符串缓冲区。

q  ● append(char c):把char型参数的字符串表示添加到字符串缓冲区。

q  ● append(char[] str):把char型数组参数的字符串表示添加到字符串缓冲区。

q  ● append(char[] str,int i,int i):把char型数组参数的子数组的字符串表示添加到字符串缓冲区。

q  ● append(double d):把double型参数的字符串表示添加到该字符串缓冲区。

q  ● append(float f):把float型参数的字符串表示添加到该字符串缓冲区。

q  ● append(int i):把int型参数的字符串表示添加到该字符串缓冲区。

q  ● append(long l):把long型参数的字符串表示添加到该字符串缓冲区。

q  ● append(Object obj):把Object型参数的字符串表示添加到该字符串缓冲区。

q  ● append(String str):添加字符串到字符串缓冲区。

q  ● capacity():返回字符串缓冲区的当前容量。

q  ● charAt(int i):返回字符串缓冲区中特定位置的字符。

q  ● ensureCapacity(int i):保证缓冲区的容量至少等于指定的最小数。

q  ● getChars(int i,int j,char[] str,int k):把字符从字符串缓冲区复制到目标字符数组dst。

q  ● insert(int i,boolean b):把boolean型参数的字符串表示添加到该字符串缓冲区。

q  ● insert(int i,char c):把char型参数的字符串表示添加到该字符串缓冲区。

q  ● insert(int i,char[] str):把char型数组参数的字符串表示添加到该字符串缓冲区。

q  ● insert(int i,double d):把double型参数的字符串表示添加到该字符串缓冲区。

q  ● insert(int i,float f):把float型参数的字符串表示添加到该字符串缓冲区。

q  ● insert(int i,int j):把第2个int型参数表示的字符串插入到该字符串缓冲区。

q  ● insert(int i,long l):把long型参数的字符串表示插入到该字符串缓冲区。

q  ● insert(int i,Object obj):把Object型参数的字符串表示插入到该字符串缓冲区。

q  ● insert(int i,String s):把字符串插入到字符串缓冲区。

q  ● length():返回字符串缓冲区的长度(字符数)。

q  ● reverse():把字符串缓冲区的字符序列用其反向字符序列替换。

q  ● setCharAt(int i,char c):字符串缓冲区指定位置的字符设置为ch。

q  ● setLength(int i):设置字符串缓冲区的长度。

q  ● toString():把字符串缓冲区的数据转换为字符串表示。

3.String同StringBuffer的区别

字符串的操作和存储,Java语言提供了String和StringBuffer类来处理。那么这两个类有什么区别呢?

String类提供了数值不可变的字符串,String类的对象一旦创建之后,它的所有属性都是final类型的,也就是说一旦创建后,就不能修改。StringBuffer则是可变的。这是两者之间最大的区别。示例如下:

package ch10;

public class MyClass {

    public static void stringReplace(String textString) {

        textString = textString.replace('j', 'i');

    }

    public static void bufferReplace(StringBuffer text) {

        text = text.append("C");

    }

    public static void main(String args[]) {

        String textString = new String("java");

        StringBuffer textBuffer = new StringBuffer("java");

        stringReplace(textString);

        bufferReplace(textBuffer);

        System.out.println(textString + textBuffer);

    }

}

运行该程序代码,结果如下:

javajavaC

读者会疑惑为什么没有打印“iavajavaC”,是因为String对象一旦创建后就不能修改,append方法会改变textString中的值,而text与textBuffer指向的地址是相同的,因此会打印javaC。

面试例题14中,(b)是非法的,因为s==sb对比了两个不同的类。

答案:(b)。

面试例题15:setLength()方法。

编译并运行下面程序,结果是什么?

public class MyClass {

    public static void main(String args[]) {

        StringBuffer sb = new StringBuffer("hello world!");

        sb.setLength(5);

        System.out.println(sb);

    }

}

请选择正确的答案。

(a)不能编译,因为StringBuffer类中没有setLength()方法。

(b)不能编译,因为StringBuffer不是println()方法的合法参数。

(c)在运行时会抛出1个异常。

(d)将会打印hello world。

(e)将会打印hello。

(f)将会打印hellow。

考点:考查求职者对于Java的StringBuffer类的setLength方法理解和掌握。

出现频率:★★★★

解析

setLength()方法会将sb截短到5个字符,sb变成了“hello ”,所以将会在控制台中打印出hello字样。

答案:(e)。

面试例题16:哪些参数列表具有相应的StringBuffer类构造函数?

请选择正确的答案。

(a)()

(b)( int capacity)

(c)( char[] data)

(d)(String str)

考点:考查求职者对于Java的StringBuffer类的构造器理解和掌握。

出现频率:★★★★

解析

StringBuffer类的构造器没有将字符数组作为构造参数来使用。

答案:(a)(b)(d)。

面试例题17:哪个方法不是StringBuffer定义的?

请选择一个正确的答案。

(a)trim()

(b)length()

(c)append(String)

(d)reverse()

(e)setLength(int)

考点:考查求职者对于Java的StringBuffer类理解和掌握。

出现频率:★★★

解析

trim()方法是String中定义的,在StringBuffer并没有。

答案:(a)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值