文档库 最新最全的文档下载
当前位置:文档库 › java常用类知识点总结

java常用类知识点总结

java常用类知识点总结
java常用类知识点总结

java常用类知识点总结

Java常用类

要求:

1、掌握String和StringBuffer的区别,可以熟练使用String和StringBuffer的各

种方法进行相关操作。

2、能够自己编写一个得到日期的操作类,并将日期进行格式化操作。

3、掌握比较器及其基本原理,并可以通过比较器进行对象数组的比较操作。

4、掌握对象克隆技术及其实现

5、能够灵活应用正则表达式对字符串的组成进行判断

6、掌握Math、Random、基本数据类型的包装类的使用

7、描述出Object System对垃圾收集的支持

8、使用NumberFormat、DecimalFormat、BigInteger、BigDecimal进行数字的操

String和StringBuffer

String的内容一旦声明不可改变,如果要改变,改变的是String的引用地址,如果一个字符串要经常改变,必须使用StringBuffer。

在一个字符串内容需要频繁修改时,使用StringBuffer可以提升操作性能,因为StringBuffer内容可以改变,而String内容不可改变。StringBuffer支持的方法大部分与String类似。

StringBuffer常见用法:

(1) 字符串的连接操作

String类可以通过“+“进行字符串的连接,而StringBuffer中却只能使用append方法进行字符串的连接,而且此方法返回一个StringBuffer类的实例,这样就可以采用代码链的形式一直调用append方法。

(2) 在任意位置处为StringBuffer添加内容

可以使用insert方法在指定位置上为StringBuffer添加内容

字符串的反转操作(较为常见的操作,使用reverse方法) (3) 替换指定范围的内容

replace方法可对指定范围的内容进行替换。在String中如果要替换,使用的是replaceAll

(4) 字符串截取(使用subString方法从指定范围中截取内容) (5) 删除指定范围的字符串(使用delete方法删除指定范围内容) (6) 查找指定内容是否存在(indexOf查找指定内容,查找到返回内容的位置,

没查到返回-1)

问题:(1)String s = "Hello";s = s + " world!";这两行代码执行后,原始的String对象中的内容到底变了没有,

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s原先指向一个String对象,内容是 "Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢,答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,

或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为 String对象建立之后不能再改变,所以对于每一个不同的字符

串,都需要一个String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:

public class Demo {

private String s;...

public Demo {

s = "Initial Value";

}...}

而非

s = new String("Initial Value"); 后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。

至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会

造成性能上的问题。所以Java标准类库还提供了一个可变版本,即StringBuffer。

(2)String s = new String("xyz");创建了几个String Object? 二者之间有什么区别,

两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";

答:对于如下代码:

String s1 = "a";

String s2 = s1 + "b";

String s3 = "a" + "b";

System.out.println(s2 == "ab"); System.out.println(s3 == "ab"); 第一条语句打印的结果为false,第二条语句打印的结果为true,这说明javac编译可以对字符串常量直接相加的表达式进行优化,不必要等到运行期去进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。

题目中的第一行代码被编译器在编译时优化后,相当于直接定义了一

个”abcd”的字符串,所以,上面的代码应该只创建了一个String对象。写如下两行代码,

String s = "a" + "b" + "c" + "d";

