day01
String 类
是一个final类型的 不能被继承,字符串的对象不会改变(里面char[]字符数组的值不能被改变),字符串的引用变量可以改变
String 对象的创建(有很多种,归纳为4种)
1)初始化的同时为该对象赋予值 String str =”Hello”;
2) 使用new 关键字 String str = new String(“hello”);
3) 通过任何可以返回字符串的方法,用一个String 变量接受这些返回值的同时就创建了该对象
4)使用一个字符串常量就会自动创建String 对象 如:”njcjk”.length(); “fdf”+”fdsfds”;
String 常量池
为了提高性能静态字符串(字面量(直接写出来的)常量 常量连接的结果)在常量池中创建 并尽量使用同一个对象重用静态字符串 对于重复出现的字符串直接量会在常量池中查找并且返回
(变量连接的结果 ) a 创建动态新字符串对象是新对象 b 利用NEW运算创建的字符串是新对象
但是参数“ ABC” 是静态字符串对象来自常量池
两个字面量(常量)的连接时在编译器中优化计算为一个字符串对象 在运行期按照 “ABC”进行常量优化
如String s3 =“ABC”;
String s4 = “ABC”
String s5 = “A”+”BC”;
s3==s4 true 值相等 引用地址也相等
s3和s4引用同一个对象 优点是重用了
s3 == s5 引用地址相同 这都用到了常量池
String s6 = newString(“ABC”);
S3==S6; false
String s7 =”A”;
String s8 =s7+ “BC” ;
s8==s3; false
== 基本变量比较的是值 引用变量比较的是 引用的地址
= 基本变量是赋予值 引用变量是“ 指向”
equals()用来比较引用类型是否相等 object默认给的是和== 一样 一般子类会重写此方法根据业务逻辑给出具体的要求
byte[] bytes = s1.getBytes("UTF-8");
System.out.println(bytes.length);
将s1中的内容进行编码,中文windows采用GBK(一个字符有三个字节), Linux和Mac采用UTF-8(一个字符编译三个字节). getBytes方法不是检查内存中字符串占用的字节数量,因为不固定但是可以传参进行固定 主要用于字符串在网络传输过程中乱码问题的解决
加上重载的方法一共67个方法 构造方法就11个
常用的方法:
一个空格也代表占用一个字符
int a indexOf(String[char] a); 取出字符第一次出现的位置找不到字符就返回-1
String s subString(7,7+4) ; 可以从7 开始节取4个字符 遵循左闭右开
String s subString(7) ; 从7开始 到最后全部 2 端都是关闭的
char c chatAt(int a) ; 取出位置的字符
以上的数字都是下标从零开始的
String s trim(String s) ; 去掉前后空白部分
booleanstartsWith(String s); //是否以那个字符开头
booleanendsWith(String s) //是否以那个字符结尾 区分大小写的 一个字符或者多个字符 空格也可以检测 任何字符和空字符串相比都是true 注意与空格的区别
int n length() 字符串的长度
String s toUpperCase(String a) 变成大写
String s toLowerCase(String a) 变成小写
booleanequalsIgnoreCase(String another) 比较字符串与anther 是否一样忽视大小写
将此String与另一个String比较,不考虑大小写。如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。
int lastIndexOf()返回指定字符在此字符串中最后一次出现处的索引。
String replace(charold,char new ); 在字符串中用新的替换旧的
String [] spilt (String s) 按照指定的分割符分割成字符串数组 并返回
public String[]split(String regex) 将分割的字符去掉 或者符和匹配的内容去掉
根据给定正则表达式的匹配拆分此字符串。
该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括
例如,字符串"boo:and:foo" 使用这些表达式可生成以下结果:
Regex | 结果 |
: | { "boo", "and", "foo" } |
o | { "b", "", ":and:f" } |
String valueOf(int s) ; 基本类型转换成字符串
char[] | toCharArray() |
boolean compareTo(); 按照顺序比较每个字符的unicode 编码
小负数
大整数
零 相等
boolean | contains(CharSequence s) |
public boolean isEmpty()
当且仅当length() 为 0 时返回true。
staticString valueOf(int a); 将一个int 类型的 返回一个字符串
返回 int 参数的字符串表示形式。
该表示形式恰好是单参数的 Integer.toString ()方法返回的结果。
StringtoString();返回字符串本身
/*
* 测试字符串的 trim() 方法
* 此字符串移除了前导和尾部空白的副本;如果没有前导和尾部空白,则返回此字符串。 否则返回新的对象
*/
Strings1="\r\n Hello \t\r\n";
Strings2="Hello";
Strings3=s1.trim();
Strings4=s2.trim();
System.out.println(s3);
System.out.println(s4==s2);//true
/*
* startsWith 方法演示
* 检查字符串是否以指定字符串为开头的。
*/
Stringstr="王宝强";
booleanb=str.startsWith("王");
System.out.println(b);//true
b=str.startsWith("");
System.out.println(b);//true
b=str.startsWith("王宝");
System.out.println(b);
2 StringBuilder
StringBuilderbuf=newStringBuilder();
//length() 检查数组中有效字符个数
System.out.println(buf.length());
//capacity() 容量:字符数组的实际长度默认为 16
System.out.println(buf.capacity
StringBuilder(int capacity) |
StringBuilder(String str) |
StringBuilder它里面的方法的索引位置都是左闭右开 通常都是用(6,6+4)
append(String s);
insert(3,ih);
delete(3.op);
replace();
reserve();
substring(int start) | |
substring(int start, int end) |
int | capacity() |
具体看API
/*
* 可变字符串StringBuilder演示
*/
StringBuilderbuf=new StringBuilder();
//length()检查数组中有效字符个数
System.out.println(buf.length());
//capacity()容量:字符数组的实际长度
System.out.println(buf.capacity());
buf.append("传奇");
System.out.println(buf.length());
System.out.println(buf.capacity());
buf.append("哪一年在家里的时候");
buf.insert(3,"据说");
System.out.println(buf.capacity());
buf.append("天天学习");
System.out.println(buf.capacity());
//检查字符串的内容
System.out.println(buf);
//替换字符
//StringBuilder的API,适合“函数式”连写
buf.replace(1,1+2, "老湿")
.delete(16, 16+2)
.append("吃鸡");
System.out.println(buf);
连续的字符串连接 s3 = s1 + s1 + s1 + s2;
JAVA 自动利用StringBuilder进行处理不需要利用 StringBuilder去优化
看API 文档
stringBuffer 和 StringBuild;
stringBuffer线称安全 性能较慢
StringBuild; 线称不安全 性能较快
*/
Strings1 = "A";
Strings2 = "B";
/*
* Java 中字符串链接功能是利用StringBuilder
* 实现的,s3= s1+s2 相当于
* s3 = new StringBuilder(s1)
* .append(s2).toString();
*/
Strings3 = s1+s2;
s3= s1+s3;//创建 StringBuilder
s3= s1+s3;//创建 StringBuilder
s3= s1+s3;//创建 StringBuilder
s3= s1+s3;//创建 StringBuilder
StringBuilderbuf=new StringBuilder(s2);
buf.insert(0,s1);
buf.insert(0,s1);
buf.insert(0,s1);
buf.insert(0,s1);
s3= buf.toString();
/*
* 性能测试
*/
testString(10000);
testStringBuilder(10000);
/*
* 连续的字符串连接
* s3 = s1 + s1 + s1 + s2;
* Java 会自动利用一个StringBuilder进行处理
* 不需要利用StringBuilder 去优化性能。
*
* 字符串字面量会在编译器期间优化为一个字符串
* 对象
* s3 = "A" + "B" +"C" + "D"
* s3 = "A" + 1 + 2 + 3;
*/
}
/**
* 测试String的连接性能
*/
publicstatic void testString(int n){
longt1 = System.nanoTime();
Strings="";
for(inti=0; i<n; i++){
s= s+"A";
}
longt2 = System.nanoTime();
System.out.println(t2-t1);
}
/**
* 测试StringBuilder的连接性能
*/
publicstatic void testStringBuilder(int n){
longt1=System.nanoTime();
StringBuilderbuf=new StringBuilder();
for(inti=0; i<n; i++){
buf.append("A");
}
longt2=System.nanoTime();
System.out.println(t2-t1);
}
day01
1 String 类
是一个final类型的 不能被继承,字符串的对象不会改变(里面char[]字符数组的值不能被改变),字符串的引用变量可以改变
String 对象的创建(有很多种,归纳为4种)
1)初始化的同时为该对象赋予值 String str =”Hello”;
2) 使用new 关键字 String str = new String(“hello”);
3) 通过任何可以返回字符串的方法,用一个String 变量接受这些返回值的同时就创建了该对象
4)使用一个字符串常量就会自动创建String 对象 如:”njcjk”.length(); “fdf”+”fdsfds”;
String 常量池
为了提高性能静态字符串(字面量(直接写出来的)常量 常量连接的结果)在常量池中创建 并尽量使用同一个对象重用静态字符串 对于重复出现的字符串直接量会在常量池中查找并且返回
(变量连接的结果 ) a 创建动态新字符串对象是新对象 b 利用NEW运算创建的字符串是新对象
但是参数“ ABC” 是静态字符串对象来自常量池
两个字面量(常量)的连接时在编译器中优化计算为一个字符串对象 在运行期按照 “ABC”进行常量优化
如String s3 =“ABC”;
String s4 = “ABC”
String s5 = “A”+”BC”;
s3==s4 true 值相等 引用地址也相等
s3和s4引用同一个对象 优点是重用了
s3 == s5 引用地址相同 这都用到了常量池
String s6 = newString(“ABC”);
S3==S6; false
String s7 =”A”;
String s8 =s7+ “BC” ;
s8==s3; false
== 基本变量比较的是值 引用变量比较的是 引用的地址
= 基本变量是赋予值 引用变量是“ 指向”
equals()用来比较引用类型是否相等 object默认给的是和== 一样 一般子类会重写此方法根据业务逻辑给出具体的要求
byte[] bytes = s1.getBytes("UTF-8");
System.out.println(bytes.length);
将s1中的内容进行编码,中文windows采用GBK(一个字符有三个字节), Linux和Mac采用UTF-8(一个字符编译三个字节). getBytes方法不是检查内存中字符串占用的字节数量,因为不固定但是可以传参进行固定 主要用于字符串在网络传输过程中乱码问题的解决
加上重载的方法一共67个方法 构造方法就11个
常用的方法:
一个空格也代表占用一个字符
int a indexOf(String[char] a); 取出字符第一次出现的位置找不到字符就返回-1
String s subString(7,7+4) ; 可以从7 开始节取4个字符 遵循左闭右开
String s subString(7) ; 从7开始 到最后全部 2 端都是关闭的
char c chatAt(int a) ; 取出位置的字符
以上的数字都是下标从零开始的
String s trim(String s) ; 去掉前后空白部分
booleanstartsWith(String s); //是否以那个字符开头
booleanendsWith(String s) //是否以那个字符结尾 区分大小写的 一个字符或者多个字符 空格也可以检测 任何字符和空字符串相比都是true 注意与空格的区别
int n length() 字符串的长度
String s toUpperCase(String a) 变成大写
String s toLowerCase(String a) 变成小写
booleanequalsIgnoreCase(String another) 比较字符串与anther 是否一样忽视大小写
将此String与另一个String比较,不考虑大小写。如果两个字符串的长度相同,并且其中的相应字符都相等(忽略大小写),则认为这两个字符串是相等的。
int lastIndexOf()返回指定字符在此字符串中最后一次出现处的索引。
String replace(charold,char new ); 在字符串中用新的替换旧的
String [] spilt (String s) 按照指定的分割符分割成字符串数组 并返回
public String[]split(String regex) 将分割的字符去掉 或者符和匹配的内容去掉
根据给定正则表达式的匹配拆分此字符串。
该方法的作用就像是使用给定的表达式和限制参数 0 来调用两参数 split 方法。因此,所得数组中不包括
例如,字符串"boo:and:foo" 使用这些表达式可生成以下结果:
Regex | 结果 |
: | { "boo", "and", "foo" } |
o | { "b", "", ":and:f" } |
String valueOf(int s) ; 基本类型转换成字符串
char[] | toCharArray() |
boolean compareTo(); 按照顺序比较每个字符的unicode 编码
小负数
大整数
零 相等
boolean | contains(CharSequence s) |
public boolean isEmpty()
当且仅当length() 为 0 时返回true。
staticString valueOf(int a); 将一个int 类型的 返回一个字符串
返回 int 参数的字符串表示形式。
该表示形式恰好是单参数的 Integer.toString ()方法返回的结果。
StringtoString();返回字符串本身
/*
* 测试字符串的 trim() 方法
* 此字符串移除了前导和尾部空白的副本;如果没有前导和尾部空白,则返回此字符串。 否则返回新的对象
*/
Strings1="\r\n Hello \t\r\n";
Strings2="Hello";
Strings3=s1.trim();
Strings4=s2.trim();
System.out.println(s3);
System.out.println(s4==s2);//true
/*
* startsWith 方法演示
* 检查字符串是否以指定字符串为开头的。
*/
Stringstr="王宝强";
booleanb=str.startsWith("王");
System.out.println(b);//true
b=str.startsWith("");
System.out.println(b);//true
b=str.startsWith("王宝");
System.out.println(b);
2 StringBuilder
StringBuilderbuf=newStringBuilder();
//length() 检查数组中有效字符个数
System.out.println(buf.length());
//capacity() 容量:字符数组的实际长度默认为 16
System.out.println(buf.capacity
StringBuilder(int capacity) |
StringBuilder(String str) |
StringBuilder它里面的方法的索引位置都是左闭右开 通常都是用(6,6+4)
append(String s);
insert(3,ih);
delete(3.op);
replace();
reserve();
substring(int start) | |
substring(int start, int end) |
int | capacity() |
具体看API
/*
* 可变字符串StringBuilder演示
*/
StringBuilderbuf=new StringBuilder();
//length()检查数组中有效字符个数
System.out.println(buf.length());
//capacity()容量:字符数组的实际长度
System.out.println(buf.capacity());
buf.append("范传奇");
System.out.println(buf.length());
System.out.println(buf.capacity());
buf.append("哪一年在家里的时候");
buf.insert(3,"据说");
System.out.println(buf.capacity());
buf.append("天天学习");
System.out.println(buf.capacity());
//检查字符串的内容
System.out.println(buf);
//替换字符
//StringBuilder的API,适合“函数式”连写
buf.replace(1,1+2, "老湿")
.delete(16, 16+2)
.append("吃鸡");
System.out.println(buf);
连续的字符串连接 s3 = s1 + s1 + s1 + s2;
JAVA 自动利用StringBuilder进行处理不需要利用 StringBuilder去优化
看API 文档
stringBuffer 和 StringBuild;
stringBuffer线称安全 性能较慢
StringBuild; 线称不安全 性能较快
*/
Strings1 = "A";
Strings2 = "B";
/*
* Java 中字符串链接功能是利用StringBuilder
* 实现的,s3= s1+s2 相当于
* s3 = new StringBuilder(s1)
* .append(s2).toString();
*/
Strings3 = s1+s2;
s3= s1+s3;//创建 StringBuilder
s3= s1+s3;//创建 StringBuilder
s3= s1+s3;//创建 StringBuilder
s3= s1+s3;//创建 StringBuilder
StringBuilderbuf=new StringBuilder(s2);
buf.insert(0,s1);
buf.insert(0,s1);
buf.insert(0,s1);
buf.insert(0,s1);
s3= buf.toString();
/*
* 性能测试
*/
testString(10000);
testStringBuilder(10000);
/*
* 连续的字符串连接
* s3 = s1 + s1 + s1 + s2;
* Java 会自动利用一个StringBuilder进行处理
* 不需要利用StringBuilder 去优化性能。
*
* 字符串字面量会在编译器期间优化为一个字符串
* 对象
* s3 = "A" + "B" +"C" + "D"
* s3 = "A" + 1 + 2 + 3;
*/
}
/**
* 测试String的连接性能
*/
publicstatic void testString(int n){
longt1 = System.nanoTime();
Strings="";
for(inti=0; i<n; i++){
s= s+"A";
}
longt2 = System.nanoTime();
System.out.println(t2-t1);
}
/**
* 测试StringBuilder的连接性能
*/
publicstatic void testStringBuilder(int n){
longt1=System.nanoTime();
StringBuilderbuf=new StringBuilder();
for(inti=0; i<n; i++){
buf.append("A");
}
longt2=System.nanoTime();
System.out.println(t2-t1);
}