常用类详解
String类
1.字符串一旦创建不可再改变。”abc”字符串对象一旦创建,不可再改变成”abcd”
2.提升字符串的访问效率:在程序中使用了”缓存”技术。
所以在java中所有使用”“括起来的字符串都会在”字符串常量池”中创建一份,字符串常量池在方法区中被存储。
3.在程序执行过程中,如果程序用到某个字符串,那么程序会先去字符串常量池中搜索该字符串,如果没有找到则在该字符串常量池中新建一个该字符串,如果找到就直接拿过来用(字符串缓冲池是一个缓冲区,为了提高字符的访问效率)
String s1 = “abc”;
新建一个字符串对象”abc”,将该对象的内存地址保存在变量s1中,也就是引用中,s1指向”abc”对象
**注意:**1中不可再改变指的是字符串对象本身不能再改变,s1引用能指向其它字符串对象,s1=”def”;s1引用重新指向”def”对象
分析以下程序创建字符串对象的区别
1.String s1 = “abc”;
只会在字符串常量池中创建一个”abc”字符串对象一旦创建,不可再改变成
会在字符串常量池中创建一个”bcd”字符串对象,并且会在堆中再创建一个字符串对象”bcd”
第二种方式比较浪费内存,通常用第一种方式
注意:堆区中是运行期分配的,常量池中是编译期分配的
StringBuffer和Stringbuilder
1.StringBuffer和Stringbuilder是什么?
是一个字符串缓冲区
2.工作原理
预先在内存中申请一块空间,以容纳字符序列,
如果预留的空间不够,则自动扩容,以容纳更多字符序列
3.StringBuffer,Stringbuilder和String最大的的区别?
String是不可变的字符序列,存储在字符串常量池中
StringBuffer和Stringbuilder底层是一个数组,但是该char数组是可变的,并且可以自动扩容
4.StringBuffer和Stringbuilder的默认初始化容量是16
5.如何优化StringBuffer和StringBuilder?
最好在创建StringBuffer之前,预测StringBuffer的存储字符数量,然后在创建StringBuffer的时候
采用指定初始化容量的方式创建StringBuffer
为了减少底层数组的拷贝,提高效率
6.StringBuffer和Stringbuilder的区别?
StringBuffer是线程安全的,在多线程环境下使用不会出现问题,而StringBuilder是线程非安全的,在多线程环境下使用可能出现问题
java中八种基本数据类应对性的包装类型
基本数据类型 包装类型
byte java.lang.Byte
short java.lang.Short
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double
boolean java.lang.Boolean
char java.lang.Character
java中提供的八种基本数据类型不够用吗,为什么java中还要提供相应的包装类呢?
够用,但为了方便,所以引入了八种封装类,方便指的是:包装类可以当参数传递,而基本数据类型不能
例如:如果规定一个方法可以接受java中任何一种数据类型,则基本数据类型不能作为参数传递,也就不能实现但封装类就可以实现
Integer i1 = new (“abc”);
以上程序编译可以通过,但是运行的时候会报异常,数字格式化异常(NumberFormatException)
虽然可以将字符串转换成Integer类型,但是该字符串也必须是”数字字符串”
Integer、int和String三种类型相互转换
int->Integer
Integer i1=Integer.valueof(10);
Integer->int
int i2=i1.intValue();
String->Integer
Integer i3=Integer.valueof(“10”);
Integer->String
String s1=i3.toString();
String->int
int i4=Integer.parseInt(“123”);
int->String
String s2=10+”“;
自动装箱与自动拆箱
1.自动装箱和自动拆箱是程序编译阶段的一个概念,和程序运行无关
2.自动装箱和自动拆箱主要目的是方便程序员编码
注意:如果数据是在(-128~127)之间,java中引入了一个”整形常量值”,在方法区中
该整形常量池只存储-128~127之间的数据
Integer i1=127;//这个程序不会在堆中创建对象,会直接从整形常量池中拿
Integer i2=127;
System.out.println(i1==i2);//true
Integer i3=128;//相当于 Integer i3=new Integer(128);
Integer i4=128;//相当于 Integer i4=new Integer(128);
System.out.println(i3==i4);//false
Integer i5=new Integer(12);//虽然12介于-128~127之间,但由于是new出来的,所以在堆中创建对象
Integer i6=new Integer(12);//虽然12介于-128~127之间,但由于是new出来的,所以在堆中创建对象
System.out.println(i5==i6);//false
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,将其他类型转换成字符串
日期类的常用方法
1.currentTimeMillis,获取自1970年1月1日 00时00分00秒00毫秒到当前的毫秒数,
示例long now=System.currentTimeMillis();
2.Date,获取系统当前时间,示例:Date nowTime = new Date();
直接调用构造方法输出的时间不容易理解,所以引入了”格式化”日期:java.util.Date–>String
3.格式化日期格式
y 年
M 月
d 日
H 小时
m 分
s 秒
S 毫秒
格式化日期对象的步骤:
一、创建日期格式化对象
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss: SSS”);
二、格式化:用日期格式化对象里的format方法调用日期对象
String strTime = sdf.format(nowTime);
4.获取特定的日期
一、将需要获取的日期用字符串表示出来
String strTime = “2010年08月08日 08:08:08 888”;
二、创建日期格式化对象
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy年MM月dd日 HH:mm:ss: SSS”);
三、将字符串转换成日期类型
Date t=sdf.parse(strTime);
四、获取指定时间前后的时间
Date(long);long是自1970年1月1日 00时00分00秒00毫秒的毫秒数
获取当前日期:new Date();
获取当前日期的前10分钟:new Date(System.currentTimeMillis()-1000*60*10);
获取当前日期的后10分钟:new Date(System.currentTimeMillis()+1000*60*10);
日历类
1.获取系统当前的日历
Calendar c=Calendar.getInstance();
2.查看当前日历是星期几
int i = c.get(Calendar.DAY_OF_WEEK);
3.获取指定日期的日历
String strTime = “2008,08,08”;
Date d=new SimpleDateFormat(“yyyy,MM,dd”).parse(strTime);
c.setTime(d);//将日期转换成日历
c.get(Calendar.DAY_OF_WEEK);//获取指定日期是星期几
数字格式化
1.格式化元素
# 任意数字
, 千分位
. 小数点
0 不够补0
2.对一个数字加入千分位,保留四位小数,并且不够补0
DecimalFormat df=new DecimalFormat(###,###.0000);
df.format(1234567.123);
BigDecimal
该类型的数据精确度极高,适合做财务计算
BigDecimal v1 = new BigDecimal(10);
BigDecimal v2 = new BigDecimal(20);
BigDecimal v3 = v1+v2;//两个引用类型不能做加法运算
BigDecimal v4 = v1.add(v2);
注意:在BigDevimal中加减乘除等各种运算要通过调用不同的方法