public final class String implements java.io.Serializable, java.lang.Comparable<java.lang.String>, java.lang.CharSequence {
}
package www.bh.c.string;
public class test01 {
/*1.String:字符串,用一对""引起来表示
2.String声明为final,不可以被其它类继承
3.String实现了Serializable接口,表示字符串是支持序列化的
4.String实现了Comparable接口,表示String可以比较大小
5.String内部定义了final char[] value用于储存字符串数据
6.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中
7.字符串常量池中是不会在不同位置储存相同内容的字符串的
*/
public static void main(String[] args) {
String a="abc"; //字面量的定义方式
String b="abc";
System.out.println(a == b);//比较a和b的地址值 true
System.out.println(a);//abc
System.out.println(b);//abc
}
}
package www.bh.c.string;
public class test01 {
/* String代表不可变的字符序列,简称不可变性
具体体现:1.当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value值赋值*/
public static void main(String[] args) {
String a="abc"; //字面量的定义方式
String b="abc";
a="hello";//重写赋值
System.out.println(a == b);//比较a和b的地址值 flase
System.out.println(a);hello
System.out.println(b);//不可变性,b仍为abc
}
}
package www.bh.c.string;
public class test02 {
public static void main(String[] args) {
//2.当对现有的字符串进行连接操作时,需要重新指定内存区域赋值,不能使用原有的value值赋值
String s1="abc";
String s2="abc";
s1+="def";
System.out.println(s1 == s2);//比较s1和s2的地址值 false
System.out.println(s1);//abcdef
System.out.println(s2);//不可变性,abc
}
}
package www.bh.c.string;
public class test02 {
public static void main(String[] args) {
//3.当调用String的replace()方法修改指定的字符或字符串时,也需要重新指定内存区域赋值
String s1="abc";
String s2="abc";
String s3 = s1.replace("a", "m");
System.out.println(s3 == s2);//比较s3和s2的地址值
System.out.println(s1);//abc
System.out.println(s2);//不可变性,abc
System.out.println(s3);//mbc
}
}
package www.bh.c.string;
public class Test03 {
public static void main(String[] args) {
//通过字面量定义的s1和s2的数据JavaEE存在在方法区的字符串常量池中
String s1="JavaSE";
String s2="JavaSE";
//通过new+构造器定义的s1和s2:s1和s2存的是地址值,是数据在堆空间中开辟空间以后对应的地址值
String s3=new String("JavaEE");
String s4=new String("JavaEE");
System.out.println(s1 == s2);//true(常量池)
System.out.println(s1 == s3);//false(常量池和地址值)
System.out.println(s1 == s4);//false(常量池和地址值)
System.out.println(s3 == s4);//false(地址值)
}
}
package www.bh.c.string;
public class Test04 {
String name;
int age;
public Test04(String name, int age) {
this.name = name;
this.age = age;
}
public Test04() {
}
public static void main(String[] args) {
//j1和j2存的是地址值,是数据在堆空间中开辟空间以后对应的地址值
//对应的值在常量池中
Test04 j1 = new Test04("Java", 15);
Test04 j2 = new Test04("Java", 15);
System.out.println(j1.name.equals(j2.name));//equals比较的是实际的值是否相等 true
System.out.println(j1.name== j2.name);//常量池中 true
System.out.println(j1.age == j2.age);//常量池中 true
System.out.println(j1 == j2);//地址值 flase
}
}
//思考:String s=new String("abc")创建对象,在内存中创建了几个对象?
//两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:"abc"
ackage www.bh.c.string;
public class Test05 {
public static void main(String[] args) {
String s1="abc";
String s2="def";
String s3="abcdef";
String s4="abc"+"def";//拼接结果在常量池中
String s5=s1+"def";//拼接的其中一个是变量,结果就存在在堆中
String s6="abc"+s2;//堆中
String s7=s1+s2;//堆中
System.out.println(s3 == s4);//true
System.out.println(s3 == s5);//false
System.out.println(s3 == s6);//false
System.out.println(s3 == s7);//false
System.out.println(s5 == s6);//false
System.out.println(s5 == s7);//false
String s8=s5.intern();//调用intern()方法,返回值s8存在在常量池中
System.out.println(s3 == s8);//true
System.out.println("=============");
final String s9="def";//final定义,s9为常量
String s10="abc"+s9;//实质上常量与常量的拼接
System.out.println(s3 == s10);//true
}
}
package www.bh.c.string;
public class Test06 {
String s1=new String("test");
char[] c1={'t','e','s','t'};
public void change(String s1,char[] c1){
s1="best";
c1[0]='b';
}
public static void main(String[] args) {
Test06 t1 = new Test06();
System.out.println(t1.s1);
System.out.println(t1.c1);
System.out.println("============");
t1.change(t1.s1,t1.c1);
System.out.println(t1.s1);
System.out.println(t1.c1);
}
}
/*
test
test
============
test //字符串的不可变性
best
*/
package www.bh.c.string;
public class Test08 {
public static void main(String[] args) {
String s1="helloworld";
System.out.println(s1.length());//10
}
}
package www.bh.c.string;
public class Test08 {
public static void main(String[] args) {
String s1="helloworld";
System.out.println(s1.charAt(5));//w
}
}
package www.bh.c.string;
public class Test08 {
public static void main(String[] args) {
String s1="helloworld";
System.out.println(s1.isEmpty());//false
}
}
String toLowerCase():使用默认语言环境,将String中的所有字符转为小写
String toUpperCase():使用默认语言环境,将String中的所有字符转为大写
package www.bh.c.string;
public class Test08 {
public static void main(String[] args) {
String s1="helloworld";
System.out.println(s1.toLowerCase());//helloworld
System.out.println(s1.toUpperCase());//HELLOWORLD
}
}
package www.bh.c.string;
public class Test08 {
public static void main(String[] args) {
String s1=" he ll ow or ld ";
System.out.println(s1.trim());//"he ll ow or ld"
}
}
package www.bh.c.string;
public class Test08 {
public static void main(String[] args) {
String s1="helloworld";
String s2="HelloWorld";
System.out.println(s1.equals(s2));//true
System.out.println(s1.equalsIgnoreCase(s2));//false
System.out.println(s1.concat("你好"));//helloworld你好
System.out.println(s1.compareTo(s2));//32,涉及到字符串排序,正数为后面的大,负数为后面的小,
}
}
package www.bh.c.string;
public class Test08 {
public static void main(String[] args) {
String s1="helloworld";
System.out.println(s1.substring(5));//world
System.out.println(s1.substring(0, 5));//hello
}
}
boolean endsWith(Stirng suffix):测试此字符串是否以指定的后缀结束
boolean startsWith(Stirng prefix):测试此字符串是否以指定的前缀开始
boolean startsWith(Stirng prefix,Stirng toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
package www.bh.c.string;
public class Test08 {
public static void main(String[] args) {
String s1="helloworld";
System.out.println(s1.endsWith("d"));//true
System.out.println(s1.endsWith("ld"));//true
System.out.println(s1.endsWith("world"));//true
System.out.println(s1.startsWith("he"));//true
System.out.println(s1.startsWith("l",2));//true
System.out.println(s1.startsWith("l",3));//true
}
}
package www.bh.c.string;
public class Test08 {
public static void main(String[] args) {
String s1="helloworld";
String s2="low";
System.out.println(s1.contains(s2));//true
System.out.println(s1.indexOf("ll"));//2
System.out.println(s1.indexOf("o",5));//6
System.out.println(s1.lastIndexOf("or"));//6
System.out.println(s1.lastIndexOf("or",9));//6
}
}
package www.bh.c.string;
public class Test09 {
public static void main(String[] args) {
String s1="快乐学习学习快乐";
String s2=s1.replace('乐','快');
String s3=s1.replace("快乐","十分快乐");
System.out.println(s2);//快快学习学习快快
System.out.println(s3);//十分快乐学习学习十分快乐
}
}
package www.bh.c.string;
public class Test09 {
public static void main(String[] args) {
String s1="12ab34cd45ef";
String s2=s1.replaceAll("\\d+",".");
System.out.println(s2);//.ab.cd.ef
}
}
package www.bh.c.string;
public class Test09 {
public static void main(String[] args) {
String s1="123456";
//判断s1字符串是否全部由有效的数字组成
boolean s2=s1.matches("\\d+");
System.out.println(s2);
String tel="0992-8888888";
//判断tel是否是一个有效的固定电话
boolean s3=tel.matches("0992-\\d{7,8}");
System.out.println(s3);
}
}
public class Test09 {
public static void main(String[] args) {
String s1="学习,Java,是,最快乐,的事";
String[] s2=s1.split(",");
for (int i=0;i<s2.length;i++){
System.out.println(s2[i]);
}
}
}
/*
学习
Java
是
最快乐
的事
*/
package www.bh.c.string;
public class Test09 {
public static void main(String[] args) {
String s1="学习,Java,是,最快乐,的事";
String[] s2=s1.split(",",3);
for (int i=0;i<s2.length;i++){
System.out.println(s2[i]);
}
}
}
/*
学习
Java
是,最快乐,的事
*/
字符串与基本数据类型转换
字符串—>基本数据类型
Integer包装类的public static int parseInt(String s):可以将由“数字”字符组成的字符串转换为整型
类似的,使用java.lang包中的Byte、Short、Long、Float、Double类相应的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型
基本数据类型—>字符串
调用String类的public String valueOf(int n)可将int型转换为字符串
相应的valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double d)、valueOf(boolean b)可由参数的相应类型到字符串的转换
package www.bh.c.stringswitch;
public class Test01 {
public static void main(String[] args) {
String str="1234";
int num =Integer.parseInt(str);//转换为整型
System.out.println(num);//1234
String str1=String.valueOf(num);//由int型转换为字符串
System.out.println(str1);//"1234"
System.out.println(str == str1);//false
}
}
package www.bh.c.stringswitch;
public class Test02 {
public static void main(String[] args) {
String s="abcd";
//String--->char[]:调用String类的toCharArray()方法
char[] c=s.toCharArray();
for (int i = 0; i < c.length; i++) {
System.out.println(c[i]);//{'a','b','c','d'}
}
//char[]--->String:调用String的构造器
String s1 = new String(c);
System.out.println(s1);//abcd
}
}
package www.bh.c.stringswitch;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class Test03 {
public static void main(String[] args) throws UnsupportedEncodingException {
String s="abc123学习";
// String--->byte[]:调用String类的getBytes()方法
//转换为二进制数据,也就是编码的过程
byte[] b=s.getBytes();
System.out.println(Arrays.toString(b));
//输出为:[97, 98, 99, 49, 50, 51, -27, -83, -90, -28, -71, -96],UTF-8(默认的字符集)字符集中一个汉字由三个数字表示
System.out.println("=============");
//使用gbk字符集进行编码
byte[] b1=s.getBytes("gbk");
//输出为:[97, 98, 99, 49, 50, 51, -47, -89, -49, -80],gbk字符集中一个汉字由两个数字表示
System.out.println(Arrays.toString(b1));
System.out.println("=============");
//byte[]--->String:调用String的构造器,使用默认的字符集,进行解码
String s1=new String(b);
System.out.println(s1);//abc123学习
System.out.println("=============");
//出现乱码,使用的编码集和解码集不一致:编码为gbk,解码为UTF-8
String s2=new String(b1);
System.out.println(s2);//abc123ѧϰ
System.out.println("=============");
//没有出现乱码,使用的编码集和解码集一致,都为:gbk
String gbk = new String(b1, "gbk");
System.out.println(gbk);
}
}
java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删,此时不会产生新的对象
很多方法和String中的方法相同
作为参数传递时,方法内部可以改变值
String、StringBuffer、StringBuilder三者的区别
package www.bh.c.stringbuffer;
public class stringb {
public static void main(String[] args) {
StringBuffer sb1 = new StringBuffer("abc");
sb1.setCharAt(0,'m');//可变的字符序列,不需要返回值,直接替换了原来的值
System.out.println(sb1);//mbc
}
}
package www.bh.c.stringbuffer;
public class stringb {
public static void main(String[] args) {
String s = new String();//char[] value=new char[0]
System.out.println(s.length());//0
String s1 = new String("abc");//char[] value=new char[3]{'a','b','c'}
StringBuffer sb = new StringBuffer();//char[] value=new char[16] //底层创建了一个长度为16的数组
System.out.println(sb.length());//0,value为16,count为0
sb.append('d');//value[0]='d'
sb.append("def");
StringBuffer sb1 = new StringBuffer("abc");//char[]value=new char[ab1.length()+16]
System.out.println(sb1.length());//3
}
}
注:
package www.bh.c.stringbuffer;
public class Test01 {
public static void main(String[] args) {
StringBuffer ab = new StringBuffer("abc");
ab.append(1);
ab.append("def");
System.out.println(ab);//abc1def
}
}
package www.bh.c.stringbuffer;
public class Test01 {
public static void main(String[] args) {
StringBuffer ab = new StringBuffer("abcdef");
ab.delete(0,3);
System.out.println(ab);//def
}
}
package www.bh.c.stringbuffer;
public class Test01 {
public static void main(String[] args) {
StringBuffer ab = new StringBuffer("你好中国");
ab.replace(0,2,"hello");
System.out.println(ab);//hello中国
}
}
package www.bh.c.stringbuffer;
public class Test01 {
public static void main(String[] args) {
StringBuffer ab = new StringBuffer("你好中国");
ab.insert(2,"呀");
System.out.println(ab);//你好呀中国
}
}
package www.bh.c.stringbuffer;
public class Test01 {
public static void main(String[] args) {
StringBuffer ab = new StringBuffer("你好");
ab.reverse();
System.out.println(ab);//好你
}
}
package www.bh.c.stringbuffer;
public class Test01 {
public static void main(String[] args) {
StringBuffer ab = new StringBuffer("你好中国");
int a = ab.indexOf("好");
System.out.println(ab);//你好中国
System.out.println(a);//1
}
}
package www.bh.c.stringbuffer;
public class Test01 {
public static void main(String[] args) {
StringBuffer ab = new StringBuffer("abcdefg");
String s = ab.substring(2, 5);
System.out.println(ab);//abcdefg
System.out.println(s);//cde
}
}
package www.bh.c.stringbuffer;
public class Test01 {
public static void main(String[] args) {
StringBuffer ab = new StringBuffer("abcdefg");
System.out.println(ab.length());//7
}
}
package www.bh.c.stringbuffer;
public class Test01 {
public static void main(String[] args) {
StringBuffer ab = new StringBuffer("abcdefg");
char c = ab.charAt(2);
System.out.println(ab);//abcdefg
System.out.println(5);//f
}
}
package www.bh.c.stringbuffer;
public class Test01 {
public static void main(String[] args) {
StringBuffer ab = new StringBuffer("abcdefg");
ab.setCharAt(2,'d');
System.out.println(ab);//abddefg
}
}
注:1.StringBuffer、StringBuilder中的常用方法
2.String、StringBuffer、StringBuilder三者的效率对比
StringBuild>StringBuffer>String
3.String与StringBuffer、StringBuilder之间的转换
4.JVM中字符串常量池存放位置说明: