一、String字符串
String
是一个类,属于引用类型。
Java
程序中一切使用
""
引起来的内容,都是这个类的实例,称为字符串对象。
字符串定义后是一个常量
,值不可更改。字符串
实际是一个字符数组
。
二、
String
类使用时注意
由此可见,如果要频繁更改
String
类型变量的值,不要使用
String
对象操作字符串,效率很低又浪费内存空间。
三、
通过构造方法创建字符串
常用构造方法
String() :创建一个空白字符串对象,实际创建一个空字符数组。
String(String str):创建一个指定的字符串对象,实际是创建一个形参字符串的副本。
String(char[] list):创建一个指定字符数组的字符串对象。
String(byte[] list):按默认编码格式创建一个指定字节数组的字符串对象。
String(byte[] list,String
charsetName):按指定的编码格式创建一个指定字节数组的字符串对
象。
四、不同方式创建字符串
1、使用
""
赋值的形式创建
2、使用构造方法
String(String str)
创建
3、使用
+
拼接
""
和
new
出来的字符串对象
五、字符串总结
在使用字符串时,如果要比较其值是否相同,不要使用
==
判断,因为
==
判断的是内存地址。
所以
在比较字符串是否相同时,要使用
String
重写的
equals
方法进行判断。
String
中
equals
方法判断的原理,大致为:将两个字符串保存到字符数组中,再对每个字符逐一比较, 如果全部一致则返回。
在使用
equals
方法时,通常要将已知的非空字符串作为调用者。
六、字符串常用方法
七、
可变字符串
String
字符串对象是一个常量,在定义后其值不可改变。
如果使用
String
类的对象,对其频繁更新时,就会不停地创建新的对象,重新引用。
所以如果要执行
1000
次重新赋值的过程,就要创建
1000
个字符串对象,花费很多时间和内存空间,所以效率很低。这时就需要使用可变字符串类。
1、StringBuilder
类
用于表示可变字符串的一个类,是
非线程安全
的,建议在单线程环境下使用,效率略高于
StringBuffer
。
2、StringBuffer
类
用于表示可变字符串的一个类,是
线程安全
的,建议在多线程环境下使用,效率略低于
StringBuilder
。
StringBuilder
和
StringBuffer
中的方法作用都一致,只不过
StringBuffer
中的方法使用了
synchronized
关键字修饰,表示一个同步方法,在多线程环境下不会出现问题。
3、比较
String
、
StringBuilder
、
StringBuffer
这三个类的区
别
相同点
这三个类都可以用于表示或操作一个字符串
这三个类中有公共的方法,如
indexOf()
、
charAt()
等、
这三个类都是被
final
修饰的类,不能被继承
不同点
String
定义的字符串是一个常量,不可变;
StringBuilder
和
StringBuffer
定义的字符串是一个变
量,可以改变。
String
类中的方法调用后,会创建字符串副本,不会影响原字符串;可变字符串对象调用的方法,
直接操作原字符串,会影响。
StringBuilder
是非线程安全的,
StringBuffer
是线程安全的,其中的方法使用
synchronized
修饰为
同步方法。在多线程情景下,需要使用
StringBuffer
。
StringBuilder
效率略高于
StringBuffer
。
总结
在程序中,如果要频繁操作某个字符串,一定使用可变字符串类
StringBuilder
或
StringBuffer
创建对
象。
八、
包装类
Java
是纯面向对象语言,宗旨是将一切事物视为对象处理。
但原始类型不属于对象,不满足面向对象的思想,但原始类型使用时无需创建对象,保存在栈中,效率更改。
为了让原始类型也有对象的类类型,达到
"
万物皆对象
"
的思想,所以就有了包装类的概念。
包装类就是原始类型对应的类类型。
包装类通常用于将字符串转换为对应的原始类型。
在
web
应用中,从浏览器中获取到后台的数据,全是
String
类型,一定要使用转换的方法。
包装类
原始类型
将字符串转换为原始类型
Byte byte Byte.parseByte(String str)
Short short Short.parseShort(String str)
Integer int Integer.parseInt(String str)
Long long Long.parseLong(String str)
Float float Float.parseFloat(String str)
Double double Double.parseDouble(String str)
Boolean boolean Boolean.parseBoolean(String str)
Character char 无
特点
八个原始类型中,除了
int
和
char
之外,其余类型的包装类,都是将首字母改为大写。
int
为
Integer
,
char
为
Character
。
除了
Character
类之外,其余类都有至少两个构造方法
:
参数为原始类型或字符串的构造方法。
Character
的构造方法只有一个,参数为
char
变量。
除了
Character
类之外,其余类都有静态方法
parse
原始类型
(String str)
,用于将字符串转换为相
应的原始类型
数值型的包装类的
parseXXX()
方法,如果不是一个真正的对应类型的数,转换时会抛出
NumberFormatException
异常。如
"123abc"
、
"123.456"
都不能使用
Integer.parseInt()
转换
Boolean
类型中的
parseBoolean()
方法,参数如果是
"true"
这个单词,无论大小写,都能转换
为真正的
boolean
值的
true
,只要不是
"true"
这个单词,转换结果都为
false
除了
Boolean
类之外,其余类都有
MAX_VALUE
和
MIN_VALUE
这两个静态属性,用于获取对应原
始类型支持的最大最小范围
所有包装类中都有一个
compareTo(
参数
1,
参数
2)
方法
,
用于比较两个参数
如果是数值型,参数
1>
参数
2
返回
1
,参数
1<
参数
2
返回
-1
,相同返回
0
如果是
Boolean
型,两个参数相同返回
0
,不同时,如果参数
1
为
true
返回
1
,否则返回
-1
如果是
Character
型,返回参数
1-
参数
2
的值。
所有包装类中都有
toString()
方法,用于将包装类对象转换为
String
字符串对象
十、装箱和拆箱
所有包装类都有一个静态方法
valueOf(
原始类型
)
,将某个原始类型的数据转换为相应的包装类对
象,这个过程称为
装箱
。
//
手动装箱
int
i
=
123
;
//
定义一个原始类型的数据
Integer
aInteger
=
Integer
.
valueOf
(
i
);