-
(目录
1.String
1.1是什么
/**
* String 是java.lang.String下的东西 属于系统自带的方法,使用的时候不需要导包
* String 是字符串类, 是引用类型 ,底层是char数组, 所以String的特性几乎和数组一致
*
* 1. 字符串一旦创建,该字符串对象不能更改
*
* 2. 为了提高字符串的访问效率,Java虚拟机使用了一种缓存技术,
* 可以对字符串操作更加简单方便,更加高效(字符串常量池)
*
* 3.字符串会被保存在静态区中的常量池中,可复用性增强
* 当我们用到一个重复的字符串的时候, 会去常量池中进行检索,
* 如果有该字符串,则直接指向,如果没有就要重新创建
*
* @author 人间失格
* @data 2021年10月18日下午6:28:46
*/
1.2基本使用
package String;
/**
* String 是java.lang.String下的东西 属于系统自带的方法,使用的时候不需要导包
* String 是字符串类, 是引用类型 ,底层是char数组, 所以String的特性几乎和数组一致
*
* 1. 字符串一旦创建,该字符串对象不能更改
*
* 2. 为了提高字符串的访问效率,Java虚拟机使用了一种缓存技术,
* 可以对字符串操作更加简单方便,更加高效(字符串常量池)
*
* 3.字符串会被保存在静态区中的常量池中,可复用性增强
* 当我们用到一个重复的字符串的时候, 会去常量池中进行检索,
* 如果有该字符串,则直接指向,如果没有就要重新创建
*
* @author 人间失格
* @data 2021年10月18日下午6:28:46
*/
public class String_01 {
public static void main(String[] args) {
//创建一个字符串对象,直接指向常量池
//数据类型 String 变量名string = 值 "ab";
String string ="ab";
//string是main方法中的局部变量, = 赋值只是更改了这个变量的值,并没有更改ab这个字符串对象
//就是重新创建了一个东西在常量池当中,ab这个值并不会更改
string = "cd";
//变量s1 ,s2 只会创建一个对象 ,就是asd 保存在常量池当中
String s1 = "asd";
String s2 = "asd";
//判断这两个值是否相等,结果为true
System.out.println(s1==s2);
//equals 比较两个对象是否相等
System.out.println(s1.equals(s2));
//
String s3 = new String("abc");
String s4 = new String ("abc");
//fales 因为这里比较的是两个值的数据地址 所以结果不同
System.out.println(s3==s4);
//这里用equals 直接比较的就是两个值的大小
System.out.println(s3.equals(s4));
}
}
1.3构造方法
package String;
/**
* 构造方法 : 创建 String 对象的几种方式
* 1. 直接创建
* 2.普通构造
* 3.字节数组
* 4.字符数组
*
* @author 人间失格
* @data 2021年10月18日下午6:56:19
*/
public class String_02 {
public static void main(String[] args) {
//1. 直接创建
String s1 = "qwer";
//2.普通构造 创建对象 数据类型 String 变量名 s2 = new 数据类型 String (参数)
String s2 = new String ("asdf");
//3. 字节数组 , 打印输出数值对应的Ascc码
byte [] bytes = {97,98,99,100};
// 创建对象 把bytes数组赋值给 String类型的变量s3
String s3 = new String (bytes);
//打印输出结果 结果的值为相对应的数字的值
System.out.println(s3);
//4. 字节数组 , 截取一部分
//下标从0开始 ,第二个参数 起始下标(包含),第三个参数 是截取的个数
String s4 = new String (bytes,0,3);
//打印结果abc, 起始位置 0 ,截取个数为3
System.out.println(s4);
//5. 字符数组 用字符串形式打印出字符类型的数组
char [] chars = {'q','w','e','r','t','y','u'};
//同3
String s5 = new String (chars);
System.out.println(s5);
//6. 字符数组 截取一部分 第一个数字为截取位置, 第二个数字为截取个数
String s6 =new String (chars,2,3);
//ert
System.out.println(s6);
}
}
1.4常用方法
package String;
/**
* String API
* 常用方法
*
* 1. 什么方法 ,静态方法还是成员方法
* 2. 方法名 , 参数 , 返回值是什么
* 3. 方法功能
*
* @author 人间失格
* @data 2021年10月18日下午7:19:21
*/
public class String_03 {
public static void main(String[] args) {
// 1. char charAt( int index ) : 获取字符串中指定下标的字符
String s1 = "qwer";
//获取数组s1 中小标为s3的数组
char c = s1.charAt(3);
System.out.println("类型1: ");
System.out.println(c);
//2. boolean startsWith(String prefix) : 判断该字符串是否以指定字符串开头
//endsWith : 是否以指定字符串结尾
//区分大小写 , 第一个结果为false ,第二个注意有空格 false , 第三个 结尾判断 true
System.out.println("类型2 :");
System.out.println("Hellow,world".startsWith("he"));
System.out.println("Hellow,world ".endsWith("world"));
System.out.println("Hellow,world".endsWith("world"));
//3. boolean equals(Object obj) : 判断字符串是否相等
//boolean equalsIgnoreCase(String str) : 不区分大小写判断相等 注意第二个I为大写的i
System.out.println("类型3 :");
System.out.println("aSdFghj".equalsIgnoreCase("ASDfghJ"));
System.out.println("类型4 :");
//4.byte [] getBytes() ; 把字符串转换为"字节"数组 这个就是把字母变成数字
byte [] bytes ="abcd".getBytes();
//遍历数组
for (byte b : bytes){
System.out.println(b);
}
System.out.println("类型5: ");
//5. char [] toCharArray() : 把字符串转换为"字符"数组
char [] chars ="abcd".toCharArray();
//数组遍历
for (char d :chars){
System.out.println(d);
}
System.out.println("类型6: ");
//6. int indexOf(String str) : 获取指定字符串在该字符串中第一次出现的索引,找不到就返回-1
//int lastIndexOf(Strng str) :获取指定字符串在该字符串中最后一次出现的索引
int index = "asfskfsfngesdg".indexOf("ng");
System.out.println(index);
index ="asfskfsfngesdg".lastIndexOf("f");
System.out.println(index);
System.out.println("类型7: ");
//7. int length () : 返回字符串长度
System.out.println("asfskfsfngesdg".length());
System.out.println("类型8: ");
//8. String [] split (String regex) : 分割字符串,支持正则表达式
String [] strs ="2021-10-18".split("-");
//不遍历数组直接打印的值为数组的地址
System.out.println(strs);
//遍历数组
for (String string : strs){
System.out.println(string);
}
System.out.println("类型9: ");
//9. String replaceAll(String regex , String replacement) : 替换字符中的内容为指定的文字,支持正则表达式
// replace : 同上 ,不支持正则表达式
String string ="asgbjdfgafdgjeagolgfield";
//第一个为被替换的数,第二个为替换的数
String newstring = string.replaceAll("g", "8");
System.out.println(newstring);
System.out.println("类型10: ");
//10. String substring(int beginIndex , int endIndex) : 截取字符串, 包含开始 "不包括"结束
//substring(int beginIndex) : 从指定下标开始(包含),到末尾
String s2 = "abcdef";
// cdef
//从下标2开始到末尾
System.out.println(s2.substring(2));
// cd
//从下标2 开始 到下标4 但不包含4
System.out.println(s2.substring(2,4));
System.out.println("类型13: ");
//11. String toUpperCase() : 转换成大写
//12. String toLowerCase() : 转换成小写
//13. String trim() : 去除两边的空格
System.out.println(" a s ".trim());
System.out.println("____________");
//多个英文名字,以逗号隔开
String name = "zhang,wang,lihua,liming";
//需求: 获取每一个姓名,并把该姓名以首字母大写进行存储
//1 以逗号隔开,得到封装每个名字的数组
String [] names =name.split(",");
//2. 遍历数组,获取每个名字,截取字符串,转为大写,再拼接起来
for (int i=0; i <names.length ; i++){
String Nnames = names[i];
//截取首字母并且大写
// System.out.println(Nnames.substring(0,1).toUpperCase()+Nnames.substring(1));
names[i] = Nnames.substring(0, 1).toUpperCase()+Nnames.substring(1);
}
//遍历得到数组中每一个元素
for (String string2 : names) {
System.out.println(string2);
}
}
}
1.5注意事项
package String;
/**
* 使用String不推荐进行频繁的字符串拼接操作
* 因为字符串一旦创建不可以更改,只要拼接,就会创建新的自负串对象
* 浪费空间,效率还低,就等于是使用定长数组频繁做添加操作一样
*
* @author 人间失格
* @data 2021年10月18日下午8:45:05
*/
public class String_04 {
public static void main(String[] args) {
String[] strs = { "a", "b", "c" };
String str = "";
for (int i = 0; i < strs.length; i++) {
str += strs[i] + ",";
}
System.out.println(str);
// a , b , c , "" , a, , a,b, , a,b,c,最终结果
}
}
2.StringBuffer和StringBuilder
2.1是什么
/**
* StringBuilder 和StringBuffer 都在java.lang下,使用不需要导包
* 1.StringBuilder 和StringBuffer是啥
* 是一个可变的字符串缓冲区,底层也是数组,只是不过该数组会进行自动的扩容
* 适合做字符串拼接操作
* 2. 原理
* 预先在内存中创建一个空间, 用来哦保存字符(字符数组)
* 如果预存空间长度不足,会进行自动扩容用来容纳更多的字符
* 默认长度为16 ,扩大容量为(原长度+1)*2 : 16->34->70
* 3.StringBuilder 和StringBuffer的区别
* StringBuilder : 线程安全,在多线程环境下使用,没有问题
* StringBuffer : 非线程安全,在多线程环境下使用,没有问题
*
* @author 人间失格
* @data 2021年10月18日下午8:51:23
*/
2.2使用方式
package String;
/**
* StringBuilder 和StringBuffer 都在java.lang下,使用不需要导包
* 1.StringBuilder 和StringBuffer是啥
* 是一个可变的字符串缓冲区,底层也是数组,只是不过该数组会进行自动的扩容
* 适合做字符串拼接操作
* 2. 原理
* 预先在内存中创建一个空间, 用来哦保存字符(字符数组)
* 如果预存空间长度不足,会进行自动扩容用来容纳更多的字符
* 默认长度为16 ,扩大容量为(原长度+1)*2 : 16->34->70
* 3.StringBuilder 和StringBuffer的区别
* StringBuilder : 线程安全,在多线程环境下使用,没有问题
* StringBuffer : 非线程安全,在多线程环境下使用,没有问题
*
* @author 人间失格
* @data 2021年10月18日下午8:51:23
*/
public class StringBuilder__StringBuffer {
public static void main(String[] args) throws Exception {
// 创建对象 数据类型 变量名 = new 数据类型 ();
StringBuilder sb = new StringBuilder();
// 添加(尾部添加)
sb.append("a");
sb.append("b");
// 插入到指定位置
sb.insert(1, "c");
// 已添加元素个数
System.out.println(sb.length());
// 返回当前容量,默认是16
System.out.println(sb.capacity());
// 反转
sb.reverse();
// 调用 toString 方法 可以转换为字符串
String str = sb.toString();
System.out.println(str);
}
}