06常用类.docx
- 文档编号:26352850
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:17
- 大小:72.85KB
06常用类.docx
《06常用类.docx》由会员分享,可在线阅读,更多相关《06常用类.docx(17页珍藏版)》请在冰豆网上搜索。
06常用类
1.纲要
a)String
b)StringBuffer
c)基础类型对应的8个包装类
d)日期相关类
e)数字相关类
f)Random
g)Enum
2.内容
2.1、String
2.1.1、String类是不可变类,也就是说String对象声明后,将不可修改
publicclassStringTest01{
publicstaticvoidmain(String[]args){
Strings1="a";
Strings2="b";
s1=s1+s2;//“ab”
//s1=newString(“a”);
System.out.println(s1);
}
}
从以上内存图,大家可以看到,String对象赋值后不能再修改,这就是不可变对象,如果对字符串修改,那么将会创建新的对象
注意:
只要采用双引号赋值字符串,那么在编译期将会放到方法区中的常量池里,如果是运行时对字符串相加会放到堆中(静态与动态)
2.1.2、Strings1=“abc”和Strings2=newString(“abc”)
publicclassStringTest02{
publicstaticvoidmain(String[]args){
Strings1="abc";
Strings2="abc";
Strings3=newString("abc");
System.out.println("s1==s2,"+(s1==s2));
System.out.println("s2==s3,"+(s2==s3));
System.out.println("s2equlass3,"+(s2.equals(s3)));
}
}
●如果是采用双引号引起来的字符串常量,首先会到常量池中去查找,如果存在就不再分配,如果不存在就分配,常量池中的数据是在编译期赋值的,也就是生成class文件时就把它放到常量池里了,所以s1和s2都指向常量池中的同一个字符串“abc”
●关于s3,s3采用的是new的方式,在new的时候存在双引号,所以他会到常量区中查找“abc”,而常量区中存在“abc”,所以常量区中将不再放置字符串,而new关键子会在堆中分配内存,所以在堆中会创建一个对象abc,s3会指向abc
●如果比较s2和s3的值必须采用equals,String已经对eqauls方法进行了覆盖
2.1.3、String面试题分析
Strings1=newString("hello");
Strings2=newString("hello");
以上代码创建了几个对象?
通过以上分析,大家会看到创建了5个对象,堆区中2个,常量池中1一个,栈区2个
通过以上分析,使用String时,不建议使用new关键字,因为使用new会创建两个对象
记住:
堆区中是运行期分配的,常量池中是编译器分配的
2.1.4、String常用方法简介
1.endsWith:
判断字符串是否以指定的后缀结束
2.startsWith,判断字符串是否以指定的前缀开始
3.equals,字符串相等比较,不忽略大小写
4.equalsIgnoreCase,字符串相等比较,忽略大小写
5.indexOf,取得指定字符和字符串的位置
6.lastIndexOf,返回最后一次字符串出现的位置
7.length,取得字符串的长度
8.replaceAll,替换字符串中指定的内容
9.split,根据指定的表达式拆分字符串
10.substring,截子串
11.trim,去前尾空格
12.valueOf,将其他类型转换成字符串
2.1.5、使用String时的注意事项
因为String是不可变对象,如果多个字符串进行拼接,将会形成多个对象,这样可能会造成内存溢出,会给垃圾回收带来工作量,如下面的应用最好不要用String
【代码示例】
publicclassStringTest04{
publicstaticvoidmain(String[]args){
Strings="";
for(inti=0;i<100;i++){
//以下语句会生成大量的对象
//因为String是不可变对象
//存在大量的对象相加或相减一半不建议使用String
//建议使用StringBuffer或StringBuilder
s+=i;
}
}
}
2.1.5、正则表达式初步
正则表达式,主要可以用来做字符串处理,可以描述特定的字符模式,如:
”a{2}”表示由两个字符“a”构成的字符串,等同于普通字符串“aa”,如”\d”代表任意一个数字0~9
publicbooleanmatches(Stringregex),返回此字符串是否匹配给定的正则表达式。
publicStringreplaceAll(Stringregex,Stringreplacement)使用给定的replacement字符串替换此字符串匹配给定的正则表达式的每个子字符串。
publicclassStringTest05{
publicstaticvoidmain(String[]args){
Strings1="asdd33dfsdaf33ddsd55fdd3dssf4343sdf455ddsdddh565gggh55ddhg";
//将dd替换为"中"
System.out.println(s1.replaceAll("dd","中"));
//将dd替换为"中"
System.out.println(s1.replaceAll("d{2}","中"));
//将数字替换为"中"
System.out.println(s1.replaceAll("\\d","中"));
//将非数字替换为"中"
System.out.println(s1.replaceAll("\\D","中"));
}
}
2.2、StringBuffer和StringBuilder
2.2.1、StringBuffer
StringBuffer称为字符串缓冲区,它的工作原理是:
预先申请一块内存,存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列。
StringBuffer是可变对象,这个是String最大的不同
publicclassStringBufferTest01{
publicstaticvoidmain(String[]args){
StringBuffersbStr=newStringBuffer();
for(inti=0;i<100;i++){
//sbStr.append(i);
//sbStr.append(",");
//方法链的编程风格
sbStr.append(i).append(",");
//拼串去除逗号
//sbStr.append(i);
//if(i!
=99){
//sbStr.append(",");
//}
}
//可以输出
System.out.println(sbStr);
System.out.println("");
System.out.println(sbStr.toString());
System.out.println("");
//去除逗号
System.out.println(sbStr.toString().substring(0,sbStr.toString().length()-1));
System.out.println("");
System.out.println(sbStr.substring(0,sbStr.length()-1));
}
}
2.2.2、StringBuilder
用法同StringBuffer,StringBuilder和StringBuffer的区别是StringBuffer中所有的方法都是同步的,是线程安全的,但速度慢,StringBuilder的速度快,但不是线程安全的
2.3、基本类型对应的包装类
2.3.1、包装类概述
基本类型的包装类主要提供了更多的实用操作,这样更容易处理基本类型。
所有的包装类都是final的,所以不能创建其子类,包装类都是不可变对象
基本类型
包装类
byte
Byte
short
Short
char
Character
int
Integer
long
Long
float
Foat
double
Double
boolean
Boolean
2.3.2、类层次结构
除了boolean和Character外,其它的包装类都有valueOf()和parseXXX方法,并且还具有byteVaue(),shortVaue(),intValue(),longValue(),floatValue()和doubleValue()方法,这些方法是最常用的方法
publicclassIntegerTest01{
publicstaticvoidmain(String[]args){
inti1=100;
Integeri2=newInteger(i1);
doublei3=i2.doubleValue();
Strings="123";
inti4=Integer.parseInt(s);
Integeri5=newInteger(s);
Integeri6=Integer.valueOf(s);
}
}
2.3.4、JDK5.0的新特性
在JDK5.0以前,包装类和基本类型做运算时,必须将包装类转换成基本类型才可以,而JDK5.0提供Auto-boxing/unboxing(自动装箱和拆箱)
⏹自动将基础类型转换为对象
⏹自动将对象转换为基础类型
publicclassIntegerTest01{
publicstaticvoidmain(String[]args){
//jdk1.5以前版本,必须按如下方式赋值
Integeri1=newInteger(100);
//jdk1.5及以后版本支持
//自动装箱
Integeri2=100;
//jdk1.5及以后版本支持
//自动拆箱
inti3=i2;
//jdk1.5以前版本,必须按如下方式赋值
inti4=i2.intValue();
}
}
2.4、日期类
常用日期类:
java.util.Date
java.text.SimpleDateFormat
java.util.Calendar
importjava.util.Date;
importjava.text.SimpleDateFormat;
importjava.util.Calendar;
publicclassDateTest01{
publicstaticvoidmain(String[]args)throwsException{
//取得今天的日期
Datetoday=newDate();
System.out.println(today);
//格式化日期
SimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-ddHH:
mm:
ss");
System.out.println(sdf.format(today));
Calendarc=Calendar.getInstance();
System.out.println(c.get(Calendar.DAY_OF_MONTH));
//取得2000-10-01为星期几
Dated=newSimpleDateFormat("yyyy-MM-dd").parse("2000-10-01");
c.setTime(d);
System.out.println(c.get(Calendar.DAY_OF_WEEK));
}
}
2.5、数字类
Java.text.DecimalFormat和java.math.BigDecimal
【示例代码】,DecimalFormat
importjava.text.DecimalFormat;
publicclassDecimalTest01{
publicstaticvoidmain(String[]args)throwsException{
//加入千分位,保留两位小数
DecimalFormatdf=newDecimalFormat("###,###.##");
System.out.println(df.format(1234.23452));
//加入千分位保留4位小数,不够补零
System.out.println(newDecimalFormat("###,###.0000").format(12345.12));
}
}
【示例代码】,BigDecimal可以精确计算,特别是财务数据
importjava.math.BigDecimal;
publicclassBigDecimalTest01{
publicstaticvoidmain(String[]args)throwsException{
BigDecimalv1=newBigDecimal(10);
BigDecimalv2=newBigDecimal(20);
//相加运算
BigDecimalv3=v1.add(v2);
System.out.println(v3);
}
}
2.6、Random
Random位于java.util包下,可以产生随机数
2.6.1、生成5个0~100之间的整数随机数
importjava.util.Random;
publicclassRandomTest01{
publicstaticvoidmain(String[]args)throwsException{
Randomr=newRandom();
for(inti=0;i<5;i++){
System.out.println(r.nextInt(100));
}
}
}
2.7、Enum
2.7.1、为什么使用枚举
//以下返回1或0存在问题
//在编译器就容易把程序错了,如:
1和111没有什么区别,编译器认为两者是一样的
//不会报错,错误发现的越早越好,最好在编译器把所有的错误都消除掉
publicclassEnumTest01{
publicstaticvoidmain(String[]args)throwsException{
intret=method1(10,2);
if(ret==1){
System.out.println("成功!
");
}
if(ret==0){
System.out.println("失败!
");
}
}
//正确返回1,失败返回:
0
privatestaticintmethod1(intvalue1,intvalue2){
try{
intv=value1/value2;
return1;
}catch(Exceptione){
return0;
}
}
}
2.7.1、改进示例一
//此种方式比第一种方案好一些
//有一个统一的约定,成功用1表示,失败采用0标识
//但是也存在问题,如果不准许约定也会产生问题
//如果成功我们可以返回SUCCESS,但也可以返回100,因为返回值为int,
//并没有强制约束要返回1或0
publicclassEnumTest02{
privatestaticfinalintSUCCESS=1;
privatestaticfinalintFAILURE=0;
publicstaticvoidmain(String[]args)throwsException{
intret=method1(10,2);
if(ret==SUCCESS){
System.out.println("成功!
");
}
if(ret==FAILURE){
System.out.println("失败!
");
}
}
//正确返回1,失败返回:
0
privatestaticintmethod1(intvalue1,intvalue2){
try{
intv=value1/value2;
returnSUCCESS;
}catch(Exceptione){
returnFAILURE;
}
}
}
2.7.1、采用枚举改进
//使用枚举类型,能够限定取值的范围
//使程序在编译时就会及早的返现错误
//这样程序会更加健壮
publicclassEnumTest03{
publicstaticvoidmain(String[]args)throwsException{
Resultr=method1(10,2);
if(r==Result.SUCCESS){
System.out.println("成功!
");
}
if(r==Result.FAILURE){
System.out.println("失败!
");
}
}
//正确返回SUCCESS,失败返回:
FAILURE
privatestaticResultmethod1(intvalue1,intvalue2){
try{
intv=value1/value2;
returnResult.SUCCESS;
}catch(Exceptione){
returnResult.FAILURE;
}
}
}
enumResult{
SUCCESS,FAILURE
}
2.8、补充publicstaticvoidmain(String[]args),数组如何传值
publicclassMainTest01{
publicstaticvoidmain(String[]args){
for(inti=0;i System.out.println(args[i]); } if(args.length! =0){ if(args[0].equals("A")){ System.out.println("添加用户"); }elseif(args[0].equals("U")){ System.out.println("更新用户"); } }else{ System.out.println("请输入参数A: 添加,U: 修改"); } } } javaMainTest01A
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 06 常用