Loading... # String类(续) ## 常见功能 ### 转换功能 ```java byte[] getBytes() char[] toCharArray() String toLowerCase() String toUpperCase() String concat(String str) ``` ```java package top.zunmx.u1; // ALC-Master public class Demo1 { public static void main(String[] args) { String str="中国你好China123"; String str1="测试拼接字符串"; byte[] bys = str.getBytes(); for (int i = 0; i < bys.length; i++) { System.out.print(bys[i]+" "); }System.out.println(); for (int i = 0; i < bys.length; i++) { System.out.print((char)bys[i]+" "); }System.out.println(); char chs[] = str.toCharArray(); System.out.println(chs); for(int i = 0 ; i <chs.length;i++) { System.out.print(chs[i]+" "); }System.out.println(); System.out.println(str.toLowerCase()); System.out.println(str.toUpperCase()); System.out.println(str.concat(str1)); } } ``` 其它功能 ```java String trim(); String replace(CharSequence target, CharSequence replacement); //CharSequence 包含String ``` # Scanner类 ```java import java.util.Scanner; ``` ## 构造方法 ```java public Scanner(InputStream source) //平常使用的Scanner sc = new Scanner(System.in); 就是此构造方法 ``` ## 常见方法 可以分为两大类:nextXxx和hasNextXxx 例如: ``` String next() boolean nextBoolean() byte nextByte() double nextDouble() float nextFloat() int nextInt() String nextLine() long nextLong() short nextShort() short nextShort(int radix) ``` 接收字符串 ``` next() // tab 换行 空格作为结束标志 nextLine() // 换行作为结束标志 ``` 注意:每一个数据的录入都有一个hasNextXxx来判断是否为相应类型的输入,返回值为布尔型 ## 遇到的问题 先接收一个除nextLine之外方法,再用nextLine进行接收的话,会在接受完第一个数据后直接停止,而nextLine没有接收到数据。 键盘录入会将我们录入的数据存入到一块内存中,通过next这种方法来从这个内存中获取。 比如:nextInt 现存如内存中的数据是666/r 后面再来一个nextInt的话,这个nextInt会扫描到内存中的剩余的/r(因为nextInt并不以回车作为结束的标志,所以这个nextInt会不管这个/r,而继续进行录入) ### 解决问题 1. 先用一个nextLine接收之前的换行,在用一个nextLine接收数据 2. 再创建一个Scanner对象,用来接收nextLine数据 3. 用next方法来替换nextLine # Math类 java.lang 包下,因此不需要import Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。 ## 常见方法 ``` abs 绝对值 sqrt 平方根 cbrt 立方根 floor 返回值小于等于参数,并等于某个整数。 eceil 返回值大于等于参数,并等于某个整数。 max 返回最大值 min 返回最小值 random 返回一个[0,1)之前的double型随机数 round 四舍五入 ``` ## 常量 ``` PI 圆周率 E 自然对数的底数 ``` # System类 java.lang 包下,因此不需要import ## 静态变量 ``` System.in 标准输入流,关联到键盘,键盘录入的内容 System.out 标准输出流,关联到控制台,用于打印。 System.err 标准错误六,也能打印在控制台,红色 ``` ## 常见方法 ``` currentTimeMiles 返回当前的时间戳 gc 强制垃圾回收 ``` # StringBuilder StringBuilder是在java.lang包下的,所以不用到包就可以直接使用 一个可变的字符序列。不同步(没有加锁的),效率会高一点 主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据 ```java StringBuilder(); //创建一个容量为16的StringBuilder对象 StringBuilder(CharSequence seq); //创建一个指定容量的SB对象 StringBuilder(String str); //创建一个指定字符串的SB,容量为16+传入字符串长度 ``` ## 常见功能 ### 添加或插入功能 ``` append(text) insert(index,text) ``` 注意:StringBuilder可以扩容,如果默认容量为16,那么在第一次扩容时会变成16*2+2,后续如果再超过这个长度,那么SB的容量就和字符串长度保持一致。 ### 删除功能 ``` deleteCharAt(index) delete(begin,end) ``` 注意:delete包括左不包括右,end值可以大于length,不会报错,但是后面的没有意义。 ### 替换和反转 ``` replace(begin,end,text) reverse() ``` ### 查询功能 ``` indexOf(str) ``` ``` length() 获取字符串长度 capacity() 获取StringBuilder容量的方法 ``` ## StringBuilder/StringBuffer 区别: > 1. 出现的版本不同 > > StringBuilder 1.5 > > StringBuffer 1.0 > > 2. 安全性不同 > > StringBuilder 不同步 > > StringBuffer 同步 > > 3. 效率不同 > > StringBuilder 高 > > StringBuffer 低 ## StringBuilder和String当作参数传递 ![image-20201130151344293.png][1] # 包装类类型 之前学习的基本数据类型只能做一些简单的运算,一旦涉及到比较复杂的运算的时候,就无能为力了。但是我们知道方法中时可以帮助我们完成这些复杂的操作的,但是基本数据类型是没有方法的,只有引用数据类型才有方法。所以java给基本数据类型都通过了一个对应的引用数据类型。这种类型也被我们称为包装类型。 基本数据类型 包装类类型 - byte[Byte] - short[Short] - long[Long] - float[Float] - double[Double] - boolean[Boolean] - int[Integer] - char[Character] ## Integer 构造方法 ```java Integer(int value) Integer(String s) ``` 常见方法 ```java int intValue(); static Integer valueOf(int i); static Integer valueOf(String s); static Integer toBinaryString(int i); static Integer toOctalString(int i); static Integer toHexString(int i); static int parseInt(String s); static String ValueOf(int i, int radix); //进制 ``` # 自动装箱拆箱现象 + 装箱:将基本数据类型通过构造或者方法提升为其对应的包装类类型 + 拆箱:将包装类类型通过构造或者方法将为其对应的基本数据类型 + 自动装箱:将基本数据类型通过构造或者方法提升为其对应的包装类类型 + 自动拆箱:将包装类类型通过构造或者方法将为其对应的基本数据类型 # 正则表达式 能匹配一系列字符串的较短的特殊字符串 java.util.regex.Pattern 需要导包 ## 常见规则 ### 字符 ``` x 字符 x \\ 反斜线字符 ``` ### 字符类 > 对字符集进行了升级,一次可以表达多个规则,但是一次还是只能匹配单个字符 ``` [abc] a、b 或 c(简单类) [^abc] 任何字符,除了 a、b 或 c(否定) [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) ``` ### 预定义字符类 > 之前的字符类写的太多,那么我们可以把他们简单化,简单化就是预定义字符类。也是只能匹配单个字符 ``` . 任何字符(与行结束符可能匹配也可能不匹配) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w] ``` ### 数量词 > 以上都是只能匹配单个字符,但是加上数量词之后就可以匹配多个字符了 ``` X? X,一次或一次也没有 X* X,零次或多次 X+ X,一次或多次 X{n} X,恰好 n 次 X{n,} X,至少 n 次 X{n,m} X,至少 n 次,但是不超过 m 次 ``` ## 常见功能 结合字符串中方法 ### 判断功能 ```java boolean matches(String regex); //告知此字符串是否匹配给定的正则表达式 ``` > ```java > public class Demo4 { > public static void main(String[] args) { > String regex = "1[3589]\\d{9}"; > System.out.println("输入一个手机号:"); > String phone = new Scanner(System.in).next(); > System.out.println(phone.matches(regex)); > } > } > ``` ### 分割功能 ```java String[] split(String regex); //根据给定正则表达式的匹配拆分此字符串 ``` ### 替换功能 ```java replaceAll(String str1,String str2); replaceFirst(String str1,String str2); ``` # 集合 > 集合和数组都是一个容器,集合只能用来存储引用数据类型 > > 集合和数组的区别 | 区别 | 数组 | 集合 | | -------- | -------------------------- | ------------ | | 存储类型 | 基本数据类型、引用数据类型 | 引用数据类型 | | 长度 | 长度声明好就不能改变 | 可以动态增减 | ```mermaid graph LR A[Collection]-->B[List] B-->C[ArrayList] B-->D[LinkedList] A-->E[Set] E-->F[HashSet] F-->G[LinkedHashSet] ``` # Colleaction接口 > Collection 层次结构中的根接口 > > 一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。 ## 添加功能 ```java boolean add(Object e) ; //添加一个元素 boolean addAll(Collection c); //添加一个组 ``` ## 删除功能 ```java boolean remove(Object o); //移除一个元素 boolean removeAll(Collection<?> c) //移除一个组 void clear(); //清空 ``` ## 判断功能 ```java boolean contains(Object o); //是否包含那个元素 boolean containsAll(Collection c); //是否包含那个组 boolean isEmpty(); //是否为空 ``` # 长度和转数组功能 ```java int size(); //长度 Object[] toArray(); //转数组 ``` # 迭代器iterator 迭代器是和具体的对象绑定的 ```java Iterator<E> iterator() ;//返回在此collection的元素上进行迭代的迭代器 ``` ```java package top.zunmx.d2; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; // ALC-Master class Student { String name; int age; public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [name=" + name + ", age=" + age + "]"; } } public class Demo1 { public static void main(String[] args) { Collection<Object> c = new ArrayList(); Student s = new Student("Jack Ma", 50); Student s1 = new Student("Tony Ma", 49); Student s2 = new Student("BG Ma", 69); c.add(s); c.add(s1); c.add(s2); System.out.println(c); System.out.println("<--------------------------->"); /* * 第一种遍历 */ Object[] obj = c.toArray(); for (int i = 0; i < obj.length; i++) { System.out.println(obj[i]); } System.out.println("<--------------------------->"); /* * 第二种遍历 迭代器 */ Iterator it = c.iterator(); while (it.hasNext()) { System.out.println(it.next()); } /* * ??? */ System.out.println("<------------3--------------->"); Iterator it1 = c.iterator(); while (it1.hasNext()) { Student sit = (Student) (it1.next()); System.out.println(sit.getName() + "-----" + sit.getAge()); } } } ``` ## 求交集retainAll 谁调用谁改变 ```java boolean retailAll(Collection c);// 仅保留此collection中那些也包含在指定collection的元素 ``` 返回值:本身是否改变。 ## 使用集合的步骤 1. 创建集合对象 2. 创建元素对象[引用数据类型] 3. 将元素对象添加到集合对象中 4. 遍历集合 + toArray() + 迭代器 + 通过Iterator 方法获取迭代器对象 + 通过Iterator.hasNext方法判断是否可以继续迭代 + 通过Iterator.next方法获取元素 # List接口 有序的Collection(序列),此处的有序是插入的有序性。 可以通过索引访问,元素允许重复 ## 特有功能 ```java void add(int index, Object element);// 指定位置添加指定元素 Object get(int index) ;//获取指定位置的元素 Object remove(int index) ;//一处列表中指定位置的元素 Object set(int index, E element);// 用指定元素替换列表中指定位置的的元素 ``` ```java package top.zunmx.d3List; import java.util.List; import java.util.ArrayList; import java.util.Iterator; // ALC-Master public class Demo { public static void main(String[] args) { List<Object> li = new ArrayList<Object>(); li.add("hello"); li.add("world"); li.add("java"); li.add(0, "java"); System.out.println(li); Iterator<Object> iterator = li.iterator(); // 遍历 while (iterator.hasNext()) { System.out.println(iterator.next()); } System.out.println("*************");// 获取 System.out.println(li.get(0)); System.out.println(li.get(2)); System.out.println("*************");// 遍历List的第三种方式 for (int i = 0; i < li.size(); i++) { System.out.println(li.get(i)); } System.out.println("*************"); // 移除返回的是移除的内容 System.out.println(li.remove(0)); System.out.println(li); System.out.println("*************"); //替换 li.set(0, "你好"); System.out.println(li); } } ``` 注意: > 出现问题的原因: > 1.迭代器对象是属于某一个集合的,既然能通过迭代器获取到集合中的每一个元素, > 那就证明迭代器中包含了集合中的所有元素的内容。 > 2.迭代器是先获取集合中的内容,然后再进行迭代的。 > 3,遍历迭代器的同时又给原来的集合中添加了内容。(原集合是知道添加了元素的,但是因为迭代器对象是已经获取过的,迭代器对象并不知道添加了内容,所以再去遍历的时候就发生了错误) > 4.总结:迭代器对象和原集合对象不同步。 ## ListIterator List本身的迭代器 提供了previous方法,使指针前移 ```java public static void main(String[] args) { List<Object> li = new ArrayList<Object>(); li.add("hello"); li.add("world"); li.add("java"); ListIterator<Object> lit = li.listIterator(); while (lit.hasNext()) { System.out.println(lit.next()); } while (lit.hasPrevious()) { System.out.println(lit.previous()); } } ``` [1]: https://www.zunmx.top/usr/uploads/2021/04/3519468362.png © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