String类的本质StringBuffer和StringBuilder 常见包装类 |
一、 String类
特点
String用于保存字符串
String创建对象
“hello” 默认就是 一个String的对象(实例)
1、通过构造方法
String str = new String(“hello”);
2、直接赋值
String str = “hello”;
1、★★问题思考?
两种创建对象方式的区别:
直接赋值:
先去常量池中查看 是否有字面值一样的 空间,如果没有则创建,如果有,则直接 指向。
通过构造方法:
肯定会在堆中创建空间,空间中的字符串值引用了 常量池中的字面上的值。
如果常量池中有和字面值一样的空间,则直接引用,否则 就创建
2、★★问题思考?
String str=new String("hello");创建了几个对象
创建了两个对象
3、★★问题思考?
String str="hello"+"world";创建了几个对象
创建了 三个对象
"hello"/"world"/"helloworld"
str+="xiaohua";每次拼接都要新开空间,所以效率比较低
原因:字符串保存的是常量,一旦开辟空间,里面的值不能更改!
String类的常用方法
见已发布String相关javaSe基础博客文章
二、 StringBuffer类
(1)特点
String类的增强版
实质上也是保存字符串,但 增删改的话是在原来的空间上,不需要新开辟空间,效率 比较高!!
StringBuffer
1、创建对象
通过构造器
2、常用方法
append追加
insert插入
replace修改
delete删除
reverse反转
length获取长度
indexOf获取字符或字符串第一次出现的索引
lastIndexOf 获取字符串或字符串最后一次出现的索引
3、String和StringBuffer的转换
String——StringBuffer
通过构造器
StringBuffer——String
通过toString
4、StringBuffer和StringBuilder、String对比
《1》效率不同,StringBuilder>StringBuffer>String
《2》StringBuffer和StringBuilder都是保存字符串变量
《3》增删改操作都是在自身基础上修改,不用重新开辟空间,String 保存字符串常量
每次增删改都需要重新开辟空间。
《4》StringBuffer 线程安全、同步、效率低、版本老的,
StringBuilder线程不安全、不同步、
《5》效率高、版本新的
1、★★思考问题
String和StringBuffer的区别
String 保存字符串 常量
StringBuffer 保存字符串 变量
(2)创建对象
StringBuffer s = new StringBuffer(“hello”);
(3)StringBuilder/StringBuffer/String对比
String 保存字符串常量,里面的值不能更改
StringBuffer和StringBuilder保存字符串变量,里面的值可以更改
线程安全 同步 效率 版本
StringBuilder 不安全 不同步 高 新(1.5)
StringBuffer 安全 同步 低 老(1.0)
效率
StringBuilder>StringBuffer>String
常见方法
见代码:
public class TestStringBuffer {
public static void main(String[] args) throws Exception {
//创建StringBuffer对象
StringBuffer s = new StringBuffer("hello");
//方法一:append 追加
/*
* 特点:
*
* ☆可以在本身基础上追加
* ★可以追加任意类型
* ★返回类型 :StringBuffer
*/
// s.append("张三");
// s.append("李四");
// s.append(true);
// s.append('男');
// s.append(1.5);
// s.append(100);
System.out.println(s.append("张无忌").append("周芷若").append("小昭"));
//方法二:insert 插入
System.out.println(s.insert(8, true));;
//方法三:replace 修改
/*
* 参数1: 要替换的起始索引(包含)
* 参数2:要替换的结束索引(不包含)
* 参数3: 新的元素
*/
System.out.println(s.replace(8, 12, "曹小华"));;
//方法四:delete 删除
/*
* 参数1: 要删除的起始索引(包含)
* 参数2:要删除的结束索引(不包含)
*/
System.out.println(s.delete(11, s.length()));;
//indexOf、lastIndexOf、length、substring
//-------------String类和StringBuffer的转换--------------
/*
* String——StringBuffer,通过构造器
* StringBuffer——String,通过 toString方法
*/
StringBuffer bu1=new StringBuffer("hlll");
String string = bu1.toString();
三、包装类
1、概念:
将基本类型 包装成 对应的引用类型,保存的数值一样,但可以有属性和方法
2、对应关系
byte-Byte
short-Short
int-Integer
long-Long
float-Float
double-Double
char-Character
boolean-Boolean
3、自动装箱和拆箱
自动装箱(基本类型——包装类)
Integer i = 10;
自动拆箱(包装类——基本类型)
int a= i;
int x=i+3;
4、类型转换
《1》Integer和String之间
Integer——String
调用方法toString
拼接字符串
String——Integer
Integer i=new Integer(string);
调用方法valueOf
《2》Integer和int之间
Integer——int
自动拆箱
调用方法intValue
int——Integer
自动装箱
Integer i=new Integer(int);
《3》int和String之间
int——String
拼接字符串
String——int
调用方法parseInt
《4》Character类的常见方法
isLetter 确定指定字符是否为字母。
isUpperCase 确定指定字符是否为大写字母。
isLowerCase 确定指定字符是否为小写字母。
isDigit 确定指定字符是否为数字
toUpperCase 使用取自 UnicodeData 文件的大小写映射信息将字符参数转换为大写。
toLowerCase 使用取自 UnicodeData 文件的大小写映射信息将字符(Unicode 代码点)参数转换为小写。
四、常用类方法
1、此类用于演示Date类的使用
按格式显示当前日期
public class TestDate {
public static void main(String[] args) {
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String strDate = sdf.format(d);
System.out.println(strDate);
}
}
2、此类用于演示日历(Calendar)类的使用
public class TestCalendar {
public static void main(String[] args) {
//创建Calendar对象
Calendar c=Calendar.getInstance();
System.out.println(c);
//调用方法
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
int second = c.get(Calendar.SECOND);
System.out.println(year+"年"+(month+1)+"月"+day+"日 "+hour+":"+minute+":"+second);
}
}
3、此类用于演示(System)类的使用
public class TestSystem {
public static void main(String[] args) {
//方法一:exit退出程序
System.out.println("hehehhe");
// System.exit(0);
// System.out.println("hhahahha"); 已退出未执行
//方法二:arrayCopy
/*
* 参数1:源数组
* 参数2:源数组 复制的起始索引
* 参数3:目标数组
* 参数4:目标数组的起始索引
* 参数5:复制的个数
*/
int[] src={1,2,3};
int[] dest=new int[src.length];
System.arraycopy(src, 0, dest, 1, src.length-1);
for (int i = 0; i < dest.length; i++) {
System.out.println(dest[i]);
}
//方法三:currentTimeMillens,单位ms
long start = System.currentTimeMillis();
//执行某段代码花费了一定时间
long end = System.currentTimeMillis();
//方法四:getProperties 获取系统属性
System.out.println("-----------------------------------");
Properties properties = System.getProperties();
properties.list(System.out);
}
}
4、此类用于演示(Character)类的使用
public class TestCharacter {
public static void main(String[] args) {
Character c=new Character('a');
Character c2 ='a';//自动装箱
char ch=c2;//自动拆箱
//调用方法
// 判断
System.out.println(Character.isLetter('4'));
System.out.println(Character.isLetter('x'));
System.out.println(Character.isDigit('4'));
System.out.println(Character.isDigit('*'));
System.out.println(Character.isUpperCase('M'));
System.out.println(Character.isLowerCase('M'));
//和String之间的转换
//将String 转换成 char[]
String str="abc";
char[] chs = str.toCharArray();
// for (int i = 0; i < chs.length; i++) {
// System.out.println(chs[i]);
// }
//
//将char 转换成 String
String string = c2.toString();
System.out.println(string);
}
}