(9)字符串的其他的功能
public static void main(String[] args) { String s=" Baba.Mama.gotowork ";// split(String regex) 按照给定的正则表达式拆分字符串成为数组 String[] s1=s.split("\\.");//必须是符号才可以,而且最好都加上\\ for (String s2 : s1) { System.out.println(s2); }// replace(char oldChar, char newChar) 用新字符替换字符串中指定旧字符 String s3=s.replace('a','o'); System.out.println(s3);// replace(CharSequence target, CharSequence replacement) 用新子字符串替换字符串中指定旧子字符串 String s4=s.replace("work","atrip"); System.out.println(s4);// trim() 去掉字符串中前后的空格不能去掉中间的空格 String s5=s.trim(); System.out.println(s5); }
练习题:
需求:找出下面字符串中li的数量
"liasdflihsdhllihsdflihsdfiligsdfglikhsdfklilisdflio"
/*需求:找出下面字符串中li的数量 "liasdflihsdhllihsdflihsdfiligsdfglikhsdfklilisdflio"*/public class Homework2 { public static void main(String[] args) { String s="liasdflihsdhllihsdflihsdfiligsdfglikhsdfklilisdflio"; int sum=0; int i=s.indexOf("li"); //当索引大于字符串长度的时候会返回-1 while(i!=-1){ sum++; i=s.indexOf("li",i+2); } /*char[] s1=s.toCharArray(); for (int i = 0; i < s1.length; i++) { if(s1[i]=='l'&&s1[i+1]=='i'&&i+1
练习题2:
定义一个方法,传入字符串格式(idcard:name:age:gender)的分隔形如
“120384722312901:kexin:20:1|3219212131312:hantao:22:1|120121121312:zhangmeiling:21:2”,将该字符串分解,将属性赋给定义的Person类的对象上并且输出。
提示:创建每个Person对象,每个对象都有idcard、name、age、gender属性
public class Person { private String idcard; private String name; private int age; private int gender; public void setIdcard(String idcard) { this.idcard = idcard; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void setGender(int gender) { this.gender = gender; } public String getIdcard() { return idcard; } public String getName() { return name; } public int getAge() { return age; } public int getGender() { return gender; } public Person() { } public Person(String idcard, String name, int age, int gender) { this.idcard = idcard; this.name = name; this.age = age; this.gender = gender; } @Override public String toString() { return "Person{" + "idcard='" + idcard + '\'' + ", name='" + name + '\'' + ", age='" + age + '\'' + ", gender='" + gender + '\'' + '}'; }}
import java.util.Arrays;public class Homework3 { /*定义一个方法,传入字符串格式(idcard:name:age:gender)的分隔形如“120384722312901:kexin:20:1|3219212131312:hantao:22:1|120121121312:zhangmeiling:21:2”, 将该字符串分解,将属性赋给定义的Person类的对象上并且输出。 提示:创建每个Person对象,每个对象都有idcard、name、age、gender属性*/ public static void main(String[] args) { String str="120384722312901:kexin:20:1|3219212131312:hantao:22:1|120121121312:zhangmeiling:21:2";// 以|为分隔把对象分开变成数组 String[] sc=str.split("\\|"); Person[] ps=new Person[3]; for (int i = 0; i < sc.length; i++) { //以:为分隔将个人属性拆到一个数组 String[] s=sc[i].split("\\:"); //创建一个Person对象 Person p=new Person(); //将数组中的属性赋值给这个人 p.setIdcard(s[0]); p.setName(s[1]); //Integer.parseInt(String str)将字符串转化整数 p.setAge(Integer.parseInt(s[2])); p.setGender(Integer.parseInt(s[3])); System.out.println(p); ps[i]=p; } //数组的打印 System.out.println(Arrays.toString(ps)); }}
1.lang下面的类都不需要引入就可以直接使用,String不需要引入就可以使用,String类被final修饰了不能被继承
2.==:
基本数据类型:比较的是值;
引用数据类型:比较的是地址
equals针对的是object的对象或者子类的对象,基本数据类型不是类不能用equals,equals可以比较的两个对象的业务含义判断两个对象是否相等(通过方法覆写定义业务规则)
3.数组并不是对象不是类
4.String下有覆写父类equals的方法,通过equals比较的是两个String的值不是地址,其他的类中没有覆写equals方法的调用equals比较的是地址
61.可变字符串
(1)String一旦被创建后,值不能改变,如果参与了操作,引用发生了变化,不是在原有的字符串上操作,而是新产生了一个字符串
StringBuffer创建后值可以变化(增删改),地址不会有变化,不会产生新的字符串。
public class StringBufferDemo { public static void main(String[] args) { StringBuffer s=new StringBuffer("我要吃"); StringBuffer s1=s.append("红烧肉"); System.out.println(s); System.out.println(s1); System.out.println(s==s1); }}
(2)可变字符串是线程安全的
多个线程同时操作同一个资源的时候,可能发生数据安全性的问题。
StringBuffer是线程同步的(线程安全的),但是牺牲了性能。
synchronized ,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
(3)StringBuffer构造器
public class StringBufferDemo1 { public static void main(String[] args) { //创造一个可变字符,默认容量是16个字符 StringBuffer s1=new StringBuffer(); StringBuffer s2=new StringBuffer(16); StringBuffer s3=new StringBuffer("God"); System.out.println(s1.capacity()); System.out.println(s3.capacity()); //追加的时候如果超出了16个会自动的扩容 s3.append("dhjgbduhcgcgauandjkhliuw"); System.out.println(s3.capacity()); }}
(4)StringBuffer的API
可变字符串的追加返回的都是这个可变字符串的本身的引用,所以通过链式方式来追加代码。
public class StringBufferDemo2 { public static void main(String[] args) { StringBuffer s=new StringBuffer();//链式追加 s.append(true) .append(2) .append('K') .append(1.2f) .append("没有一点点防备") .append(3.4) .append(new Student("小明",8)); System.out.println(s); }}
public class StringBufferDemo3 { public static void main(String[] args) { StringBuffer s=new StringBuffer("wonderfulyou"); //在字符串中索引为6的位置插入why s.insert(6,"why"); System.out.println(s); }}
public class StringBufferDemo4 { public static void main(String[] args) { StringBuffer s=new StringBuffer("wonderfulyou"); //删除索引处的字符 s.deleteCharAt(3); System.out.println(s); //删除索引范围内的字符串,包头不包尾 s.delete(6,9); System.out.println(s); }}
public class StringBufferDemo5 { public static void main(String[] args) { StringBuffer s=new StringBuffer("wonderfulyou"); //用指定的字符串替换指定索引范围内的子字符串 s.replace(9,12,"me"); System.out.println(s); //字符串的倒置 s.reverse(); System.out.println(s); }}
public class StringBufferDemo6 { public static void main(String[] args) { StringBuffer s=new StringBuffer("hoohwoowmoomgxs"); //检索指定字符串最后一次出现的索引 int i =s.lastIndexOf("oo"); System.out.println(i); //从开始到指定索引处的子字符串中检索指定字符串最后一次出现的索引 int j=s.lastIndexOf("oo",8); System.out.println(j); }}
62.Random随机数产生类
可以自己定义一些获取随机的整数的规则
import java.util.Random;public class RandomTest { public static void main(String[] args) { Random r=new Random(); //获得一组随机数,每次运行随机数都不一样 for (int i=0;i<10;i++) { int n= 0; n = r.nextInt(); System.out.println(n); } //在0-100之间取一组随机数 for (int i = 0; i < 10; i++) { int n=r.nextInt(100); System.out.println(n); } }}
import java.util.Random;public class RandomTest1 { public static void main(String[] args) { //通过指定种子的随机数对象来获得一组不变的数据 Random r1=new Random(3); for (int i = 0; i < 10; i++) { int n=0; n = r1.nextInt(); System.out.println(n); } //在0-1000之间取一组随机数 for (int i = 0; i < 10; i++) { int n=0; n = r1.nextInt(1000); System.out.println(n); } }}
应用场景:验证码、文件命名
63.System类(了解)
public static void main(String[] args) { Scanner s=new Scanner(System.in); System.out.println();}
import java.util.Arrays;public class SystemDemo1 { public static void main(String[] args) { // arraycopy(Object src, int srcPos, Object dest, int destPos, int length) int[] arr={11,22,33,44,55,66,77}; int[] arr1={001,002,003,004,005}; /* @param src the source array. * @param srcPos starting position in the source array. * @param dest the destination array. * @param destPos starting position in the destination data. * @param length the number of array elements to be copied. 需要复制插入的数组,从插入数组的索引出开始,目标数组,从目标数组的索引处开始插入,插入的位数*/ System.arraycopy(arr,2,arr1,1,3); System.out.println(Arrays.toString(arr1)); }}
public class SystemDemo2 { public static void main(String[] args) { int[] s1={12,344,566,32,45}; long start=System.currentTimeMillis(); method(s1); long end=System.currentTimeMillis(); System.out.println("程序运行的时间是:"+(end-start)+"毫秒"); System.exit(1);//只要status不为0就是正常中止 } public static void method(int[] arr){ for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } }}
import java.util.Properties;import java.util.Set;public class SystemDemo3 { public static void main(String[] args) { //获得当前的系统属性 Properties p=System.getProperties(); //System.out.println(p); Set