本文已参与「新人创作礼」活动,一起开启掘金创作之路。
二、字符串
2.1 字符串的简介
2.2 字符串与基本数据类型的转换
2.2.1 基本数据类型转型字符串类型
概念:基本数据类型,转成字符串,希望得到的结果是这个数值转成字符串的样式。其实,就是直接给这个数值添加上双引号。
方式一:可以利用字符串拼接运算符完成。当加号两端有任意一方是字符串的时候,此时都会自动的把另一方也转成字符串,完成字符串的拼接,所以,当需要把一个基本数据类型的数据转成字符串的时候,只需在另一端拼接上一个空的字符串即可。
int a = 10;
String str = a + "";
[推荐使用] 方式二:使用字符串的静态方法 valueOf 完成
String str = String.valueOf(10);
方式三:借助包装类的实例方法 toString 方法
String str = Integer.valueOf(10).toString();
方法四:借助包装类的静态方法 toString 方法
String str = Integer.toString(10);
2.2.2 字符串类型转型基本数据类型
概念:字符串类型转基本数据类型,其实就是解析出这个字符串中的内容,转型成对应的基本数据类型的表示。
**注意事项一:**基本数据类型转字符串肯定是没有问题的,但是由字符串转基本数据类型的时候,可能会出现问题,字符串中的内容,不一定能够转成希望转换的基本数据类型。
**注意事项二:**对于整数而言,字符串中如果出现了其他的非数字的字符,都会导致转整型失败,即便是小数点,也不可以转。这里并没有转成浮点数字,再转整数的过程。
方式一:使用包装类的静态方法 valueOf() 方法。
Integer num = Integer.valueOf("123");
方式二:使用包装类的静态方法 parsexxx 方法。这里的xxx就是要转换的基本数据类型。
int num = Integer.parseInt("123");
注意:如果希望直接转成基本数据类型;推荐使用方式二 ,如果希望转成包装类型,推荐使用方式一。
字符串类型,没有类似于上面的方式,可以直接转成字符串类型。如果一个字符串,要转成字符,需要使用字符串的一个实例方法 charAt() 方法。使用这个方法,获取字符串中的指定下标位的字符。
2.2.3 字符串中常用的静态方法
| 返回值 | 方法 | 描述 |
|---|---|---|
| String | join() | 将若干个字符串拼接到一起,在拼接的时候,元素与元素之间以指定的分隔符进行分隔。 |
| String | format() | 以指定的格式,进行字符串的格式化 |
package com.laity.basicSyntax.day7.fString;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.laity.basicSyntax.day7.fString
* @date Date : 2021年12月09日 9:55
* @Description: 字符串的静态方法
*/
public class StringStaticMethod {
public static void main(String[] args) {
// join
// delimiter 拼接时的分隔符 ""/","/...
String join = String.join("", "hello", "word", "laity");
System.out.println(join);
// format
// 以指定的格式,进行字符串的格式化
String name = "laity";
int age = 18;
char gender = '男';
/**
* 常见占位符 :%s %d %c %f
* %ns :凑够n位字符串,如果不够,补空格
* %nd :凑够n位,如果不够补空格
* %.nf :保留小数点后面指定位的数字
*/
System.out.println(String.format("姓名:%s,年龄:%d,性别:%c", name, age, gender));
// 格式化打印 手动添加换行
System.out.printf("姓名:%s,年龄:%d,性别:%c \n", name, age, gender);
}
}
2.2.4 StringBuffer和StringBuilder类
**概念:**都是用来操作字符串的类
// StringBuffer与StringBuilder完全一样
package com.laity.basicSyntax.day7.gStringBuffer;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.laity.basicSyntax.day7.gStringBuffer
* @date Date : 2021年12月09日 10:14
* @Description:
*/
public class StringBufferUsage {
public static void main(String[] args) {
// 构造方法
// 1.操作一个空字符串的StringBuffer的对象
StringBuffer sb = new StringBuffer();
// 2.
StringBuffer sb1 = new StringBuffer("HELLO");
// 3. 增:拼接字符串
sb1.append("123");
// 4. 增:指定位置添加
sb1.insert(3, "2");
// 5. 删:删除指定范围的数据
sb1.delete(7,9);
// 6. 删:删除指定下标的字符
sb1.deleteCharAt(3);
// 7. 改:替换指定部分的字符
sb1.replace(0,4,"laity");
// 8. 改:替换指定位的字符
sb1.setCharAt(5,'-');
System.out.println(sb1);
// 9. 反转:前后倒置
sb1.reverse();
}
}
区别
- StringBuffer是线程安全的
- StringBuilder是线程不安全的
使用场景:
- 当处于多线程的环境中,多个线程同时操作这个对象,此时使用StringBuffer。
- 当没有处于多线程环境中,只有一个线程来操作这个对象,此时使用StringBuilder。
执行效率:StringBuilder > StringBuffer > String
三、泛型
2.1 什么是泛型、为什么用泛型?
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?
顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),
然后在使用/调用时传入具体的类型(类型实参)。
泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,
操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
2.2 泛型类
泛型类也就是把泛型定义在类中,这样用户在使用类的时候才把类型给确认下来。
具体的方法就是使用<>加上一个未知数,通常用 K T V 等大写字符表示,事实上只要是个单词就可以。
// 1.解决程序安全问题(要是有错误,编译时期就会报错)
<大写的字母>
// 泛型的好处
1.在集合中,限制存储元素的类型,不用再使用元素的时候,逐个元素进行类型检查。
2.可以提高代码的可读性。
3.可以使某些发生在运行时期的错误,提前到编译时期。
// 泛型的定义方式
泛型,是定义在一对尖括号中的。在尖括号里面定义一个类型。此时,定义在这一对尖括号中的类型,就是泛型。
泛型,是一个标识符,遵循大驼峰命名法。
泛型,一般情况下,不用太长的类型来描述,一般情况下,只需要使用一个字母代替即可。
如果需要定义多种泛型,直接在尖括号中定义,泛型和泛型之间用逗号隔开。
泛型在类中的使用:在类名的后面,紧跟一对尖括号。
class Dog <T,M> {} // 一个或者多个参数
2.3 集合
// 概念:集合和数组非常类似,是一个数据容器,用来存储引用数据类型的数据。在java中,集合不是泛指某一个类,而是若干个类组成的数据结构的实现。
// 集合的特点:
集合类这种框架是高性能的。对基本类集(动态数组、链接表、树和散列表)的实现是高效率的。
集合类允许不同类型的集合以相同的方式和高度互操作方式工作。
集合类容易扩散和修改,程序员可以很容易地稍加修改就能满足自己的数据结构需求。
// 集合和数组的区别
1.数组是固定长度的,而集合不是固定长度。
2.数组中可以存储基本数据类型的数据,也可以存储引用数据类型的数据。
3.集合中只能存储引用数据类型的数据,基本数据类型的数据需要进行装箱,才能存入集合中。
// java中的集合,大致分为两类,分别是Collection集合和Map集合。
其中,Collection是单列集合的顶级接口,Map接口是双列集合的顶级接口。
2.3.1 Collection接口
package com.laity.basicSyntax.day2.generic;
import java.util.ArrayList;
import java.util.Collection;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.laity.basicSyntax.day2.generic
* @date Date : 2021年11月15日 17:35
* @Description: Collection接口
*/
public class Demo1 {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
Collection<String> temp = new ArrayList<>();
collection.add("Tom");
collection.add("Laity");
collection.add("Lily");
collection.add("王五");
collection.add("李明");
collection.add("Jge");
temp.add("张三");
temp.add("J哥");
collection.addAll(temp); // addAll()
collection.removeAll(temp); // removeAll()
collection.remove("Tom"); // 删除指定的名称
// matches 正则表达式
collection.removeIf(element -> element.matches("L.*")); // removeIf 满足条件的进行删除 element是接收变量
// collection.retainAll(temp); // retainAll 在 temp出现的元素会被留下 没有被出现的会被删掉
// collection.clear(); // 清空集合
// 判断结合是否包含某一元素
boolean flag = collection.contains("Laity");
System.out.println("判断结合是否包含某一元素" + flag);
int size = collection.size(); // 集合中元素的个数
System.out.println("集合中元素的个数:" + size);
boolean empty = collection.isEmpty(); // 判断集合是否为空
System.out.println("判断集合是否为空:" + empty);
Object[] obj = collection.toArray(); // 集合转数组
for (Object o : obj) {
System.out.println("集合转数组(循环遍历):" + o);
}
// System.out.println(Arrays.toString(obj));
System.out.println(collection);
}
}
2.3.2 Collection集合的遍历
package com.laity.basicSyntax.day2.generic;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.laity.basicSyntax.day2.generic
* @date Date : 2021年11月15日 18:02
* @Description: 集合的遍历
*/
public class Demo2 {
public static void main(String[] args) {
Collection<String> collection = new ArrayList<>();
collection.add("Tom");
collection.add("Laity");
collection.add("J哥");
// iterator接口的使用
Iterator<String> iterator = collection.iterator();// 迭代器对象
// 通过迭代器遍历这个集合
while (iterator.hasNext()) {
String str = iterator.next();// 通过next得到下一个元素
System.out.println(str);
}
JDK1_8(collection);
// str(collection);
}
/**
* JDK1.8之后的新遍历方法
*
* @param collection
*/
public static void JDK1_8(Collection<String> collection) {
collection.forEach(element -> System.out.println(element));
}
/**
* 增强的for循环
*
* @param collection 被遍历的集合
*/
public static void str(Collection<String> collection) {
for (String str : collection) {
System.out.println(str);
}
}
}
2.3.3 List集合
package com.laity.basicSyntax.day2.generic;
import java.util.ArrayList;
import java.util.List;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.laity.basicSyntax.day2.generic
* @date Date : 2021年11月15日 19:16
* @Description: List的API(它是Collection的子)
*/
public class Demo3 {
public static void main(String[] args) {
List<String> list = new ArrayList();
list.add("laity");
list.add("王宏");
list.add("王卫");
list.add("王高");
// 在下标为1的位置添加一个元素
list.add(1, "王五");
System.out.println(list);
// 有些方法和Collection的都相同就不做演示了
// addAll();
// remove();
// set() 修改
list.set(2, "J哥");
System.out.println(list);
// replaceAll
// list.replaceAll(element -> element.concat("aa")); // 参数是一个接口类型的 concat()字符串的连接 aa 字符串
// System.out.println(list);
String s = list.get(0); // 通过get获取指定的元素
System.out.println(s);
int index = list.indexOf("王高"); // indexOf 获取指定元素的下标
index = list.lastIndexOf("王高"); // 最后出现该元素的下标
System.out.println(index);
List<String> list1 = list.subList(1, 3); // subList截取元素返回的仍然是List
System.out.println(list1);
}
}
// List集合的排序
方法原型: sort()
package com.laity.basicSyntax.day2.generic;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.laity.basicSyntax.day2.generic
* @date Date : 2021年11月15日 20:07
* @Description: List集合的排序
*/
public class Demo4 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("laity");
list.add("王宏1");
list.add("王卫11");
list.add("王高");
// list.sort(new MyCompare());
// list.sort((e1, e2) -> e1.length() - e2.length()); 从短到长
list.sort((e1, e2) -> e2.length() - e1.length()); // 从长到短
list.forEach(ele -> System.out.println(ele));
}
}
class MyCompare implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
}
四、正则表达式
每个语言都有

