当前位置: 首页 > news >正文

学习JavaEE的日子 Day19 常用类

Day19

1.包装类的使用

理解:8种基本数据类型对应类

出现原因:

​ Java为纯面向对象语言(万物皆对象),8种基本数据类型不能new对象,

​ 就破坏Java为纯面向对应语言的特征,Java又为8种基本数据类型分别

​ 匹配了对应的类,这种类叫做包装类/封装类

8种基本数据类型对应包装类
基本数据类型包装类继承关系
byteByteObject.Number.Byte
shortShortObject.Number.Short
intIntegerObject.Number.Integer
longLongObject.Number.Long
floatFloatObject.Number.Float
doubleDoubleObject.Number.Double
charCharacterObject.Character
booleanBooleanObject.Boolean

注意:

​ 1.int的包装类的写法为Integer

​ 2.char的包装类的写法是:Character

​ 3.其余基本数据类型的包装类均是基本类型的首字母大写。

1.1 手动装箱

手动装箱:基本数据类型 -> 包装类

  int num = 100;Integer integer = Integer.valueOf(num);System.out.println(integer);  //打印出来是100,这个是字符串(String类型)

1.2 自动拆箱

手动拆箱:包装类 -> 基本数据类型

   Integer integer = new Integer(100);int num = integer.intValue();System.out.println(num);  //打印出来是100,这个是int类型

1.3 自动拆装箱

JDK1.5开始的新特性:自动拆装箱

自动装箱:基本数据类型 -> 包装类

  int num = 100;Integer integer = num;//底层实现:Integer.valueOf(num);System.out.println(integer);

自动拆箱:包装类 -> 基本数据类型

  Integer integer = new Integer(100);int num = integer;//底层实现:integer.intValue(); JVM自动封装System.out.println(num);

//将字符串转换为int值

  String str = "123";     //String str = "123aaaa"; 直接报错int num = Integer.parseInt(str);System.out.println(num);

1.4 深入Integer类的底层原理

面试题:描述Integer的valueOf底层实现原理

答:判断输入的int值是否在-128~127的区间内,

​ 如果在就从Integer的缓存类的缓存数组中获取对象,

​ 如果不在,就重新new Integer的对象

public class Test02 {public static void main(String[] args) {//面试题:描述下列代码的运行结果Integer integer1 = Integer.valueOf(100);Integer integer2 = Integer.valueOf(100);System.out.println(integer1 == integer2);//true   // ==  两个对象比较,不是100在比较,而是比较的是内存地址Integer integer3 = Integer.valueOf(200);Integer integer4 = Integer.valueOf(200);System.out.println(integer3 == integer4);//falseSystem.out.println("---------------------");//面试题解释如下:
//		Integer integer = new Integer(100);
//		System.out.println(integer);//100
//		int num1 = integer.intValue();
//		System.out.println(num1);//100
//		
//		MyInteger myInteger = new MyInteger(100);
//		System.out.println(myInteger);//100,不写下面的myInteger类的toString方法,就会打印全类名
//		int num2 = myInteger.intValue();
//		System.out.println(num2);//100MyInteger myInteger1 = MyInteger.valueOf(100);MyInteger myInteger2 = MyInteger.valueOf(100);System.out.println(myInteger1 == myInteger2);//trueMyInteger myInteger3 = MyInteger.valueOf(200);MyInteger myInteger4 = MyInteger.valueOf(200);System.out.println(myInteger3 == myInteger4);//false ( 200 不在-128,127中,就去new一个新的对象)}
}

手写Integer方法,看看底层代码

public class MyInteger {private int value;//将值传入到value中public MyInteger(int value) {this.value = value;}public int intValue(){return value;}//手动装箱public static MyInteger valueOf(int i){//判断 i 在不在缓存数组中(-128,127)if(i>=MyIntegerCache.low && i<=MyIntegerCache.high){//在,就把下标取出来return MyIntegerCache.cache[i + (-MyIntegerCache.low)];}//如果不在-128,127中,就去new一个新的对象return new MyInteger(i);}@Overridepublic String toString() {return String.valueOf(value);//将int值转换为字符串}//缓存类(内部类),设置private,不想让外部调用     private static class MyIntegerCache{private static final int low = -128;//低位private static final int high = 127;//高位private static final MyInteger[] cache;//缓存数组(-128~127的MyInteger的对象)//静态代码块static{//初始化缓存数组cache = new MyInteger[high - low + 1];//256int j = low;for (int i = 0; i < cache.length; i++) {cache[i] = new MyInteger(j++);}}}
}

将字符串转换为整数

练习:将一个字符串如”1,2,3,4,5,6”转换成一个整型数组信息列表

public class Main {  public static void main(String[] args) {  String str = "1,2,3,4,5,6";  String[] array = str.split(","); // 分割字符串为数组  int[] intArray = new int[array.length]; // 创建一个整型数组  for (int i = 0; i < array.length; i++) {  intArray[i] = Integer.parseInt(array[i]); // 将每个元素转换为整数  }  // 打印整型数组  for (int i : intArray) {  System.out.println(i);  }  }  
}

2.关于字符串类

分类:

​ 1.String

​ 2.StringBuffer

​ 3.StringBuilder

2.1 String的使用

理解:String是****不可变****类, 即一旦一个String对象被创建, 包含在这个对象中的字符序列是不可改变的, 直至该对象被销毁。

​ String类是final类,不能有子类。

注意:字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )

2.1.1 获得新字符串的常用方法(拼接+替换)

String concat(String str) 拼接字符串,并返回新的字符串

String subString(int beginIndex) 从开始下标处beginIndex截取到末尾,并返回新的字符串

public String toLowerCase() 转小写,并返回新的字符串

public String toUpperCase() 转大写,并返回新的字符串

public String trim() 去除首尾空格,并返回新的字符串

public String replace(char oldChar, char newChar) 替换字符,并返回新的字符串

public String replace(CharSequence target, CharSequence replacement) 替换字符串,并返回新的字符串

public String replaceAll(String regex, String replacement) 替换字符串,并返回新的字符串

public replaceFirst(String regex, String replacement) 替换第一次出现的字符串,并返回新的字符串

2.1.2 计算字符串长度的方法

public int length(); 返回字符串字符的个数。(从1开始)

2.1.3 字符串比较

equals() 比较两个字符串内容是否相同(区分大小写)(字符串类对此方法进行了重写)

equalsIgnoreCase() 比较两个字符串内容是否相同(不区分大小写)

== 比较两个字符串是否为同一对象,即在内存中的地址是否一样

startsWith() 判断字符串是否以某个字符串开头

endsWith() 判断字符串是否以某个字符串结尾

2.1.4 字符串查找

charAt(char ch) 获取字符串中指定下标的字符

indexOf(String str) 查找子字符串在此字符串第一次出现的下标,如果没找到,则返回 -1

lastIndexOf(String str) 查找子字符串在此字符串最后一次出现的下标

2.1.5 其他数据类型转成字符串

在String类中定义了一些静态的重载方法

public static String valueOf(…)可以将基本类型数据、Object类型转换为字符串。如:

​ public static String valueOf(double d) 把double类型数据转成字符串

​ public static String valueOf(Object obj) 调用obj的toString()方法得到它的字符串表示形式。

其他类型 + “”:加一个空字符串也是可以转成字符串

public class Test01 {public static void main(String[] args) {String str = "123abc";//底层:new char[]{'1','2','3','a','b','c'};str = str.concat("DEF123");//拼接字符串,并返回新的字符串str = str.substring(2);//从开始下标处截取到末尾,并返回新的字符串str = str.substring(1, 7);//从开始下标处(包含)截取到结束下标处(排他),并返回新的字符串str = str.toUpperCase();//转大写,并返回新的字符串str = str.toLowerCase();//转小写,并返回新的字符串str = "   123  abc DEF   123         ";str = str.trim();//去除首尾空格,并返回新的字符串str = str.replace('a', 'A');//替换字符,并返回新的字符串str = str.replace("Abc", "ABC");//替换字符串,并返回新的字符串str = str.replaceAll("ABC", "abc");//替换字符串,并返回新的字符串str = str.replaceFirst("23", "66");//替换第一次出现的字符串,并返回新的字符串str = str.replaceAll(" ", "");//去除空格(将空格字符串替换成空内容的字符串)int len = str.length();System.out.println("获取字符串的字符个数:" + len);System.out.println("判断两个字符串内容是否相同(区分大小写):" + str.equals("166abcDEF123"));//trueSystem.out.println("判断两个字符串内容是否相同(不区分大小写):" + str.equalsIgnoreCase("166ABCdef123"));//trueSystem.out.println("判断字符串是否以某个字符串开头:" + str.startsWith("166a"));//trueSystem.out.println("判断字符串是否以某个字符串结尾:" + str.endsWith("DEF123"));//trueSystem.out.println("查找子字符串在此字符串第一次出现的下标:" + str.indexOf("1"));//0System.out.println("查找子字符串在此字符串最后一次出现的下标:" + str.lastIndexOf("1"));//9System.out.println("获取字符串中指定下标的字符:" + str.charAt(6));//D//166abcDEF123System.out.println(str);System.out.println("-------------------------");//把其他类型转换为String类型System.out.println(String.valueOf(10));//int -> StringSystem.out.println(String.valueOf(11.11));//double -> StringSystem.out.println(String.valueOf(true));//boolean -> StringSystem.out.println(String.valueOf('A'));//char -> StringSystem.out.println("-------------------------");//把其他类型转换为String类型System.out.println(10 + "");//int -> StringSystem.out.println(11.11 + "");//double -> StringSystem.out.println(true + "");//boolean -> StringSystem.out.println('A' + "");//char -> String}
}

String练习题:
练习:完成一个邮箱格式的校验 hhy@qq.com
(1),“@”不能在第一位
(2),“.”不能在最后一位
(3),“@”和“.”中间应该有字符
(4),@.***
当然还有更严格的校验规则,我们此处考虑到这即可

