目录
7 .StringBuffer 和 StringBuilder
③ StringBuffer、StringBuilder与String相互转换
一、字符, 字节与字符串
1 字符与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换.
①将字符数组中的所有内容变为字符串:
public static void main(String[] args) {
char[] chars = {'a','b','c','d'};//不是双引号引起来的,不会入常量池
String str = new String(chars);
System.out.println(str);//字符转换成字符串
}
打印结果:
看下图代码,传两个参数意为从偏移量为1的地方开始取三个
public static void main(String[] args) {
char[] chars = {'a','b','c','d','e'};//不是双引号引起来的,不会入常量池
String str = new String(chars,1,3);//offset偏移量,意为从偏移量为1的地方开始取三个
System.out.println(str);//把一个数组转变为一个字符串
}
打印结果:
②获取指定下标位置的字符
public static void main(String[] args) {
String str1 = "hello";
char ch = str1.charAt(2);//获取到2下标的字符
System.out.println(ch);
}
打印结果:
③将字符串变为字符数组返回
public static void main(String[] args) {
String str1 = "hello";
char ch = str1.charAt(2);//获取到2下标的字符
System.out.println(ch);
char[] chars = str1.toCharArray();//把str1指向的字符串对象,变成字符数组
System.out.println(Arrays.toString(chars));
}
打印结果:
④判断某个字符是不是数字
第一种写法:
public static boolean isNumberchar(String s){
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(c<'0'||c>'9') {
return false;
}
}
return true;
}
public static void main(String[] args) {
String str = "123456789";
System.out.println(isNumberchar(str));
}
打印结果:
第二种写法:
public static boolean isNumberchar(String s){
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
boolean flg = Character.isDigit(c);//判断某个字符是不是数字
if(flg == false){
return false;
}
}
return true;
}
public static void main(String[] args) {
String str = "123456789";
System.out.println(isNumberchar(str));
}
2.字节与字符串
①将字节数组变为字符串
public static void main(String[] args) {
byte[] bytes = {97,98,99,100};
String str = new String(bytes);//把字节变成字符串
System.out.println(str);
打印结果:
小小知识点 :
String中间一道横杠,我们点开看源码,注解为Deprecated,证明这个方法已经过时了,不用了。
看下图代码,传两个参数意为从偏移量为1的地方开始取三个
public static void main(String[] args) {
byte[] bytes = {97,98,99,100};
String str = new String(bytes,1,3);意为从偏移量为1的地方开始取三个,98为1偏移量
System.out.println(str);
}
打印结果:
②将字符串以字节数组形式返回
public static void main(String[] args) {
byte[] bytes = {97,98,99,100};
String str = new String(bytes,1,3);
System.out.println(str);
System.out.println("===========");
String str1 = "abcde";
byte[] bytes1 = str1.getBytes();
System.out.println(Arrays.toString(bytes1));
}
打印结果:
注意:
那么何时使用 byte[], 何时使用 char[]呢?
byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.
回忆概念: 文本数据 vs 二进制数据
一个简单粗暴的区分方式就是用记事本打开能不能看懂里面的内容.如果看的懂, 就是文本数据(例如 .java 文件), 如果看不懂, 就是二进制数据(例如 .class 文件).
3.字符串常见操作
字符串比较方式:
1:真假比较
2:大小比较
①比较字符串内容
public static void main(String[] args) {
String str1 = "hello";
String str2 = "abcdef";
System.out.println(str1.equals(str2));//比较字符串内容一样不一样
}
打印结果: equals如何比较的我们可以看一下源码:
②忽略大小写比较
public static void main(String[] args) {
String str1 = "abc";
String str2 = "Abc";
System.out.println(str1.equalsIgnoreCase(str2));//比较的时候忽略大小写
}
打印结果:
③比较两个字符串大小关系
public static void main(String[] args) {
String str1 = "abc";
String str2 = "Abc";
int ret = str1.compareTo(str2);
System.out.println(ret);
}
打印结果:
看源码分析:
4.字符串查找
①判断一个子字符串是否存在
public static void main(String[] args) {
String str1 = "ababcabcd";
String str2 = "abce";
boolean ret = str1.contains(str2);//contains会从前往后找第一个出现的abc,有返回true,没有返回falsse
System.out.println(ret);
}
打印结果:
②在子串当中找到主串第一次出现的位置,找到返回下标
public static void main(String[] args) {
String str1 = "ababcabcd";
String str2 = "abc";
int index = str1.indexOf(str2);//在子串当中找到主串第一次出现的位置,找到返回下标
System.out.println(index);
}
打印结果:
③从后往前查找子串在主串第一次出现的位置
public static void main(String[] args) {
String str1 = "ababcabcd";
String str2 = "abc";
int index = str1.lastIndexOf(str2);//在子串当中找到主串第一次出现的位置,从后往前找,找到返回下标
System.out.println(index);
}
打印结果:
③判断是否以指定字符串开头
public static void main(String[] args) {
String str1 = "ababcabcd";
String str2 = "abc";
System.out.println(str1.startsWith("a"));
}
打印结果:
从偏移量为3的位置开始判断:
④判断是否以指定字符串结尾
public static void main(String[] args) {
String str1 = "ababcabcd";
String str2 = "abc";
System.out.println(str1.endsWith("cd"));
}
打印结果:
5. 字符串替换
替换所有的指定内容
①字符替换
public static void main(String[] args) {
String str = "abababcdabcdef";
String ret = str.replace('a','g');//不是把a替换成g,是重新new了一个对象。
System.out.println(ret);
}
打印结果:
②字符串替换
public static void main(String[] args) {
String str = "abababcdabcdef";
String ret = str.replace("ab","pp");
System.out.println(ret);
}
打印结果:
③替换首个内容
public static void main(String[] args) {
String str = "abababcdabcdef";
String ret = str.replaceFirst("ab","pp");
System.out.println(ret);
}
打印结果:
6.字符串拆分
①将字符串全部拆分
public static void main(String[] args) {
String str = "name=zhangsan&age=19";
String[] st = str.split("=");
for (String s:st) {
// System.out.println(s);
String[] str1 = s.split("&");
for (String ss :str1) {
System.out.println(ss);
}
}
}
打印结果:
②字符串截取
public static void main(String[] args) {
String str = "abcdefg";
//给个0不会产生新的对象,默认返回原来的对象
String str1 = str.substring(2);//从下标为2的位置开始提取子串,相当于new了一个新的对象
System.out.println(str1);
}
打印结果:
打印结果:
③去掉字符串中的左右空格,保留中间空格
public static void main(String[] args) {
String str = " abc df ";
String ret = str.trim();
System.out.println(ret);
}
打印结果:
④字符串转大写
public static void main(String[] args) {
String str = "abcdefGHEDF123";
String ret = str.toUpperCase();
System.out.println(ret);
}
打印结果:
⑤字符串转小写
public static void main(String[] args) {
String str = "abcdefGHEDF123";
String ret = str.toLowerCase();
System.out.println(ret);
}
打印结果:
⑥字符串拼接
public static void main(String[] args) {
String str = "abcdef";
String st = str.concat("ppp");//拼接后的结果不如池
System.out.println(st);
}
打印结果:
⑦判断是否为空字符串,但不是null,而是长度为0
public static void main(String[] args) {
String str = "abcdef";
System.out.println(str.isEmpty());
}
打印结果:
7 .StringBuffer 和 StringBuilder
①StringBuilder
首先我们new一个sb,sout一下
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
System.out.println(sb);
}
打印结果:什么都没有
如何打印出内容,StringBuilder的用法:第一种
new对象传参
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("abcdef");
System.out.println(sb);
}
打印结果:
疑问?sb这个引用存的是地址啊?为什么能够打印出abcdef
答:sout本身底层调用的是sb这个引用类型的toString()方法。既然默认调用toString()方法就会把sb变成字符串形式,就是调用toString来new一个String
第二种: append()方法
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("abcdef");//相当于把你的内容append到sb引用的对象当中
System.out.println(sb);
}
打印结果:
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("abcdef");
sb.append("12344");
System.out.println(sb);
}
打印结果:
append()方法自始至终返回的都是当前的对象,不会new新的对象。
append()方法可连用 :
如果是在循环里面,进行字符串的拼接,尽量不要使用String,优先使用StringBuffer和StringBuilder
②StringBuffer
StringBuffer 与 StringBuilder的区别在于
一般情况下StringBuffer用在多线程情况下
StringBuilder用在单线程情况下
③ StringBuffer、StringBuilder与String相互转换
一、
//String->StringBuffer或者StringBuilder使用构造方法
public static StringBuffer func(){
String str = "abcdef";
return new StringBuffer(str);
}
二、
/StringBuffer或者StringBuilder->String调用toString()方法
public static String func2(){
StringBuilder sb = new StringBuilder();
return sb.toString();
}
注意:
String和StringBuffer类不能直接转换。
如果要想互相转换,可以采用如下原则:
String变为StringBuffer:
利用StringBuffer的构造方法或append()方法
StringBuffer变为String:
调用toString()方法。