package com.laity.basicSyntax.day8.aRegex;
/**
* @author : Laity
* @Project: JavaLaity
* @Package com.laity.basicSyntax.day8.aRegex
* @date Date : 2021年12月09日 19:32
* @Description: 正则表达式的语法
*/
public class RegexSyntax {
public static void main(String[] args) {
basicSyntax1();
}
/**
* 正则表达式的基础语法规则
*/
public static void basicSyntax1(){
boolean flag = "hello".matches("hello");
System.out.println(flag);
}
}
matches
^ $ a-z A-Z 0-9 \\ . .* .*? +
?:前面的一位或者一组字符,连续出现了一次或零次
+:前面的一位或者一组字符,连续出现了一次或多次
*:前面的一位或者一组字符,连续出现了任意的次数(包括0次,一次和多次)
{m} :前面的一位或者一组字符,连续出现了m次
{m.}:前面的一位或者一组字符,连续出现了至少m次,最多不限制
{m, n}:前面的一位或者一组字符,连续出现了至少m次,最多n次
public static void example() {
// 1. QQ号码的验证
System.out.println("1400017254".matches("^[1-9][0-9]{5,11}"));
// 2. 验证一个邮箱是否是一个qq邮箱
System.out.println("1400017254@qq.com".matches("^[1-9]\\d{5,11}@qq\\.com"));
// 3. 验证一个手机号是否是一个手机号
System.out.println("13434345656".matches("^1[356789]\\d{9}"));
}
/**
* 切割
*/
public static void example2() {
// 可以将一个字符串,按照指定的规则部分,切割成若干段
String names = "Laity lily Kitty Tom Lucy";
// 可以按照空格进行切割
String[] s = names.split(" +");
System.out.println(Arrays.toString(s));
}
/**
* 正则表达式的替换
*/
public static void replaceTest() {
// 1.准备一个字符串
String names = "Laity lily Kitty Tom Lucy";
String s = names.replaceAll(" {2,}", ",");
System.out.println(s);
}
names.replaceFirst() // 只替换第一个匹配的
// 需求 : 结果为 132****4545
public static void replaceTest2() {
String tip = "13234344545";
String tp = tip.replaceFirst("(\\d{3})(\\d{4})(\\d{4})", "$1****$3");
System.out.println(tp); // 132****4545
}