	 String email = "hhy@qq.com";int indexOf1 = email.indexOf("@");int indexOf2 = email.indexOf(".");if(indexOf1==0 || indexOf2==email.length()-1 || indexOf2-indexOf1<=1){System.out.println("邮箱格式错误");}else{System.out.println("邮箱格式正确");}

注意:==号的作用

比较基本数据类型:比较的是具体的值

比较引用数据类型:比较的是对象地址值

2.2 StringBuffer

StringBuffer代表****可变****的字符序列。

StringBuffer称为字符串缓冲区,它的工作原理是:预先申请一块内存,存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列。

StringBuffer是可变对象,这个是String最大的不同

StringBuffer可以理解为一个字符串容器,可以动态的改变容器中的内容。

2.2.1 StringBuffer常用方法

append() 在末尾追加字符串

insert(int offset,String str) 将子字符串插入到此字符串指定下标的位置

setCharAt(int offset,char ch) 替换指定下标上的字符

replace(int start,int end,String str) //从开始下标处(包含)替换到结束下标处(排他)的字符串

deleteCharAt(int index) 删除指定下标上的字符

delete(int start,int end) 从开始下标处(包含)删除到结束下标处(排他)的字符串

reverse() 反转字符串

length() 确定Stringbuffer字符串的长度

public class Test02 {public static void main(String[] args) {StringBuffer sb = new StringBuffer();sb.append("123abc");//在末尾追加字符串sb.append("DEF123");//在末尾追加字符串sb.insert(6, "xyz");//将子字符串插入到此字符串指定下标的位置sb.setCharAt(6, 'X');//替换指定下标上的字符sb.replace(3, 9, "ABCABC");//从开始下标处(包含)替换到结束下标处(排他)的字符串sb.deleteCharAt(6);//删除指定下标上的字符sb.delete(3, 11);//从开始下标处(包含)删除到结束下标处(排他)的字符串sb.reverse();//反转字符串int len = sb.length();System.out.println("字符串长度为:" + len);//321321System.out.println(sb.toString());}
}

普及:

​ 因为StringBuilder是Java已经写好的类

​ java在底层对他做了一些特殊处理。

​ 打印对象不是地址值而是属性值。

2.3 StringBuilder

StringBuilder与StringBuffer的用法完全一致,唯一的区别是StringBuffer是线程安全的,而StringBuilder不是线程安全的。所以StringBuilder的性能要比StringBuffer要好。

单线程推荐使用StringBuilder,多线程使用StringBuffer。

2.3.1 StringBuilder常用方法

注意:在调用方法的层面上StringBuilder和StringBuffere是一样的

2.3.2 为什么需要StringBuilder及StringBuffer类

字符串的不变性:

一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符到String对象中。

您也许会使用+来串联字符串以达到附加新字符或字符串的目的,但+会产生一个新的String对象。

String s1 = “abc”;String s2 = “abc”;String s3 = s1+s2;

如果程序对这种附加字符串的需求很频繁,系统会频繁在内存中创建String对象,造成性能下降。所以并不建议使用+来进行频繁的字符串串联。应该使用java.lang.StringBuffer类。

public class Test03 {public static void main(String[] args) {StringBuilder sb = new StringBuilder();sb.append("123abc");//在末尾追加字符串sb.append("DEF123");//在末尾追加字符串sb.insert(6, "xyz");//将子字符串插入到此字符串指定下标的位置sb.setCharAt(6, 'X');//替换指定下标上的字符sb.replace(3, 9, "ABCABC");//从开始下标处(包含)替换到结束下标处(排他)的字符串sb.deleteCharAt(6);//删除指定下标上的字符sb.delete(3, 11);//从开始下标处(包含)删除到结束下标处(排他)的字符串sb.reverse();//反转字符串int len = sb.length();System.out.println("字符串长度为:" + len);//321321System.out.println(sb.toString());}
}

2.4 深入String – 面试题

常量池概念:

​ Java运行时会维护一个常量池, 常量池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。

public class Test04 {public static void main(String[] args) {//面试题:描述下列代码会创建几个String对象?//答案:1个(常量池中的数据不允许重复)//没有new对象,//只是记录字面值常量会在常量池中开辟一个对象:abc 0x01//所以只有1个
//		String str1 = "abc";
//		String str2 = "abc";
//		System.out.println(str1);
//		System.out.println(str2);//面试题:描述下列代码会创建几个String对象?//答案:3个(new了两个String对象 + "abc")//new 对象 会在堆中开辟内存空间:str1 0x001,str2 0x002//字面值常量会在常量池中开辟一个对象:abc 0x01//所以有3个String str1 = new String("abc");String str2 = new String("abc");System.out.println(str1);System.out.println(str2);}
}

关于字符串的小扩展:

1.字符串存储的内存原理

String s = “abc”;直接赋值

特点:

​ 此时字符串abc是存在字符串常量池中的。

​ 先检查字符串常量池中有没有字符串abc,如果有,不会创建新的,而是直接复用。如果没有abc,才会创建一个新的。

​ 所以,直接赋值的方式,代码简单,而且节约内存。

2.new出来的字符串

看到new关键字,一定是在堆里面开辟了一个小空间。

String s1 = new String(“abc”);

String s2 = “abc”;

s1记录的是new出来的,在堆里面的地址值。

s2是直接赋值的,所以记录的是字符串常量池中的地址值

2.5 深入String创建对象

两个常量在编译时直接拼接

两个常量在编译时直接拼接

有变量参与字符串拼接的情况,底层会创建StringBuilder进行拼接

​ new StringBuilder(String.value(s3)).append(s4).toString(); --> 先创建StringBuilder对象,再进行拼接

public class Test05 {public static void main(String[] args) {String str1 = "abc";String str2 = "abc";System.out.println(str1 == str2);//true//注意:两个常量在编译时直接拼接String str3 = "ab" + "c";//String str3 = "abc";System.out.println(str1 == str3);//true//注意:两个常量在编译时直接拼接final String s1 = "ab";   //常量final String s2 = "c";    //常量String str4 = s1 + s2;//String str3 = "abc";System.out.println(str1 == str4);//注意:有变量参与字符串拼接的情况,底层会创建StringBuilder进行拼接String s3 = "ab";  //变量String s4 = "c";  //变量String str5 = s3+s4;//new StringBuilder(String.value(s3)).append(s4).toString();System.out.println(str1 == str5);//false}
}

注意:

​ 常量:在程序执行过程中不可发生改变的量

​ 常量的分类:数字字面量、字面值常量、final修饰的变量

2.6.1 创建字符串对象两种方式的区别

通过构造方法创建

​ 通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同直接赋值方式创建

以“ ”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护

2.6 StringBuilder 和 StringBuffer的底层原理

注意:

​ 1.StringBuffer和StringBuilder都是继承的AbstractStringBuilder

​ 2.StringBuffer和StringBuilder的核心功能都是由父类使用

​ 3.StringBuffer在方法中上锁、解锁 – 在多线程下使用

​ 4.StringBuffer和StringBuilder相比,因为有了上锁和解锁的步骤,所以效率没有StringBuilder高

public class Test06 {public static void main(String[] args) {//StringBuilder的功能StringBuffer sb = new StringBuffer();sb.append("xxx");sb.append("yyy");sb.append("zzz");System.out.println(sb);		//StringBuilder的功能
//		StringBuilder sb = new StringBuilder();
//		sb.append("xxx");
//		sb.append("yyy");
//		sb.append("zzz");
//		System.out.println(sb);		}
}

AbstractStringBuilder底层代码

import java.util.Arrays;abstract class MyAbstractStringBuilder {//缓存数组char[] value;//存储字符个数int count;MyAbstractStringBuilder() {}MyAbstractStringBuilder(int capacity) {value = new char[capacity];}//获取字符个数public int length() {return count;}public MyAbstractStringBuilder append(String str) {//如果添加的字符串为nullif (str == null)return appendNull();int len = str.length();ensureCapacityInternal(count + len);str.getChars(0, len, value, count);count += len;return this;}//添加字符串为null的情况private MyAbstractStringBuilder appendNull() {int c = count;//判断是否扩容的方法ensureCapacityInternal(c + 4);//4 - "null".length()final char[] value = this.value;value[c++] = 'n';value[c++] = 'u';value[c++] = 'l';value[c++] = 'l';count = c;return this;}//判断是否扩容private void ensureCapacityInternal(int minimumCapacity) {// 有溢出意识的代码(容量必须大于缓存数组的长度才扩容)if (minimumCapacity - value.length > 0) {value = Arrays.copyOf(value,newCapacity(minimumCapacity));}}//计算新的长度private int newCapacity(int minCapacity) {// 扩容机制:原来的长度*2 + 2int newCapacity = (value.length << 1) + 2;//为什么+2的原因:怕用户设置初始化数组长度为0,0<<1还是0,就得不到扩容return newCapacity;}}

StringBuilder底层代码

public class MyStringBuilder extends MyAbstractStringBuilder{public MyStringBuilder() {super(16);//默认缓冲数组长度为16}public MyStringBuilder(int capacity) {super(capacity);//自定义缓冲数组的长度}public MyStringBuilder(String str) {super(str.length() + 16);//自定义缓冲数组的长度:字符串长度+16append(str);//追加字符串}@Overridepublic MyStringBuilder append(String str) {super.append(str);//依赖于父类的appendreturn this;}
}

StringBuffer底层代码

public class MyStringBuffered extends MyAbstractStringBuilder{public MyStringBuffered() {super(16);//默认缓冲数组长度为16}public MyStringBuffered(int capacity) {super(capacity);//自定义缓冲数组的长度}public MyStringBuffered(String str) {super(str.length() + 16);//自定义缓冲数组的长度:字符串长度+16append(str);//追加字符串}//synchronized - 线程安全的方法@Overridepublic synchronized  MyStringBuffered append(String str) {//上锁super.append(str);//依赖于父类的appendreturn this;}//解锁
}

2.7 StringBuilder 和 StringBuffer的构造方法

StringBuilder/StringBuffer代表可变的字符序列

StringBuilder/StringBuffer称为字符串缓冲区

它的工作原理是:预先申请一块内存(char[] value = new char[]),存放字符序列,
如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列(扩容机制:原来数组长度的两倍+2)。

StringBuilder/StringBuffer是可变对象:因为char[] value = new char[];
String是不可变的对象,因为final char[] value = new char[];

public class Test07 {public static void main(String[] args) {//缓冲区默认长度:16个字符//StringBuffer sb = new StringBuffer();//自定义缓冲长度:100个字符//StringBuffer sb = new StringBuffer(100);//自定义缓冲长度:"abc".length() + 16
//		StringBuffer sb = new StringBuffer("abc");
//		System.out.println(sb);System.out.println("-------------");//缓冲区默认长度:16个字符//StringBuilder sb = new StringBuilder();//自定义缓冲长度:100个字符//StringBuilder sb = new StringBuilder(100);//自定义缓冲长度:"abc".length() + 16
//		StringBuilder sb = new StringBuilder("abc");
//		System.out.println(sb);System.out.println("-------------");//底层有两个字符串:“abc”,"abcd"String str = "abc";str = "abcd";System.out.println(str);//底层只有一个缓存数组StringBuilder sb = new StringBuilder();sb.append("abc");sb.append("c");System.out.println(sb);}
}

2.8 频繁拼接字符串,使用StringBuilder/StringBuffer

public class Test08 {public static void main(String[] args) {//获取自1970年1月1日0:0:0 到现在的毫秒数(1000毫秒 = 1秒)//long currentTimeMillis = System.currentTimeMillis();//		long startTime = System.currentTimeMillis();
//		String str = "莹莹";
//		for (int i = 1; i < 50000; i++) {
//			str += "小可爱,皇冠给你带";//底层实现://	str = str + "小可爱,皇冠给你带";//	str = new StringBuidler(str).append("小可爱,皇冠给你带");
//		}
//		long endTime = System.currentTimeMillis();
//		System.out.println("消耗时长:" + (endTime-startTime));//6640System.out.println("--------------------------------------------");//		long startTime = System.currentTimeMillis();
//		StringBuffer sb = new StringBuffer("莹莹");
//		for (int i = 1; i < 50000; i++) {
//			sb.append("小可爱,皇冠给你带");
//		}
//		long endTime = System.currentTimeMillis();
//		System.out.println("消耗时长:" + (endTime-startTime));//5System.out.println("--------------------------------------------");long startTime = System.currentTimeMillis();StringBuffer sb = new StringBuffer(450060);//优化方案:减少底层扩容次数sb.append("莹莹");for (int i = 1; i < 50000; i++) {sb.append("小可爱,皇冠给你带");}long endTime = System.currentTimeMillis();System.out.println("消耗时长:" + (endTime-startTime));//5}
}

3.正则表达式

理解:符合某个语句规范的字符串

逻辑运算符

&&:并且

| :或者

\ :转义字符

预定义字符

“.” : 匹配任何字符。

“\d”:任何数字[0-9]的简写;

“\D”:任何非数字[^0-9]的简写;

“\s”: 空白字符:[ \t\n\x0B\f\r] 的简写

“\S”: 非空白字符:[^\s] 的简写

“\w”:单词字符:[a-zA-Z_0-9]的简写

“\W”:非单词字符:[^\w]

预定义字符

“.” : 匹配任何字符。

“\d”:任何数字[0-9]的简写;

“\D”:任何非数字[^0-9]的简写;

“\s”: 空白字符:[ \t\n\x0B\f\r] 的简写

“\S”: 非空白字符:[^\s] 的简写

“\w”:单词字符:[a-zA-Z_0-9]的简写

“\W”:非单词字符:[^\w]

分组括号( )

只看左括号,不看有括号,按照左括号的顺序,从左往右,依次为第一组,第二组,第三组等等

3.1 利用正则表达式做替换

案例:把一个字符串中带电话号码替换成130****1111

public class Test01 {public static void main(String[] args) {String str = "小红13012341111 小绿15112342222 小黑13912343333";String regex = "(1\\d{2})(\\d{4})(\\d{4})";str = str.replaceAll(regex, "$1****$3");//$n保留第几组正则表达式里的数据System.out.println(str);}
}	

3.2 利用正则表达式做验证

案例:校验QQ邮箱

public class Test02 {public static void main(String[] args) {String email = "1445584980@qq.com";String regex = "\\d{4,11}@qq.com";boolean matches = email.matches(regex);System.out.println(matches);}
}	

3.3 利用正则表达式做字符串的分割

案例:分隔路径

public class Test03 {public static void main(String[] args) {String str = "C:\\资源\\日韩\\波多野结衣.avi";//:?表示冒号出现1次或0次String regex = ":?\\\\";//分割  :\\ 或 \\String[] split = str.split(regex);for (String string : split) {System.out.println(string);}}
}	

3.4 利用正则表达式做字符串的爬数据的工作

Pattern:表示正则表达式

Matcher:文本匹配器,作用按照正则表达式的规则去读取字符串,从头开始读取。

​ 在大串中去找符合匹配规则的子串。

案例:Pattern+Matcher 找到前端代码中的图片路径

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test04 {public static void main(String[] args) {String str = "<img src='hhy/aaa.jpg'/><div><div/> <input type='image' src='submit.gif' /><img src='bbb.jpg'/>";String regex = "<img\\b[^>]*\\bsrc\\b\\s*=\\s*('|\")?([^'\"\n\r\f>]+(\\.jpg)\\b)[^>]*>";//获取正则表达式对象Pattern pattern = Pattern.compile(regex);//获取匹配结果Matcher matcher = pattern.matcher(str);//循环遍历匹配结果while(matcher.find()){//获取匹配结果String group = matcher.group(2);//2表示第2组数据System.out.println(group);}}
}	

4.日期时间类

Date(java.util) – 日期类

SimpleDateFormat – 格式化日期类

Calendar – 日历类

4.1 Date 日期类

java.util.Date类表示特定的瞬间,精确到毫秒

public class Test01 {public static void main(String[] args) {Date date = new Date();//星期 月份 日期 时:分:秒 时区 年份//Sat Jan 27 14:31:41 CST 2024System.out.println(date);}
}

4.2 SimpleDateFormat 格式化日期类

将显示的日期信息格式化

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class Test02 {public static void main(String[] args) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");//Date 转 StringString datetime = sdf.format(new Date());System.out.println(datetime);//String 转 Date Date date = sdf.parse("2024年01月27日 14时37分61秒");System.out.println(date);}
}

4.3 Calendar 日历类

Calendar类(日历)是一个抽象基类,主要用于完成日期字段之间相互操作的功能。即可以设置和获取日期数据的特定部分。

import java.util.Calendar;public class Test03 {public static void main(String[] args) {//获取当前系统的日历对象Calendar c = Calendar.getInstance();int year = c.get(Calendar.YEAR);int month = c.get(Calendar.MONTH)+1;//注意:月份0~11,0表示1月,所以加个1int day = c.get(Calendar.DAY_OF_MONTH);int hour = c.get(Calendar.HOUR);int minute = c.get(Calendar.MINUTE);int second = c.get(Calendar.SECOND);System.out.println(year);System.out.println(month);System.out.println(day);System.out.println(hour);System.out.println(minute);System.out.println(second);}
}

小结:

​ Date + SimpleDateFormat一起使用,获取我们想要的日期时间格式

​ 获取单个日历信息,考虑使用Calendar

5.Math类

Math 类提供了一序列基本数学运算和几何函数的方法

Math类是final类,并且它的所有成员变量和成员方法都是静态的。

public class Test01 {public static void main(String[] args) {System.out.println("求次方:" + Math.pow(3, 2));//9.0System.out.println("求平方根:" + Math.sqrt(9));//3.0System.out.println("求绝对值:" + Math.abs(-100));//100System.out.println("求最大值:" + Math.max(10, 20));//20System.out.println("求最小值:" + Math.min(10, 20));//10System.out.println("向下取整(地板):" + Math.floor(1.9));//1.0System.out.println("向上取整(天花板):" + Math.ceil(1.1));//2.0System.out.println("四舍五入:" + Math.round(1.5));//2System.out.println("获取随机值:" + Math.random());//注意:随机出0~1的数字,0包含,1排他//需求:随机出1~100的数字int num = (int)(Math.random()*100)+1;System.out.println("获取随机值:" + num);}
}

面试题:Math.abs会出现负数吗?

会出现负数 --> -2147483648(极限)

public class Test02 {public static void main(String[] args) {//获取int类型的最大值 -> 2147483647 -- 2的31次方-1System.out.println(Integer.MAX_VALUE);//获取int类型的最小值 -> -2147483648 - -2的31次方System.out.println(Integer.MIN_VALUE);//面试题:Math.abs会出现负数吗?//会出现负数 --> -2147483648System.out.println(Math.abs(-2147483648));}
}

5.1 静态导入

理解:将类中所有的静态属性和方法都导入到本类来,作为本来自己的静态属性和方法

缺点:如果类中的方法和静态导入类中的方法重名了,会调用本类自己的静态方法,所以可读性差,不建议使用

//静态导入:将类中所有的静态属性和方法都导入到本类来,作为本来自己的静态属性和方法
import static java.lang.Math.*;public class Test03 {public static void main(String[] args) {System.out.println("求次方:" + pow(3, 2));//9.0System.out.println("求平方根:" + sqrt(9));//3.0}public static int sqrt(int i){return 123456;}
}

6.Random

理解:随机类

import java.util.Random;public class Test01 {public static void main(String[] args) {Random ran = new Random();System.out.println("随机出int取值范围里的数值:" + ran.nextInt());System.out.println("随机出0~9的int数值:" + ran.nextInt(10));System.out.println("随机出double取值范围里的数值:" + ran.nextDouble());System.out.println("随机出boolean取值范围里的数值:" + ran.nextBoolean());}
}

6.1 深入Random

注意:seed叫做种子数,种子数一旦固定,随机出的数字就是固定的!!!

​ MyRandom myRandom = new MyRandom(种子数);

​ 为空,可随机,有了具体的数值,不可随机

import java.util.Random;public class Test02 {public static void main(String[] args) {Random ran = new Random(1000);System.out.println("随机出int取值范围里的数值:" + ran.nextInt());System.out.println("随机出0~9的int数值:" + ran.nextInt(10));System.out.println("--------------------");MyRandom myRandom = new MyRandom();System.out.println("随机出int取值范围里的数值:" + myRandom.nextInt());System.out.println("随机出0~9的int数值:" + myRandom.nextInt(10));}
}

Random底层代码

public class MyRandom {//种子数private long seed;public MyRandom() {this(seedUniquifier() ^ System.nanoTime());}private static long seedUniquifier() {for (;;) {long current = System.currentTimeMillis();long next = current * 181783497276652981L;if (next%3==0 || next%12==0 || next%17==0){return next;}}}public MyRandom(long seed) {this.seed = seed;}public int nextInt(){return (int) seed;}public int nextInt(int bound){return Math.abs((int) seed)%bound;}
}

7.Runtime

理解:Runtime表示运行时系统(JVM)

Runtime代表Java程序的运行时环境,可以通过 getRuntime 方法获取当前运行时。

应用程序不能自己创建Runtime对象,可以通过Runtime的静态方法getRuntime()获得Runtime对象。

Runtime类可以访问jvm的相关信息,如处理器数量,内存信息等

public class Test01 {public static void main(String[] args) {//获取运行时系统对象Runtime run = Runtime.getRuntime();System.out.println("获取最大操作数:" + run.availableProcessors());//8System.out.println("获取最大内存数(byte):" + run.maxMemory());System.out.println("获取闲置内存数(byte):" + run.freeMemory());}
}

7.1 程序的效率(时间、内存)

public class Test02 {public static void main(String[] args) {//		Runtime run = Runtime.getRuntime();
//		long startTime = System.currentTimeMillis();
//		long startMemory = run.freeMemory();
//		String str = "莹莹";
//		for (int i = 1; i < 50000; i++) {
//			str += "小可爱,皇冠给你带";
//		}
//		long endMemory = run.freeMemory();
//		long endTime = System.currentTimeMillis();
//		System.out.println("消耗时长:" + (endTime-startTime));//6640
//		System.out.println("消耗内存:" + (startMemory-endMemory));System.out.println("--------------------------------------------");//		Runtime run = Runtime.getRuntime();
//		long startTime = System.currentTimeMillis();
//		long startMemory = run.freeMemory();
//		StringBuffer sb = new StringBuffer("莹莹");
//		for (int i = 1; i < 50000; i++) {
//			sb.append("小可爱,皇冠给你带");
//		}
//		long endMemory = run.freeMemory();
//		long endTime = System.currentTimeMillis();
//		System.out.println("消耗时长:" + (endTime-startTime));//5
//		System.out.println("消耗内存:" + (startMemory-endMemory));//2293808System.out.println("--------------------------------------------");Runtime run = Runtime.getRuntime();long startTime = System.currentTimeMillis();long startMemory = run.freeMemory();StringBuffer sb = new StringBuffer(450060);//优化方案:减少底层扩容次数sb.append("莹莹");for (int i = 1; i < 50000; i++) {sb.append("小可爱,皇冠给你带");}long endMemory = run.freeMemory();long endTime = System.currentTimeMillis();System.out.println("消耗时长:" + (endTime-startTime));//5System.out.println("消耗内存:" + (startMemory-endMemory));//900136}
}

8.System

理解:

1、System类提供了一些静态属性和方法,允许通过类名直接调用

2、System类提供了代表标准输入、标准输出、错误输出的类属性

3、System类提供了一些静态方法用于访问环境变量、系统属性的方法

8.1 System - 属性

err:“标准”错误输出流

in:“标准”输入流

out:“标准”输出流

import java.io.InputStream;
import java.io.PrintStream;
import java.util.Scanner;public class Test01 {public static void main(String[] args) {//获取系统标准的输入流 - 方向:控制台->程序InputStream in = System.in;Scanner scan = new Scanner(in);System.out.println("请输入int值:");int num = scan.nextInt();//获取系统标准的输出流 - 方向:程序 -> 控制台
//		PrintStream out = System.out;
//		out.println(num);//获取系统标准的错误输出流 - 方向:程序 -> 控制台PrintStream err = System.err;err.println(num);scan.close();}
}

8.2 System.out和System.err的区别

注意:稍微感受多线程抢资源的场景

public class Test02 {public static void main(String[] args) {System.out.println("小明");System.err.println("小红");System.out.println("小强");}
}

运行结果:

小明 小明 小红 小明

小红 小强 小明 小强小红

小强 小红 小强

····

8.3 System - 方法

public static void *exit*(int status) 退出当前虚拟机

public static long *currentTimeMillis*() 获得当前系统的毫秒值(与1970 年 1 月 1 日午夜之间的时间差)–测试程序的消耗时间

public static Properties *getProperties*() 获得当前的所有系统属性

public static String *getProperty*(String key) 获得指定键的系统属性

public static void *setIn*(InputStream in) 输入重定向

public static void *setOut*(PrintStream out) 输出重定

publ****ic static void setErr****(PrintStream err) 错误重定向

import java.util.Properties;public class Test03 {public static void main(String[] args) {long currentTimeMillis = System.currentTimeMillis();System.out.println("获取自1970年1月1日到现在的毫秒数:" + currentTimeMillis);//获取系统参数Properties properties = System.getProperties();System.out.println(properties);//通过具体Key获取对应的ValueString property = System.getProperty("os.name");System.out.println("通过具体Key获取对应的Value:" + property);//拷贝数组int[] arr = {1,2,3,4,5,6,7,8,9,10};int[] newArr = new int[4];System.arraycopy(arr, 3, newArr, 0, 4);//(源数组,开始下标,目标数组,开始下标,拷贝长度)for (int num : newArr) {System.out.println(num);}//利用System.arraycopy做数组的删除功能String[] names = {"aaa","bbb","ccc","ddd","eee","fff",null,null,null};	System.arraycopy(names, 2, names, 1, 4);names[5] = null;for (String str : names) {System.out.println(str);}//退出当前虚拟机,0表示正常退出System.exit(0);}
}

9.大数值运算类

9.1 BigInteger - 整数的大数值运算类

BigInteger: 能表示比Integer更大的数字

import java.math.BigInteger;public class Test01 {public static void main(String[] args) {BigInteger big1 = new BigInteger("2100000000");BigInteger big2 = new BigInteger("2100000000");BigInteger add = big1.add(big2);System.out.println("加法:" + add);BigInteger subtract = big1.subtract(big2);System.out.println("减法:" + subtract);BigInteger multiply = big1.multiply(big2);System.out.println("乘法:" + multiply);BigInteger divide = big1.divide(big2);System.out.println("除法:" + divide);}
}

9.2 BigDecimal - 小数大数值运算类

注意:

​ 1.小数做运算会失去精度,所以小数做运算都要生成大数值的运算类

​ 2.构造方法里的值使用字符串

import java.math.BigDecimal;public class Test02 {public static void main(String[] args) {BigDecimal big1 = new BigDecimal("0.5");BigDecimal big2 = new BigDecimal("0.4");BigDecimal add = big1.add(big2);System.out.println("加法:" + add);BigDecimal subtract = big1.subtract(big2);System.out.println("减法:" + subtract);BigDecimal multiply = big1.multiply(big2);System.out.println("乘法:" + multiply);BigDecimal divide = big1.divide(big2);System.out.println("除法:" + divide);}
}
import java.math.BigDecimal;public class Test03 {public static void main(String[] args) {BigDecimal big1 = new BigDecimal("10");BigDecimal big2 = new BigDecimal("3");BigDecimal divide = big1.divide(big2, 3, BigDecimal.ROUND_HALF_UP);System.out.println("除法:" + divide);}
}

总结

1.包装类
注意:
1.装箱、拆箱
2.Integer的底层原理

2.字符串的类
注意:字符串类的深入

3.正则表达式 - 了解

4.日期时间类

  1. Math
    注意:静态导入的概念

6.Random
注意:种子数

7.System
注意:理解System.out和System.err多线程抢资源

8.Runtime

9.大数值运算类

相关文章:

学习JavaEE的日子 Day19 常用类

Day19 1.包装类的使用 理解&#xff1a;8种基本数据类型对应类 出现原因&#xff1a; ​ Java为纯面向对象语言(万物皆对象)&#xff0c;8种基本数据类型不能new对象&#xff0c; ​ 就破坏Java为纯面向对应语言的特征&#xff0c;Java又为8种基本数据类型分别 ​ 匹配了对应的…...

25考研政治备考计划

各位小伙伴大家好&#xff0c;今天给大家分享的是25考研政治复习备考计划。 政治没有基础阶段&#xff0c;直接就是强化&#xff0c;强化的内容也就是听课&#xff0c;刷题。 【时间安排】 *7-9月中 徐涛老师或腿姐强化课&#xff0c;推荐刷肖1000 *9月中-10月中 背腿姐的背…...

漏洞01-目录遍历漏洞/敏感信息泄露/URL重定向

目录遍历漏洞/敏感信息泄露/URL重定向 文章目录 目录遍历敏感信息泄露URL重定向 目录遍历 敏感信息泄露 于后台人员的疏忽或者不当的设计&#xff0c;导致不应该被前端用户看到的数据被轻易的访问到。 比如&#xff1a; ---通过访问url下的目录&#xff0c;可以直接列出目录下…...

软件工程知识梳理4-详细设计

详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统&#xff0c;也就是说.经过这个阶段的设计工作.应该得出对目标系统的精确描述.从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。 详细设计的的目标不仅仅是逻辑上正确地实现每个模块地功能&a…...

Spring Boot3,启动时间缩短 10 倍!

前面松哥写了一篇文章和大家聊了 Spring6 中引入的新玩意 AOT&#xff08;见Spring Boot3 新玩法&#xff0c;AOT 优化&#xff01;&#xff09;。 文章发出来之后&#xff0c;有小伙伴问松哥有没有做性能比较&#xff0c;老实说&#xff0c;这个给落下了&#xff0c;所以今天…...

Picturesocial | 只要 5 分钟,发现容器编排的秘密武器!

在上一篇文章《Picturesocial | 开发实践&#xff1a;如何在 15 分钟内将应用容器化》&#xff0c;我们讨论了容器以及容器化应用程序所需的步骤。在不考虑将 container 部署到哪里的情况下创建 container&#xff0c;就像把家放在漂浮在海中的货运集装箱里一样&#xff0c;听起…...

GEE数据集——Umbra 卫星合成孔径雷达开放数据

Umbra 合成孔径雷达开放数据 Umbra 卫星生成的合成孔径雷达图像分辨率最高(优于 25 厘米/10 英寸)。合成孔径雷达卫星可以在夜间、透过云层、烟雾和雨水捕捉图像。合成孔径雷达具有监测变化的独特能力。开放数据计划(ODP)对全球十个不同地点进行监测。经常更新新图像。ODP …...

一个vue项目中通过iframe嵌套另外一个vue项目,如何让这两个项目进行通信

文章目录 需求分析父传子子传父 需求 一个vue项目中通过iframe嵌套另外一个vue项目&#xff0c;如何让这两个项目之间进行通信 分析 在Vue项目中通过iframe嵌套另外一个Vue项目时&#xff0c;可以通过postMessage方法实现这两个项目之间的通信。postMessage是HTML5新增加的API…...

上班族学习方法系列文章目录

上班族学习方法系列文章目录 文章目录 上班族学习方法系列文章目录前言一、时间管理二、答题实战 前言 上班族如果想提高自己&#xff0c;那么就得掌握有效的学习方法和良好的时间管理。 一、时间管理 上班族有家有业&#xff0c;考证或者提高学历备考时间不充分。需要学会精…...

《Lua程序设计》-- 学习9

迭代器和泛型for 迭代器和闭包 迭代器&#xff08;iterator&#xff09;是一种可以让我们遍历一个集合中所有元素的代码结构。在Lua语言中&#xff0c;通常使用函数表示迭代器&#xff1a;每一次调用函数时&#xff0c;函数会返回集合中的“下一个”元素。 一个闭包就是一个…...

GIS应用水平考试一级—2009 年度第二次

全国信息化工程师——GIS应用水平考试 2009 年度第二次全国统一考试一级 试卷说明: 1、本试卷共9页,6个大题,满分150 分,150 分钟完卷。 2、考试方式为闭卷考试。 3、将第一、二、三題的答案用铅笔涂写到(NCIE-GIS)答题卡上。 4、将第四、五、六题的答案填写到主观题答题卡上…...

【计算机视觉】万字长文详解:卷积神经网络

以下部分文字资料整合于网络&#xff0c;本文仅供自己学习用&#xff01; 一、计算机视觉概述 如果输入层和隐藏层和之前一样都是采用全连接网络&#xff0c;参数过多会导致过拟合问题&#xff0c;其次这么多的参数存储下来对计算机的内存要求也是很高的 解决这一问题&#x…...

Vue3项目封装一个Element-plus Pagination分页

前言:后台系统分页肯定是离不开的,但是ui框架都很多,我们可以定义封装一种格式,所有项目按到这个结构来做. 实例: 第一步:在项目components组件新建一个分页组件,用来进行封装组件. 第二步:根据官方的进行定义,官方提供的这些,需要我们封装成动态模式 第三步:代码改造 <!-…...

node.js(nest.js控制器)学习笔记

nest.js控制器&#xff1a; 控制器负责处理传入请求并向客户端返回响应。 为了创建基本控制器&#xff0c;我们使用类和装饰器。装饰器将类与所需的元数据相关联&#xff0c;并使 Nest 能够创建路由映射&#xff08;将请求绑定到相应的控制器&#xff09;。 1.获取get请求传参…...

Mybatis 源码系列:领略设计模式在 Mybatis 其中的应用

文章目录 一、Builder模式二、工厂模式三、单例模式四、代理模式五、组合模式六、模板方式模式七、适配器模式八、装饰器模式九、迭代器模式 虽然我们都知道有23种设计模式&#xff0c;但是大多停留在概念层面&#xff0c;真实开发中很少遇到&#xff0c;Mybatis源码中使用了大…...

用的到的linux-文件移动-Day2

前言&#xff1a; 在上一节&#xff0c;我们复习了cd大法和创建生成文件和文件夹的方法&#xff0c;介绍了一些“偷懒”&#xff08;高效&#xff09;的小技巧&#xff0c;本节&#xff0c;我们一起来探讨下&#xff0c;我们对文件移动操作时有哪些可以偷懒的小技巧~ 一、复制…...

红队打靶练习:INFOSEC PREP: OSCP

目录 信息收集 1、arp 2、nmap WEB 信息收集 wpscan dirsearch ssh登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.110.128 Starting arp-scan 1.10.0 with 256 ho…...

【linux】文件修改记录

是的&#xff0c;在Linux上&#xff0c;您可以使用’ find 命令检查最近修改的文件。此实用程序可以搜索在指定天数内修改过的文件。你可以这样使用它: 查找主目录中最近24小时(1天)内修改过的文件。 find ~ -type f -mtime -1命令说明: -“~”表示您的主目录。 ’ -type f…...

Vue学习Element-ui

声明&#xff1a;本文来源于黑马程序员PDF讲义 Ajax 我们前端页面中的数据&#xff0c;如下图所示的表格中的学生信息&#xff0c;应该来自于后台&#xff0c;那么我们的后台和前端是 互不影响的2个程序&#xff0c;那么我们前端应该如何从后台获取数据呢&#xff1f;因为是2…...

存内计算技术—解决冯·诺依曼瓶颈的AI算力引擎

文章目录 存内计算技术背景CSDN首个存内计算开发者社区硅基光电子技术存内计算提升AI算力知存科技存算一体芯片技术基于存内计算的语音芯片的实现挑战 参考文献 存内计算技术背景 存内计算技术是一种革新性的计算架构&#xff0c;旨在克服传统冯诺依曼架构的瓶颈&#xff0c;并…...

数据结构--树

一、树的基本术语 结点:树中的一个独立单元 结点的度:结点下分支的个数 树的度:树中所有结点中度的最大值 非终端结点:度不为0的结点 双亲和孩子:结点下的子树称为该结点的孩子.相应地,该结点称为孩子的双亲 兄弟:同一个双亲的孩子之间 祖先:从根到该结点所经分支上的所…...

计算机网络_1.3电路交换、分组交换和报文交换

1.3电路交换、分组交换和报文交换 一、电路交换1、“电路交换”例子引入2、电路交换的三个阶段3、计算机之间的数据传送不适合采用电路交换 二、分组交换1、发送方&#xff08;1&#xff09;报文&#xff08;2&#xff09;分组&#xff08;3&#xff09;首部 2、交换节点3、接收…...

【AI视野·今日NLP 自然语言处理论文速览 第七十七期】Mon, 15 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 15 Jan 2024 Totally 57 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Machine Translation Models are Zero-Shot Detectors of Translation Direction Authors Michelle Wastl, Ja…...

神经网络的一些常规概念

epoch&#xff1a;是指所有样本数据在神经网络训练一次&#xff08;单次epoch(全部训练样本/batchsize)/iteration1&#xff09;或者&#xff08;1个epochiteration数 batchsize数&#xff09; batch-size&#xff1a;顾名思义就是批次大小&#xff0c;也就是一次训练选取的样…...

【从零开始的rust web开发之路 三】orm框架sea-orm入门使用教程

【从零开始的rust web开发之路 三】orm框架sea-orm入门使用教程 文章目录 前言一、引入依赖二、创建数据库连接简单链接连接选项开启日志调试 三、生成实体安装sea-orm-cli创建数据库表使用sea-orm-cli命令生成实体文件代码 四、增删改查实现新增数据主键查找条件查找查找用户名…...

SQL中limit的用法

在SQL中&#xff0c;LIMIT是一个用于限制返回结果行数的关键词。它可用于在查询结果中指定返回的行数&#xff0c;从而可以用于分页查询或限制结果集大小。 LIMIT关键词有两种常用的语法格式&#xff1a; LIMIT offset, count&#xff1a;该语法用于指定返回结果的起始位置和…...

vue3 [Vue warn]: Unhandled error during execution of scheduler flush

文章目录 前言一、报错截图二、排除问题思路相关问题 Vue3 优雅解决方法异步组件异同之处&#xff1a;好处&#xff1a;在使用异步组件时&#xff0c;有几个注意点&#xff1a; vue3 定义与使用异步组件 总结 前言 Bug 记录。开发环境运行正常&#xff0c;构建后时不时触发下面…...

【vue2源码】阶段一:Vue 初始化

文章目录 一、项目目录1、主目录2、打包入口 二、构造函数Vue的初始化1、创建 Vue 构造函数2、初始化内容分析2.1 initMixin2.2 stateMixin2.3 eventsMixin2.4 lifecycleMixin2.5 renderMixin 一、项目目录 源码版本&#xff1a;2.7.16 1、主目录 src |-- compiler # 包…...

14.java集合

文章目录 概念Collection 接口概念示例 Iterator 迭代器基本操作&#xff1a;并发修改异常增强循环遍历数组&#xff1a;遍历集合&#xff1a;遍历字符串&#xff1a;限制 list接口ListIteratorArrayList创建 ArrayList&#xff1a;添加元素&#xff1a;获取元素&#xff1a;修…...

二叉树顺序结构堆实现

目录 Test.c测试代码 test1 test2 test3 &#x1f387;Test.c总代码 Heap.h头文件&函数声明 头文件 函数声明 &#x1f387;Heap.h总代码 Heap.c函数实现 ☁HeapInit初始化 ☁HeapDestroy销毁 ☁HeapPush插入数据 【1】插入数据 【2】向上调整Adjustup❗ …...