java-learn(4):字符串(String,StringBuilder,StringJoiner)ArrayList
String
APL
apl目前是jdk中提供的各种功能的java类
string是java定义好的一个类。定义在java.lang包中,所以使用时不需要导包
2.字符串不可,他们的值在创建之后就不能被改变了
3.java程序中所有字符串文字都被视作为此类的对象
String的构造方法

直接创建一个string对象 它的默认是是一个空字符串 ""
new String()
String(String orginal)
String(char[] chs) -- 是把chs中的元素拼接起来
把byte数组中的值装换位ascll值中的值
byte[] arr = {99,98,97};
String s = new String(arr);
System.out.println(s);
java的内存模型
栈内存:方法执行时入栈 执行完出栈
堆内存:new出来的对象都存在这里面
方法区:代码执行时 会生成一个class文件 储存在这里
StringTable(串池):它现在是属于堆内存的中的。通过直接复制的字符串就是储存在这个区域中
如果是直接复制的字符穿串 ,当赋值时,会从串池中去查看是否存在这个字符串,如果存在就直接然这个变量指向这块地址 如果不存在 再创建新的地址
但是如果是通过创建对象出来的字符串
会直接在堆中创建一块小空间 如果有相同的字符串也会继续创建
String s1 = "abc";
String s2 = "abc";
String s3 =new String("abc");
String s4 =new String("abc");
System.out.println(s1 == s2);// true;
System.out.println(s1 == s3);// false;
System.out.println(s3 == s4);// false;
/*
在基本数据类型中== 是判断值是否相等 但是在引用数据类型中是比较他们的地址值是否相同
* 因为直接赋值的字符串是在串池中的 并且如果有相同的 就不会再创建了 而是直接让这个变量指向那块空间 所以直接赋值的两个变量直接比较就是true
new出来的是直接在堆中创建的小空间 所以的话他们的地址值不同所以他们是false
* */
字符串1.eqluals(字符串2): 是直接比较字符串的内容是否一样
eqlualsIgnoreCase可以忽略大小写
System.out.println(s3.equals(s1));
boolean flag = s3.equalsIgnoreCase(s1);
System.out.println(flag);
截取字符串中部分字符 从start开始到end-1结束
str.substring(start,end);
str.substring(index)// 从index开始到末尾;
获得对应下标下面的字符
s.charAt(index);
替换字符串中的数据
str.replace(旧数据,新数据);
StringBuilder
它是一种可变的字符串
使用场景:
1.字符串的拼接
2.字符串的反转
下面介绍几种常用的方法:
// 创建类对象
StringBuilder sb = new StringBuilder();
StringBuilder sb = new StringBuilder(初始化字符串);
// 添加字符串(可以是任意类型的数据,它会把需要添加的字符串添加到字符串的末尾)
sb.append(基本类型的数据);
// 反转字符串
sb.reverse();
// 返回字符串长度
sb.length();
// 装换为String类型字符串
sb.toString();
StringJoiner
也是一个可变的操作字符串容器,在拼接的时候可以指定间隔符号,开始符号,结束符号。
// 创建一个类 (它不能空参创建)
StringJoiner sj = new StringJoiner(间隔符);
StringJoiner sj = new StringJoiner(间隔符,开始符,结束符);
// 拼接操作 -- 如果是对象类型的数据会自动调用toString() 但是如果是基本数据类型的话需要手动转化为字符串类型的数据;
sj.add(字符串类型的数据);
// 返回字符串长度
sj.length();
// 转化为字符串
sj.toString();
字符串原理
原理1:字符串储存的内存原理
直接赋值会复用字符串常量池中的
new出来的东西不会复用,而是再开辟一个新的空间
原理2:==号比较的是什么?
基本数据类型比较数据值
引用数据类型比较地址值
原理三:字符串拼接的底层原理
如果有变量参与,会创建新的字符串,浪费内存(中间是先创建StringBuilder对象 然后和成两个就转化为String类型的字符串,如果还有就一直重发这个操作)
原理四:StringBuilder提高效率原理图
所有的拼接内容会放在一个StringBuilder对象中,不会创建很多无用的类
底层原理五:StringBuilder原码分析
默认创建一个长度为16的空间
如果小于16就直接存
如果不够了就扩容(原来的容量*2+2)
如果扩容之后还不够就以实际长度为准
综合练习
// 新库函数:
String A = "abcdef";
// 转化为字符数组
char[] arr = A.toCharArray();
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
}
// 转化为字符串
String B = new String(arr);
给定两个字符串 ,旋转一个看最终是否能相同
String B = "efabcd";
String A = "abcdef";
A = A + A;
boolean flag = false;
for(int i = 0;i < A.length()-B.length();i++){
if(B.equals(A.substring(i,i+B.length()))){
System.out.println(true);
flag = true;
break;
}
}
if(flag == false) System.out.println(false);
ArrayList
ArrayList常用成员方法

ArrayList<String> al = new ArrayList<>();
al.add("itheima");// 放回true
//al.remove("itheima"); //添加成功返回true
System.out.println(al.set(0,"张三"));
// 返回被覆盖的元素
System.out.println(al);
System.out.println(al.get(0));//得到对应下标的元素
System.out.println(al.size());//的到集合元素个数
更多推荐



所有评论(0)