System.out.println(s == "abcd"); 最终打印的结果应该为true。

)String 和StringBuffer的区别 (3

JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。String类表示内容不可改变的字符串。而StringBuffer类表示内容可以被修改的字符串。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。另外,String实现了equals方法,new String(“abc”).equals(new String(“abc”)的结果为true,而StringBuffer没有实现equals方法,所以,new StringBuffer(“abc”).equals(new StringBuffer(“abc”)的结果为false。

接着要举一个具体的例子来说明,我们要把1到100的所有数字拼起来,组成一个串。

StringBuffer sbf = new StringBuffer(); for(int i=0;i<100;i++)

{

sbf.append(i);

}

上面的代码效率很高,因为只创建了一个StringBuffer对象,而下面的代码效率很低,因为创建了101个对象。

String str = new String(); for(int i=0;i<100;i++)

{

str = str + i;

}

String覆盖了equals方法和hashCode方法,而StringBuffer没有覆盖equals方法和hashCode方法,所以,将StringBuffer对象存储进Java集合类中时会出现问题。

Runtime类

在java中Runtime表示运行时操作类,是一个封装了JVM进程的类,每一个JVM对应着Runtime类的实例,此实例由JVM运行时为其实例化,通过此类我们可以获取一些系统信息(见JDK中该类的方法)。在JDK文档中不会发现任何有关这个类中构造方法的定义,这是因为Runtime类本身的构造方法是私有化的(单例设计),如果想取得一个Runtime实例,则只能通过下面的方式: Runtime run= Runtime.getRuntime() 此类的常用用法:

(1)可以取得JVM中的内存空间,包括最大内存空间、空闲内存空间等,通过这些信息可以清楚的知道JVM的内存使用情况。

(2)除了观察内存使用量外,也可以直接使用Runtime类运行本机的可执行程序,如调用本机的记事本程序和画图板程序,调用本机程序,必须进行异常处理。

System类

是一些与系统相关的属性和方法的集合,所有属性和方法都是静态的,(见API 文档)

此类的常用用法:

获得本机的全部环境属性(getProperties、getProperty(String key)) 计算程序的执行时间(currentTimeMillis方法)

系统退出的方法和数组的复制方法

垃圾收集方法(System.gc,此方法实际是对Runtime类中gc方法的封装) 日期操作类(Date 、Calender 、SimpleDataFormat) 1、Date类可以得到一个完整的日期,但是日期格式不符合平常看到的格式,时间也不能精确到毫秒,要想按照用户自己的格式显示时间可以使用Calender类完成操作。

2、Calender可以将取得的时间精确到毫秒,但是此类是抽象类,要想使用抽象类,必须依靠对象的多态性,通过子类进行父类得实例化操作,其子类是

GregorianCalender,在Calender中提供了部分常量,分别表示日期的各个数字(见API文档)。

3、Date类取得的时间是一个正确的时间,但显示格式不符合习惯,可以利用DateFormat类进行格式化,格式是其默认的时间显示格式。此类是一个抽象类,无法直接实例化,但是此类提供了一个静态方法可获得本类的实例。

4、如果要想得到用户自己需要的日期显示格式,要通过SimpleDataFormat完成。

Math类

提供了一些列数学操作方法,包括求绝对值、三角函数等,都是静态方法,通过类名调用即可。

注意:Math类中round方法的作用是进行四舍五入,此方法在操作时将小数点后面的全部数字都忽略掉,如果想精确到小数点后的准确位数,必须使用BigDecimal类。

Random类

随机数产生类,可以指定一个随机数的范围,然后任意产生在此范围中的数字。 NumberFormat类

表示数字的格式化类,可以按照本地的风俗习惯进行数字的显示。此类是一个抽象类,无法直接实例化,但是此类提供了一个静态方法可获得本类的实例。DecimalFormat类

主要作用是格式化数字,在格式化数字时,要比直接使用NumberFormat更方便,因为可以直接指定按用户自定义的方式进行格式化操作,与SimpleDataFormat

类似,如果要进行自定义格式化操作,则必须指定格式化操作的模板。

BigInteger类

当一个数字非常大时,则肯定无法使用基本类型接收,所以,最早碰到大数字时往往会使用String类进行接收,然后再采用拆分的方式进行计算,但操作很麻烦,在java中提供BigInteger解决这样的难题,表示大整数类,如果在操作时一个整型数据已经超过了整数的最大类型long,数据无法输入,可以使用

BigInteger类进行操作,此类封装了各个常用的基本运算(见API) BigDecimal类

对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal,此类也可进行大数操作。对象克隆技术

Java中支持对象的克隆操作,使用Object 的clone方法即可。此方法是受保护的类型,所以在子类中必须重写此方法,而且重写后应该扩大访问权限,这样才能被外部调用,但是具体的克隆方法的实现还是在Object中,所以在重写的方法中只需要调用Object类中的clone方法即可完成操作(super.clone()),而且在对象所在类中必须实现Cloneable接口才可以完成对象的克隆操作。 Arrays类数组操作类,实现数组元素的查找、数组内容的填充、排序等。 Comparable

接口

使用Arrays类可以进行数组的排序,而且其sort方法被重载了多次,可以对任意类型的数组排序,排列时会根据数值的大小进行排序,此类也可对Object数组进行排序,但是要使用此种方法排序也是有要求的,即对象所在的类必须实现Comparable接口,此接口就是用于指定对象排序规则的。(看API中此接口的定义)提供了comperTo的比较方法,用来设置比较规则。

具体应用:要求设计一个学生类,此类包括姓名、年龄、成绩,共产生一个对

象数组,要求按成绩由高到低排序,如果成绩相等,则按年龄由低到高排序。另外一种比较器Comparator接口

与Comparable接口不同,需要单独指定好一个比较器的比较规则类才可以完成数组排序。建议还是使用Comparable接口进行排序操作比较方便。正则表达式可以方便对数据进行匹配,还可以执行更复杂的字符串验证、拆分、替换功能。 Pattern类和Matcher类

如果要在程序中应用正则表达式必须依靠Pattern类和Matcher类,Pattern 类主要作用是进行正则规范的编写,而Matcher类主要是执行规范,验证一个字符串是否符合其规范。

String类对正则表达式的支持

三个方法matches(字符串匹配)、replaceAll (字符串替换)、split(字符串拆分) 定时调度(Timer 和TimeTask)本部分是了解内容

1、Timer类是一种线程设施,可以用来实现在某一个时间或某一段时间后安排某一个任务执行一次或重复执行,该功能要与TimeTask配合使用,TimeTask类用来实现由Timer安排的一次或重复执行的某一个任务。

2、每一个Timer对象对应的是一个线程,因此计时器所执行的任务应该迅速完成,否则可能会延迟后续任务的执行,而这些后续任务有可能堆在一起,等到该任务完成后才能快速连续执行。

3、要执行具体的任务,必须使用TimeTask类,此类为抽象类,如果要使用该类,必须自己建立一个类来继承此类,并实现其中的抽象方法。

Java编程,打印昨天的当前时刻

public class YesterdayCurrent{

public void main(String[] args){ Calendar cal =

Calendar.getInstance(); cal.add(Calendar.DATE, -1);

如何将数值型字符转换为数字(Integer,Double),

Integer.parseInt(“1234”)

Double.parseDouble(“123.2”)

如何将数字转换为字符,

1+””

1.0+””

如何去小数点前两位,并四舍五入。

double d=1256.22d;

d=d/100;

System.out.println(Math.round(d)*100); 如何取得年月日,小时分秒, Calendar c=Calendar.getInstance();

c.set(Calendar.YEAR,2004);

c.set(Calendar.MONTH,0);

c.set(Calendar.DAY_OF_MONTH,31);

System.out.println(c.get(Calendar.YEAR)+"

"+(c.get(Calendar.MONTH)+1)+" "+c.get(Calendar.DAY_OF_MONTH)); 如何取得从1970年到现在的毫秒数

Java.util.Date dat=new Date();

long now=dat.getTime();

如何获取某个日期是当月的最后一天,

当前日期加一天,若当前日期与结果的月份不相同,就是最后一天。

取下一个月的第一天,下一个月的第一天-1

public static void main(String[] args)

{

Calendar c=Calendar.getInstance();

c.set(Calendar.YEAR,2004);

c.set(Calendar.MONTH,0);

c.set(Calendar.DAY_OF_MONTH,30);

Calendar c1=(Calendar)c.clone();

System.out.println(c.get(Calendar.YEAR)+"

"+(c.get(Calendar.MONTH)+1)+" "+c.get(Calendar.DAY_OF_MONTH));

c.add(Calendar.DAY_OF_MONTH,1);

if(c.get(Calendar.MONTH)!=c1.get(Calendar.MONTH))

{

System.out.println("是最后一天");

}

else

{

System.out.println("不是取后一天");

}

}

如何格式化日期,

Import java.text. SimpleDateFormat; SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

Date dat=new Date();

//把日期转化为字符串

String str=sdf.format(dat);

System.out.println(str);

//将字符串转化为日期

Java.util.Date d1=sdf.parse(“yyyy-mm-dd”);

编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串。 String a=new String("中".getBytes("gb2312"),"iso-8859-1");

String a=new String("中".getBytes("iso-8859-1")); String s = new String("xyz");创建了几个String Object? New了一个,”XYZ”本来又是一个两个

float型float f=3.4是否正确?

报错,应当是float f=3.4f

如果是float f=3(整数)正确

写clone()方法时,通常都有一行代码,是什么,

Clone 有缺省行为,super.clone();他负责产生正确大小的空间,并逐位复制。 String and StringBuffer的区别,

String:长度给定不可变,当多个字符串联合时要先转为StringBuffer,再联合,速度慢。

StringBuffer:长度可变,可以将多个字符串值直接联合,效率高

Math.round(11.5)等于多少? Math.round(-11.5) 等于多少?

Math.round(11.5)==12 Math.round(-11.5)==-11 round方法返回与参数最接近的长整数,参数加1/2后求其floor.

两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 对,有相同的hash code。

如何把一段逗号分割的字符串转换成一个数组?

1. 用正则表达式,代码大概为:String [] result = orgStr.split(“,”);

2. 用 StingTokenizer ,代码为:StringTokenizer tokener = StringTokenizer(orgStr,”,”);

String [] result = new String[tokener .countTokens()];

Int i=0;

while(tokener.hasNext(){result[i++]=toker.nextToken();}

相关文档