String常用操作API
JDK1.8常量池是放在堆里面
![](https://i-blog.csdnimg.cn/blog_migrate/ffaa2e1db82d494825a1875e612201cc.png)
public
void test1() {
// "
abc
"双引号括起来的字符串:常量字符串,他也是一个对象
// 1.8之后常量池放到堆,在常量池里面找有没有这个"
abc
"对象,
// 如果常量池里面没有这个字符串对象,java就帮你在常量池里面new一个"
abc
"字符串对象。
// 如果常量池里面有这个字符串,就把这个字符串的地址赋给这个变量。
String
str1 =
"abc";
String
str2 =
new String(
"abc");
String
str3 =
"abc";
// ==比较的是变量指向的对象的地址值
System.
out.println(
str1 ==
str2);
// false
System.
out.println(
str1 ==
str3);
// true
System.
out.println(
str2 ==
str3);
// false
// 比较字符串的内容是不是相等使用equals()
// 表str1这个字符串和str2这个字符串的内容是不是相等
System.
out.println(
str1.equals(
str2));
// true
System.
out.println(
str1.equals(
str3));
// true
System.
out.println(
str2.equals(
str3));
// true
}
![](https://i-blog.csdnimg.cn/blog_migrate/dbb8bcf638f0b03d5b3abc51880503c0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f4fac3b0efde8ccf15cd3462d774c577.png)
![](https://i-blog.csdnimg.cn/blog_migrate/784da78521f5ba0fd5eebaaf015f4357.png)
@Test
public void test5() {
String str = "java AndroidA";
String newStr = str.replace('A','B');
System.out.println(str);//java AndroidA 进行操作了 但保留了原来的
System.out.println(newStr);//java BndroidB
}
@Test
public void test6() {
String str = "java AndroidA";
String[] array = str.split("a");//按照a切割
//foreach 快捷键 array.iter
for (String s : array) {
System.out.println(s);//j v AndroidA
}
}
@Test
public void test7() {
String str = "java AndroidA";
System.out.println(str.substring(5));//Android 从下标为5开始 截到最后A
System.out.println(str.substring(5, 10));//Andro [5,10) 下标为10的取不到
}
@Test
public void test8() {
String str = " zhangsan ";
System.out.println(str);
System.out.println(str.trim());//zhangsan 忽略前导空白和尾部空白
}
String、StringBuffer、StringBuilder
int num = 10;
String str = "hello";
![](https://i-blog.csdnimg.cn/blog_migrate/9a54221e4c74e0ef5f6d172eee8f22b2.png)
num是基本数据类型,值就直接保存在变量中。而str是引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容。
![](https://i-blog.csdnimg.cn/blog_migrate/8bd74b46b837192325b18d9be9b68086.png)
num = 20;
str = "java";
对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。
对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。
如上图所示,"hello" 字符串对象没有被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)
public void test9() {
// Required type:StringBuffer
// Provided:String
// StringBuffer stringBuffer = "abc";
String str1 = "abc";
String str2 = "def";
String str3 = "ghi";
String str4 = "jkl";
str1 = str1 + str2 + str3 + str4;
//new 一个新的字符串赋给str1 每两个相加就new一个新的字符串
System.out.println(str1);
StringBuffer stringBuffer = new StringBuffer("abc");
//stringBuffer.append(str2);
//stringBuffer.append(str3);
stringBuffer.append(str2).append(str3).append(str4);//链式编程
//调用完append(str2)方法 就返回一个stringBuffer.append(str2)对象
System
.
out
.println(
stringBuffer
);
String、
StringBuffer、StringBuilder异同点:
相同点:都是final类,都不能被继承。
不同点:
1、String长度是不可改变的,StringBuffer、StringBuilder长度是可变的。
2、StringBuffer是线程安全(synchronize:同步)
(需要加锁,效率低)、StringBuilder是线程不安全(没有加锁,效率高)。
如果对这段代码加锁,就可以实现每次只有一个用户能进入这段代码,当执行完了之后,释放这个锁,另一个用户才能进来。
if (money>1000) {
money = money - 1000;
}
常量字符串的拼接,编译器会做优化,使用String就可以:
String str = "Java" + "PHP" + "Python" + "C";
包装数据类型:
Java是纯面向对象语言,int、double都是基本数据类型。
int Integer
char Character
double Double
long Long
short Short
boolean Boolean
byte Byte
String 不是包装类
, 是
引用类型,
所谓包装类是针对java中的原生数据类型(基本数据类型)而存在的。
String是一个固定长度的字符串,对String进行操作,是创建新的对象(String的操作都是改变赋值地址而不是改变值操作)。
而和它相似的还有一个字符串StringBuffer,对StringBuffer进行操作,这是在原来的对象之上进行改变(StringBuffer的操作都是改变值操作)。
String是一种不高效的字符串使用方式,在要求执行效率的系统当中会更多的使用StringBuffer来代替,这样可以降低系统的繁复性。
除了基本数据类型之外的都是引用数据类型(
所谓的引用类型是指:数据的引用在栈中,而他的对象在堆中。),用一个类来描述。
所有引用数据类型的默认值是null。
//实体类中的属性中基本数据类型都有默认值,这个默认值很有可能是他的
有效数据之一 可以用包装类型
虽然基本数据类型和包装数据类型互相转换有装箱和拆箱的过程,但是我们平时使用的时候
就
把包装数据类型当成基本数据类型来使用就可以
。
public void test10() {
Integer integer1 = 12;//实际上这样是不对的 但是他自动做了装箱拆箱处理
//装箱
Integer integer2 = new Integer(12);
//拆箱
//int i = integer1.intValue();//你封装的是哪个整数 把他拿出来给int
}
包装数据类型最主要使用:
包装数据类型和字符串之间的转换
1、把基本数据类型转换成字符串
(1) 基本数据类型+"" : String str = 12 + ""; // "12"
(2) 基本数据类型的包装类.toString()
String str1 = Integer.toString(3);
String str2 = Double.toString(3.14);
2、把字符串转换成基本数据类型(从网页的输入框中得到的都是字符串)
(1) Integer.parseInt(String str); // "23" "3.14"
Double.parseDouble(String str);
Boolean.parseBoolean(String str);
XXXX.parseXXXX(String str);
(2) new对象: Integer integer = new Integer(String str);
Integer interger = new Integer("4");
int i = integer.intValue();
3.将数组转换成字符串
(1)
new
String(array
)
(2)
String.valueOf(array)