一,String的常用功能
-
String类型的获取功能
- int length():获取字符串的长度
- char charAt(int index):获取字符串参数角标位置上面的字符
- String substring(int beginIndex):获取从字符串参数角标开始一直到结尾部分的字符串 【新的字符串】
- String substring(int beginIndex, int endIndex): 获取从字符串参数指定范围的字符串 【新的字符串】
- indexOf家族:
5.1, int indexOf(int ch):获取字符串中第一出现参数字节的索引值
【从左往右查 开头开始】5.2,
int indexOf(int ch, int fromIndex):
获取字符串从参数索引开始中第一出现参数字节的索引值【从左往右查 参数索引开始】
5.3, int indexOf(String str):获取字符串中第一出现参数字符串的索引值 [从左往右查 开头开始]
5.4, int indexOf(String str, int fromIndex):获取字符串从参数索引开始中第一出现参数字符串的索引值【从左往右查 参数索引开始】
6. lastIndexOf家族:和IndexOf基本一样,只不过是从后往前找,所有字符和字符串的索引也都不会发生变化
【从右往左查 尾部开始】
【从右往左查 参数开始】
代码示例
public class Demo {
public static void main(String[] args) {
String s = "abcdef";
int length = s.length();
System.out.println(length); //长度为:6
char c = s.charAt(4);
System.out.println(c); //第四个角标值为: e
String name = "我爱你武汉";
System.out.println(name.charAt(3));//第三个角标值:武
String ss = name.substring(1);
System.out.println(ss);//从第一个角标值开始:爱你武汉
String string = name.substring(1, 3);
System.out.println(string);//爱你 截取的时候含头不含尾
//indexOf家族
String sss = "abcabdcdes";
int i = sss.indexOf(97);//0 97为a,a的角标值为0
int l = sss.lastIndexOf(97); //从右往左数第一个a 是在第三个角标值位置
System.out.println(i);//0
System.out.println(l);//3
System.out.println("=================");
int i1 = sss.indexOf(97,2);//0 从第二个角标开始是c,c的角标值是3
System.out.println(i1);//3
int j = name.indexOf('爱');
System.out.println(j); //1
int k = sss.indexOf("bc");
System.out.println(k);//1 第一个字母b的角标值是1
int k1 = sss.indexOf("bc",3);
System.out.println(k1);//没有这字符串 索引应该返回什么 -1
}
}
-
String类型的转换功能
- byte[] getBytes():把字符串转换为字节数组
- char[] toCharArray():把字符串转换为字符数组
- toUpperCase():把字符串内容转为全部大写
- toLowerCase():把字符串内容转为全部小写
- concat(String str):合并两个字符串为一个字符串
- valueOf家族:把基本数据类型的数据转换为字符串
- 他是一个静态方法不需要对象调用
import java.util.Arrays; public class Demo02 { public static void main(String[] args) { //转换功能 String s = "dhfasj"; byte[] bs = s.getBytes(); System.out.println(Arrays.toString(bs));//Arrays.toString(bs)工具类的方法用来查看数组内容 char[] cs = s.toCharArray(); System.out.println(Arrays.toString(cs)); String case1 = s.toUpperCase(); System.out.println(case1);//得到的是新的字符串,原来的字符串没有发生任何的变化 System.out.println(s); String case2 = case1.toLowerCase(); System.out.println(case2); String concat = case1.concat(case2); System.out.println(concat);//DHFASJdhfasj String concat1 = case2.concat(case1); System.out.println(concat1);//dhfasjDHFASJ System.out.println(case1+case2);//DHFASJdhfasj //valueOf String valueOf = String.valueOf(20); System.out.println(valueOf);//20 System.out.println(valueOf+50);// 2050 } }
练习
- 键盘录入一个大小写混杂的纯英文字符串
- 将字符串转换成首字母大写,其他字母全部小写
- 例如,键盘录入”i lOvE jAvA”,转换成 “I love java”
- 分析:
- 键盘录入字符串【字符串带有空格 使用nextLine】
- 把录入的字符串的首字母得到 【截取功能】
- 把他变成大写
- 还得到其他的所有的字符串 把变成小写
- 把转换后的字符串要拼接起来
import java.util.Scanner;
class String_Test {
public static void main(String[] args) {
// 1、键盘录入字符串【字符串带有空格 使用 nextLine 】
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
// 2、把录入的字符串的首字母得到 【截取功能】
String start = line.substring(0,1);
// 3、把他变成大写
String upperCase = start.toUpperCase();
// 4、还得到其他的所有的字符串 把变成小写
String end = line.substring(1);
String lowerCase = end.toLowerCase();
// 5、把转换后的字符串要拼接起来
String concat = upperCase.concat(lowerCase);
System.out.println(concat);
}
}
-
String类型的其他方法
- String replace(String oldStr, String newStr):使用新的字符串替换就得字符串
- trim():去掉字符串左右两边的空格、制表符
- split(String s):使用参数s对字符串切割,切割成字符串数组
import java.util.Arrays; public class Demo03 { public static void main(String[] args) { String s = "ababababababab"; String ss = " aba bab abab abab "; String sss = "a,a,a,as,fds,gd,gsgd,s";
String replace = s.replace("a", "*"); System.out.println(replace); String trim = ss.trim(); System.out.println(trim); System.out.println(ss);
String[] split = sss.split(","); System.out.println(Arrays.toString(split)); String[] split2 = trim.split(" "); System.out.println(Arrays.toString(split2));
String sd = "as.df.gs"; String[] split3 = sd.split(".");//单独写.编译器不识别 需要转义 //. System.out.println(Arrays.toString(split3));//[] String[] split4 = sd.split("\.");//单独写.编译器不识别 需要转义 \. 编译器就认识为. System.out.println(Arrays.toString(split4));//[as, df, gs]
}
}
二,Math
- 概述:他是一个专门从事数学运算的一个运算类【工具类】
- 成员变量:
- E:更接近自然对数的底数e的一个常量, E= 2.718
- PI:更接近于圆周率 的一个常量, PI = 3.1415926
- 方法:
- abs(整数类型的数据):求取传入数据的绝对值
- cbrt(double a):求取数的立方根
- sqrt(double a):求取数的正平方根
- ceil(double a):向上取最接近参数的整数
- floor(double a):向下取最接近参数的整数
- max(两个浮点或整形的数):求取两个参数的最大值
- min(两个浮点或整形的数):求取两个参数的最小值
- pow(double a,double b):返回a的b次幂【次方】
- random():随机生成0到1.0之间的小数【不包含1.0】
- round(double a):四舍五入【只针对第一位小数】
- log10(double a):返回以10 为底的a的对数【求幂的逆运算】 比如 1og10 ( 100)=2
- log(double a):返回以e为底的a的对数。
代码示例
public class Demo_Math {
public static void main(String[] args) {
//属性
System.out.println(Math.E);//2.718
System.out.println(Math.PI);//3.14159265358
//方法
System.out.println(Math.abs(103));//103
System.out.println(Math.abs(-103));//103
System.out.println(Math.cbrt(27.0));//3.0
System.out.println(Math.sqrt(103));//10.14889156509222
System.out.println(Math.sqrt(4));//2.0
System.out.println(Math.ceil(2.3));//3.0
System.out.println(Math.ceil(-2.3));//-2.0
System.out.println(Math.floor(4.0));//4.0
System.out.println(Math.floor(-4.00009));//-5.0
System.out.println(Math.max(3.0, 3.00000000003));//3.00000000003
System.out.println(Math.min(3.0, 3.00000000003));//3.0
System.out.println(Math.random());//在0.0到1.0 之间永远不会是1.0
System.out.println(Math.round(4.102));//4
System.out.println(Math.round(4.4999902));//4
System.out.println(Math.pow(2, 4));//2的4次方 16.0
System.out.println(Math.log10(100));//2
System.out.println(Math.log(3.0987));//1.1309826686985605
}
}
三,System
- 概述:在
System
类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法。
这个类我一般称为是系统类,他可以访问一些系统的资源信息。
- 属性:
- in:标准输入流
- out:标准输出流
- err:错误输出流
- 比如:输出语句:System.out.print(); System.out.println();
- 解释:System.out 标准输出流
- print()和 println()是方法是标准输出流的方法
- . 后面又. :链式编程
- 方法: arrayCopy(Object src, int srcPos,Object dest,int destPos, int length):赋值数组中的一部分内容到另一个数组中
- 参数解释:
- src:要复制的数组【源数组】
- srcPos:要复制数组内容的开始角标【源数组开始复制的位置】
- dest:接收复制内容的数组【目标数组】
- destPos:接收内容要存放的目标数组的开始位置
- length:要复制的内容的长度
- 注意事项:
- 源数组和目标数组的类型一致
- 操作的索引一定要在对应的数组的索引范围内
- 复制长度保证在目标数组开始索引到最大索引的范围内
- currentTimeMillis():获取当前时间的毫秒值
- 以1970-1-1 8:00:00开始为0计数,1毫秒为1来计数。
- exit(int status):jvm的状态,0表示终止jvm的运行 常用 exit(0)有点像break的效果;
- gc():运行垃圾回收器
代码示例
import java.util.Arrays;
public class Demo_System {
public static void main(String[] args) {
int[] src = {1,2,3,4,5,6};
int[] dest = {7,8,9,0,11,12};
System.arraycopy(src, 1, dest, 2, 3);
System.out.println(Arrays.toString(dest));//[7, 8, 2, 3, 4, 12]
System.out.println(Arrays.toString(src));//[1, 2, 3, 4, 5, 6]
System.out.println(System.currentTimeMillis());//1582615495548 毫秒值
System.out.println(1582615495548L/1000/60/60/24/365);
System.out.println(1582615495548L/1000/60/60/24);
for (int i = 0; i < dest.length; i++) {
System.out.println(dest[i]);
if (i==3) {
System.exit(0);//把虚拟机给关闭
}
}
while(true) {
new Demo();
System.gc();//手动调用垃圾回收器回收不需要的对象【资源】
}
}
}
四,StringBuilder
- 概述:也是字符串表示的一种类型。
- 好处:他表示字符串可以修改【可变】节省空间
- 特点: 字符串可变,改变后不可逆
- String 和StringBuilder的关系:他们都可以表示字符串形式
- String一旦创建内容就不可变,要想变只能创建新的字符串对象
- StringBuilder可以改变自身的内容。
-
构造方法
- 空参构造
- StringBuilder():创建一个默认大小为16的没有内容的缓冲区对象
- 有参构造
- StringBuilder(int len):创建一个指定大小为len的没有内容的缓冲区对象
- StringBuilder(String s):创建大小为16+s的长度的内容为s的缓冲区对象
代码示例
public class Demo_StringBuilder {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder(10);
StringBuilder sb3 = new StringBuilder("金莲");
System.out.println(sb1.capacity()); //16 默认值
System.out.println(sb1.length()); //0 没有内容所以长度为0
System.out.println(sb2.capacity()); //10 空间大小为10
System.out.println(sb2.length()); //0 内部内容长度为0
System.out.println(sb3.capacity()); //16+2 18 默认值为16+2
System.out.println(sb3.length()); //2 长度为2,2个字符
}
}
-
成员方法
-
获取功能
- capacity():获取缓冲区空间大小
- length():获取缓冲区内部内容的长度
-
添加功能:
- append(Object o):追加字符串到缓冲区对象内容的尾部
- insert(int offset,Object o):插入字符串到缓冲区内容指定的位置
- 解释:
3.1 offset: 缓冲区内容的索引值
3.2 o: 插入的内容
4. 特点:原有指定位置的内容往后顺移【不是覆盖行为】
代码示例
public class Demo_StringBuilder {
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder();
StringBuilder sb3 = new StringBuilder("金莲");
sb1.append(3);
System.out.println(sb1.length());//1
System.out.println(sb1);//3
sb3.append("大朗");
System.out.println(sb3);//金莲大朗
sb3.insert(2, "庆庆");//在索引的前面插入内容值
System.out.println(sb3);//金莲庆庆大朗
}
}
-
删除功能:
- deleteCharAt(int index):删除指定索引位置的字符
- delete(int starindex, int endindex):删除指定范围的字符串
- 解释:
- starindex:指定范围的开始位置
- endindex:指定范围的结束位置后一位
- 注意:
- 含头不含尾
- 如果范围的最后值大于字符串缓冲区内容的最大的索引值;默认取到最后,不会报错
代码示例
public class Demo_StringBuilder02 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("小鹿乃亮PGone宝宝蓉蓉");
sb.deleteCharAt(2);
System.out.println(sb); //删除第二个角标值的字符 小鹿亮 PGone宝宝蓉蓉
sb.deleteCharAt(2);
System.out.println(sb); //删除第二个角标值的字符 小鹿PGone宝宝蓉蓉
sb.delete(2, 7); //删除指定范围的字符串 小鹿宝宝蓉蓉
System.out.println(sb);
sb.delete(2, 8); //删除第二个角标值后面所有的字符串
System.out.println(sb);
}
}
-
替换功能:
- replace(int start, int end, String str):使用str替换指定范围的元素
- 解释:
- start:指定范围的开始
- end:是指定范围的结束
- str:要替换的新内容
- 注意:
- 含头不含尾
- 如果范围的最后值大于最大的索引值默认取到最后,不会报错
代码示例
public class Demo_StringBuilder02 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("小鹿乃亮PGone宝宝蓉蓉");
sb.deleteCharAt(2);
System.out.println(sb);
sb.deleteCharAt(2);
System.out.println(sb);
sb.delete(2, 7);
System.out.println(sb);
sb.delete(2, 8);
System.out.println(sb);
sb.replace(0, 1, "乃亮真好");
System.out.println(sb);//乃亮真好鹿
sb.replace(0, 8, "乃亮真好");
System.out.println(sb);
}
}
-
反转功能:
- reverse():把字符串内容反转
-
转换为字符串功能:toString():把 StringBuilder 得内容变成 String 类型
代码示例
public class Demo_StringBuilder03 {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder( "abcd" );
System.out.println(builder);
builder.reverse();
System.out.println(builder);
String string = builder.toString();
System.out.println(string);
}
}
- String 和 StringBuilder 相互转换:
- String 变成 StringBuilder:使用构造方法,append(String s)
- StringBuilder 变成 String :toString()方法
练习一
- 定义一个方法,接收一个String类型的字符串,返回该字符串的反转形式
- 举例:接收字符串为abc,返回字符串为cba
代码示例
public class Demo_StringBuilder03 {
public static void main(String[] args) {
String ss = reverseString("abcdefg");
System.out.println(ss);
}
public static String reverseString(String s) {
StringBuilder builder = new StringBuilder(s);
builder.reverse();
return builder.toString();
}
}
练习二
- 定义一个方法,接收一个int[]类型的数组,返回该数组的字符串表示形式
- 举例:接收数组为int[] arr = {1, 2, 3},返回的字符串为[1, 2, 3]
- 要求:使用StringBuilder进行拼接,提高运行效率
代码示例
public class StringBuilder_Test02 {
public static String getArrString(int[] arr) {
StringBuilder builder = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
if (i== arr.length-1) {
builder.append(arr[i]).append("]");
}else {
builder.append(arr[i]).append(",");
}
}
return builder.toString();
}
public static void main(String[] args) {
int[] arr = {1,2,3};
String ss = getArrString(arr);
System.out.println(ss);
}
}
- String和StringBuilder作为方法参数
- String 作为方法参数的时候,方法体对字符串进行了修改,他不会对本身的字符串产生影响
- StringBuilder 作为方法参数的时候,方法体对这个缓冲区对象的内容进行了修改,就会对里面的内容进行了修改
代码示例
public class Demo_StringBuilder04 {
public static String getMethod(String s) {
return s+"123";
}
public static String getmethod(StringBuilder sb) {
return sb.append(123).toString();
}
public static void main(String[] args) {
String s = "花花";
StringBuilder sb = new StringBuilder("金莲");
String string = getMethod(s);
System.out.println(string);//方法产生的效果 花花123
System.out.println(s);//外接的参数 没有发生任何变化 花花
String getmethod = getmethod(sb);
System.out.println(getmethod);//方法产生的效果 金莲123
System.out.println(sb);//外界的参数 金莲123
}
}
- StringBuilder和StringBuffer的对比
- 相同点:
- 他们都是字符串缓冲区,它里面的字符串可以改变
- 他们的功能是一模一样的。使用也是一模一样的使用方法
- 不同点:
- 出现的时机不同【StringBuffer是早期出现】
- StringBuffer是线程安全的,效率是低的
- StringBuilder是线程不安全的,效率高。【使用效率高的】
- StringBuffer自学内容【参考我今天的StringBuilder】