13.常用类|Java学习笔记

news2024/11/25 22:50:07

文章目录

  • 包装类
    • 包装类型和String类型的相互转换
    • Integer类和Character类的常用方法
    • Integer创建机制&面试题
  • String类
    • 创建String对象的两种方式和区别
    • 字符串的特性
    • String类的常用方法
  • StringBuffer类
    • String和StringBuffer相互转换
    • StringBuffer常用方法
  • StringBuilder类
    • String、StringBuffer 和 StringBuilder 的比较
  • Math类
  • Arrays类
  • System类
  • BigInteger和BigDeciaml类
  • 日期类
    • 第一代日期类
    • 第二代日期类
    • 第三代日期类
      • 前两代日期类的不足分析
      • DateTimeFormatter 格式日期类
      • Instant 时间戳

包装类

针对八种基本数据类型相应的引用类型—包装类

在这里插入图片描述

java中int和integer之间的转换

jdk5之后可以直接:

int a = 1;
Integer b = a;
System.out.println(b);
int c = b;
System.out.println(c);

包装类型和String类型的相互转换

package com.fwedu.wrapper;


public class WrapperVsString {
    public static void main(String[] args) {
        // 方式一
        Integer i = 100;
        String str1 = i + "";

        // 方式二
        String str2 = i.toString();

        // 方式三
        String str3 = String.valueOf(i);

        // String -> 包装类(Integer)
        String str4 = "123456";
        Integer i2 = Integer.parseInt(str4);

        Integer i3 = new Integer(str4);     // 已经是deprecated了
    }
}

Integer类和Character类的常用方法

package com.fwedu.wrapper;

public class WrapperMethod {
    public static void main(String[] args) {
        System.out.println(Integer.MIN_VALUE);  // int最小值
        System.out.println(Integer.MAX_VALUE);  // int最大值

        System.out.println(Character.isDigit('a')); // 数字
        System.out.println(Character.isLetter('a'));    // 字母
        System.out.println(Character.isUpperCase('a')); // 大写
        System.out.println(Character.isLowerCase('a')); // 小写

        System.out.println(Character.isWhitespace('a'));    // 空格
        System.out.println(Character.toUpperCase('a')); // 变成大写
        System.out.println(Character.toLowerCase('a')); // 变成小写
    }
}

Integer创建机制&面试题

package com.fwedu.wrapper;

public class WrapperExercise02 {
    public static void main(String[] args) {
        Integer i = new Integer(1);
        Integer j = new Integer(1);
        System.out.println(i == j); //False
        //所以, 这里主要是看范围 -128 ~ 127 就是直接返回
        /*
        老韩解读
        //1. 如果 i 在 IntegerCache.low(-128)~IntegerCache.high(127),就直接从数组返回
        //2. 如果不在 -128~127,就直接 new Integer(i)
        public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
        }
        */
        Integer m = 1; //底层 Integer.valueOf(1); -> 阅读源码
        Integer n = 1;//底层 Integer.valueOf(1);
        System.out.println(m == n); //True
        //所以, 这里主要是看范围 -128 ~ 127 就是直接返回
        //, 否则, 就 new Integer(xx);
        Integer x = 128;//底层 Integer.valueOf(1);
        Integer y = 128;//底层 Integer.valueOf(1);
        System.out.println(x == y);//False
    }
}

String类

  1. String对象用于保存字符串,也就是一组字符序列
  2. 字符串常量对象是用双引号括起的字符序列。例如: “你好”、“12.97”、 "boy"等
  3. 字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节。
  4. String类较常用构造器(其它看手册,有很多):
    String s1 = new String();
    String s2 = new String(String original);
    String s3 = new String(char[] a);
    String s4 = new String(char[] a, int startIndex, int count)
    

在这里插入图片描述

  1. String 类实现了接口 Serializable【String 可以串行化:可以在网络传输】
    接口 Comparable \【String 对象可以比较大小】
  2. String 是 final 类, 不能被其他的类继承
  3. String 有属性 private final char value[]; 用于存放字符串内容
  4. 一定要注意: value 是一个 final 类型, 不可以修改(需要功力): 即 value 不能指向新的地址, 但是单个字符内容是可以变化

创建String对象的两种方式和区别

方式一:直接赋值String s = “hsp”;
方式二:调用构造器String s2 = new String(“hsp”);

String s = "hsp";
String s2 = new String("hsp");
  1. 方式一:先从常量池查看是否有"hsp"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址。
  2. 方式二:先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。
    如果常量池没有"hsp",重新创建,如果有,直接通过value指向。 s2最终指向的是堆中的空间地址。
  3. 画出两种方式的内存分布图如下:

在这里插入图片描述

package com.fwedu.string_;

public class StringExercise01 {
    public static void main(String[] args) {
        String a = "abc";
        String b = "abc";
        System.out.println(a.equals(b));    // t
        System.out.println(a == b);         // t

        String c = new String("abc");
        String d = new String("abc");
        System.out.println(c.equals(d));    // t
        System.out.println(c == d);         // f
    }
}

当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object)方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

package com.fwedu.string_;

public class StringExercise03 {
    public static void main(String[] args) {
        // a指向常量池的"abc"
        String a = "abc";
        // b指向堆中对象
        String b = new String("abc");
        System.out.println(a.equals(b));    // t
        System.out.println(a == b);         // f
        // b.intern()方法最终返回的时常量池的地址(对象)
        System.out.println(a == b.intern());    // t
        System.out.println(b == b.intern());    // f

        // .intern()最终返回的是常量池的地址(对象)
        System.out.println(a.intern());     // abc
        System.out.println(b.intern());     // abc
    }
}

字符串的特性

  1. String是一个final类,代表不可变的字符序列。
  2. 字符串是不可变的。一个字符串对象一旦被分配,其内容是不可变的。
String s1 = "hello";
s1 = "haha";	// 创建了两个对象

String a = "hello" + "abc";		// 创建了一个对象(编译器等价优化String a = "helloabc";)
String c1 = "ab" + "cd";	// 常量相加,看的是池
String c1 = a + b;			// 变量相加,是在堆中

String类的常用方法

*   equals //区分大小写,判断内容是否相等
*   equalsIgnoreCase //忽略大小写的判断内容是否相等
*   length //获取字符的个数,字符串的长度
*   indexOf //获取字符在字符串中第1次出现的索引,索引从0开始,如果找不到,返回-1
*   lastIndexOf //获取字符在字符串中最后1次出现的索引,索引从开始,如找不到,返回-1
*   substring //截取指定范围的子串
*   trim //去前后空格
*   charAt	//获取某索引处的字符,注意不能使用Str[index]这种方式
toUpperCase
toLowerCase
concat
s1 = s1.concat("abc").concat("def");
replace // 替换字符串中的字符
split	// 分割字符串,返回值是String[]

String a = "jcck";
String b = "jackjk";
// 返回值是 'c' - 'a' = 2 的值
System.out.println(a.compareTo(b));	// 比较两个字符串的大小.前者大返回正数。如果前面的部分相同,就返回str1.len-str2.len

toCharArray		// 转换成字符数组
format		// 格式字符串 %s字符串 %c字符 %d整型 %.2f浮点型
String name = "john";
int age = 10;
String info = String.format("我的名字是%s 年龄是%d", name, age);
System.out.println(info);	// 输出 我的名字是john 年龄是10

concat方法和+的区别

StringBuffer类

String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此java设计者还提供了StringBuilder和 StringBuffer来增强String的功能,并提高效率。

在这里插入图片描述

String VS StringBuffer

  1. String 保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址, 效率较低 //private final char value[];
  2. StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率较高
    //char[] value; //这个放在堆. 它的char[] value 不是final的

String和StringBuffer相互转换

package com.fwedu.stringbuffer_;

public class StringAndStringBuffer {
    public static void main(String[] args) {
        //看 String——>StringBuffer
        String str = "hello tom";
        //方式 1 使用构造器
        //注意: 返回的才是 StringBuffer 对象, 对 str 本身没有影响
        StringBuffer stringBuffer = new StringBuffer(str);
        //方式 2 使用的是 append 方法
        StringBuffer stringBuffer1 = new StringBuffer();
        stringBuffer1 = stringBuffer1.append(str);

        //看看 StringBuffer ->String
        StringBuffer stringBuffer3 = new StringBuffer("韩顺平教育");
        //方式 1 使用 StringBuffer 提供的 toString 方法
        String s = stringBuffer3.toString();
        //方式 2: 使用构造器来搞定
        String s1 = new String(stringBuffer3);
    }
}

StringBuffer常用方法

package com.fwedu.stringbuffer_;

public class StringBufferMethod {
    public static void main(String[] args) {
        StringBuffer s = new StringBuffer("hello");
        //增
        s.append(',');// "hello,"
        s.append("张三丰");//"hello,张三丰"
        s.append("赵敏").append(100).append(true).append(10.5);//"hello,张三丰赵敏 100true10.5"
        System.out.println(s);//"hello,张三丰赵敏100true10.5"
        //删
        /*
         * 删除索引为>=start && <end 处的字符
         * 解读: 删除 11~14 的字符 [11, 14)
         */
        s.delete(11, 14);
        System.out.println(s);//"hello,张三丰赵敏true10.5"
        //改
        //老韩解读, 使用 周芷若 替换 索引 9-11 的字符 [9,11)
        s.replace(9, 11, "周芷若");
        System.out.println(s);//"hello,张三丰周芷若true10.5"
        //查找指定的子串在字符串第一次出现的索引, 如果找不到返回-1
        int indexOf = s.indexOf("张三丰");
        System.out.println(indexOf);//6
        //插
        //老韩解读, 在索引为 9 的位置插入 "赵敏",原来索引为 9 的内容自动后移
        s.insert(9, "赵敏");
        System.out.println(s);//"hello,张三丰赵敏周芷若 true10.5"
        //长度
        System.out.println(s.length());//22
        System.out.println(s);
    }
}

上面代码中出现的方法有:

s.append("赵敏").append(100).append(true).append(10.5);	// 增
s.delete(11, 14);		// 删除
s.replace(9, 11, "周芷若");		// 修改
s.indexOf("张三丰");		// 查找第一次出现的索引,找不到返回-1
s.insert(9, "赵敏");	// 插入

public class StringBufferExercise01 {
    public static void main(String[] args) {
        String str = null;
        StringBuffer sb = new StringBuffer();
        sb.append(str);		// 底层调用的是AbstractStringBuilder的appendNull
        System.out.println(sb.length());

        System.out.println(sb);
        // 会抛出空指针异常NullPointerException
        StringBuffer stringBuffer = new StringBuffer(str);
        System.out.println(stringBuffer);
    }
}

上面的两个 sout 会输出:

4
null

即 str = null 被当成了 字符串"null" 加入到 sb 中了。

StringBuffer stringBuffer = new StringBuffer(str);这一行会抛出空指针异常。

StringBuilder类

  1. 一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类因为在大多数实现中,它比StringBuffer要快
  2. 在StringBuilder上的主要操作是append和insert方法,可重载这些方法,以接受任意类型的数据。

StringBuffer 多线程
StringBuilder 单线程

StringBuilder 的方法使用和 StringBuffer 基本一样。

String、StringBuffer 和 StringBuilder 的比较

在这里插入图片描述

使用的原则, 结论:

  1. 如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder
  2. 如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder
  3. 如果字符串存在大量的修改操作,并在多线程的情况,使用StringBufer
  4. 如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等

Math类

Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

https://www.apiref.com/java11-zh/java.base/java/lang/Math.html
均为静态方法。

// random 求随机数   	返回带有正号的 double值,大于或等于 0.0且小于 1.0 。
// random 返回的是 0 <= x < 1 之间的一个随机小数 [0, 1)

// 思考: 请写出获取 a-b 之间的一个随机整数,a,b 均为整数 , 比如 a = 2, b=7
// 即返回一个数 x 2 <= x <= 7
// 解读 Math.random() * (b-a) 返回的就是 0 <= 数 <= b-a
// (1) (int)(a) <= x <= (int)(a + Math.random() * (b-a +1) )
// (2) 使用具体的数给小伙伴介绍 a = 2 b = 7
// (int)(a + Math.random() * (b-a +1) ) = (int)( 2 + Math.random()*6)
// Math.random()*6 返回的是 0 <= x < 6 小数
// 2 + Math.random()*6 返回的就是 2<= x < 8 小数

// (int)(2 + Math.random()*6) = 2 <= x <= 7
// (3) 公式就是 (int)(a + Math.random() * (b-a +1) )

Arrays类

Java 自定义排序
【Java】自定义排序
【java】数组相关知识点汇总


System类

在这里插入图片描述

package com.fwedu.system_;

import java.util.Arrays;

public class System_ {
    public static void main(String[] args) {
        int[] src = {1, 2, 3};
        int[] dest = new int[3];
        System.arraycopy(src, 0, dest, 1, 2);
        System.out.println(Arrays.toString(dest));

        System.out.println(System.currentTimeMillis());

        System.out.println("ok1");
        System.exit(0);
        System.out.println("ok2");
    }
}

输出结果为:

[0, 1, 2]
1686555181555
ok1

BigInteger和BigDeciaml类

Java【大数类】整理


日期类

第一代日期类

在这里插入图片描述

使用代码示例:

package com.fwedu.date_;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author 冯威
 */
public class Date01 {
    public static void main(String[] args) throws ParseException {
        //老韩解读
        //1. 获取当前系统时间
        //2. 这里的 Date 类是在 java.util 包
        //3. 默认输出的日期格式是国外的方式, 因此通常需要对格式进行转换
        Date d1 = new Date(); //获取当前系统时间
        System.out.println("当前日期=" + d1);
        Date d2 = new Date(9234567); //通过指定毫秒数得到时间
        System.out.println("d2=" + d2); //获取某个时间对应的毫秒数

        //老韩解读
        //1. 创建 SimpleDateFormat 对象, 可以指定相应的格式
        //2. 这里的格式使用的字母是规定好, 不能乱写
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy 年 MM 月 dd 日 hh:mm:ss E");
        String format = sdf.format(d1); // format:将日期转换成指定格式的字符串
        System.out.println("当前日期=" + format);
        //老韩解读
        //1. 可以把一个格式化的 String 转成对应的 Date
        //2. 得到 Date 仍然在输出时, 还是按照国外的形式, 如果希望指定格式输出, 需要转换
        //3. 在把 String -> Date , 使用的 sdf 格式需要和你给的 String 的格式一样, 否则会抛出转换异常
        String s = "1996 年 01 月 01 日 10:20:30 星期一";
        Date parse = sdf.parse(s);
        System.out.println("parse=" + parse);
        System.out.println("parse=" + sdf.format(parse));
    }
}

上面代码中出现的方法有:

Date d1 = new Date(); //获取当前系统时间
Date d2 = new Date(9234567); //通过指定毫秒数得到时间


SimpleDateFormat sdf = new SimpleDateFormat("yyyy 年 MM 月 dd 日 hh:mm:ss E");
String s = "1996 年 01 月 01 日 10:20:30 星期一";
Date parse = sdf.parse(s);		// 解析
System.out.println("parse=" + parse);
System.out.println("parse=" + sdf.format(parse));	// 格式化

第二代日期类

第二代日期类,主要就是Calendar类(日历)。

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar> {
}

Calendar类是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

package com.fwedu.date_;

import java.util.Calendar;

public class Calendar01 {
    public static void main(String[] args) {
        //老韩解读
        //1. Calendar 是一个抽象类, 并且构造器是 private
        //2. 可以通过 getInstance() 来获取实例
        //3. 提供大量的方法和字段提供给程序员
        //4. Calendar 没有提供对应的格式化的类, 因此需要程序员自己组合来输出(灵活)
        //5. 如果我们需要按照 24 小时进制来获取时间, Calendar.HOUR ==改成=> Calendar.HOUR_OF_DAY
        Calendar c = Calendar.getInstance(); //创建日历类对象//比较简单, 自由    (因为是抽象类所以不能new)
        System.out.println("c=" + c);
        //2.获取日历对象的某个日历字段
        System.out.println("年: " + c.get(Calendar.YEAR));
        // 这里为什么要 + 1, 因为 Calendar 返回月时候, 是按照 0 开始编号
        System.out.println("月: " + (c.get(Calendar.MONTH) + 1));
        System.out.println("日: " + c.get(Calendar.DAY_OF_MONTH));
        System.out.println("小时: " + c.get(Calendar.HOUR));
        System.out.println("分钟: " + c.get(Calendar.MINUTE));
        System.out.println("秒: " + c.get(Calendar.SECOND));
        //Calender 没有专门的格式化方法, 所以需要程序员自己来组合显示
        System.out.println(c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" +
                c.get(Calendar.DAY_OF_MONTH) +
                " " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND) );
    }
}

输出如下:
c=java.util.GregorianCalendar[time=1686564400356,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=31,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2023,MONTH=5,WEEK_OF_YEAR=24,WEEK_OF_MONTH=3,DAY_OF_MONTH=12,DAY_OF_YEAR=163,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=6,HOUR_OF_DAY=18,MINUTE=6,SECOND=40,MILLISECOND=356,ZONE_OFFSET=28800000,DST_OFFSET=0]
年: 2023
月: 6
日: 12
小时: 6
分钟: 6
秒: 40
2023-6-12 18:6:40

第三代日期类

前两代日期类的不足分析

在这里插入图片描述

package com.fwedu.date_;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;


public class LocalDateTime01 {
    public static void main(String[] args) {
        //第三代日期
        //老韩解读
        //1. 使用 now() 返回表示当前日期时间的 对象
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);
        //2. 使用 DateTimeFormatter 对象来进行格式化
        // 创建 DateTimeFormatter 对象
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        String format = dateTimeFormatter.format(ldt);
        System.out.println("格式化的日期=" + format);
        System.out.println("年=" + ldt.getYear());
        System.out.println("月=" + ldt.getMonth());
        System.out.println("月=" + ldt.getMonthValue());
        System.out.println("日=" + ldt.getDayOfMonth());
        System.out.println("时=" + ldt.getHour());
        System.out.println("分=" + ldt.getMinute());
        System.out.println("秒=" + ldt.getSecond());

        //可以获取年月日
        LocalDate now = LocalDate.now();
        //获取到时分秒
        LocalTime now2 = LocalTime.now();
        //提供 plus 和 minus 方法可以对当前时间进行加或者减
        //看看 890 天后, 是什么时候 把 年月日-时分秒
        LocalDateTime localDateTime = ldt.plusDays(890);
        System.out.println("890 天后=" + dateTimeFormatter.format(localDateTime));
        //看看在 3456 分钟前是什么时候, 把 年月日-时分秒输出
        LocalDateTime localDateTime2 = ldt.minusMinutes(3456);
        System.out.println("3456 分钟前 日期=" + dateTimeFormatter.format(localDateTime2));
    }
}

DateTimeFormatter 格式日期类

关于 DateTimeFormatter 的各个格式参数,需要看 jdk8 的文档。

import java.time.format.DateTimeFormatter;

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = dateTimeFormatter.format(ldt);

Instant 时间戳

package com.fwedu.date_;

import java.time.Instant;
import java.util.Date;

public class Instant01 {
    public static void main(String[] args) {
        //1.通过 静态方法 now() 获取表示当前时间戳的对象
        Instant now = Instant.now();
        System.out.println(now);
        //2. 通过 from 可以把 Instant 转成 Date
        Date date = Date.from(now);
        //3. 通过 date 的 toInstant() 可以把 date 转成 Instant 对象
        Instant instant = date.toInstant();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/638783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java实训日志01

文章目录 一、安装录屏软件&#xff08;一&#xff09;下载软件&#xff08;二&#xff09;安装软件 二、使用录屏软件三、安装XMind软件&#xff08;一&#xff09;下载XMind软件&#xff08;二&#xff09;安装XMind软件 四、创建思维导图&#xff08;一&#xff09;启动XMin…

如何评价广告营销效果

广告营销的目的 广义上的营销&#xff0c;2个主要目的&#xff1a;达成销售和建设品牌&#xff0c;其实后者的终极目的还是前者。销售是短期达成&#xff0c;品牌建设是长期管理。 广告是营销的一部分&#xff0c;广告的效果评估也应该从目的出发探寻方法。 网络广告的特性 网…

2023Fiddler学习笔记 -- 状态栏及辅助选项卡

接上节课内容 2023Fiddler抓包学习笔记 -- 环境配置及工具栏介绍 2023Fiddler抓包学习笔记 -- 如何在会话窗口添加ip列 一、状态栏 1、上面黑色的框框&#xff0c;可以输入相关命令实现操作&#xff0c;比如&#xff1a;bpu baidu&#xff0c;只要url里包含baidu的网站都会被…

Socket 传情:用 Python 编织 TCP 网络

文章目录 参考描述TCP 服务器端与 TCP 客户端通信的基本流程服务器端客户端 使用 socket 实现 TCP 服务器端实现监听套接字socket.socket()Socket().bind()IP 地址的选择本地回环地址某一特定 IP 地址空字符串 Socket().listen()监听套接字的实现 实现连接套接字Socket().accep…

【I2C】Linux使用GPIO模拟I2C

文章目录 1. I2C GPIO系统架构简介2. 如何使能I2C GPIO驱动2.1 config配置2.2 dts配置2.3 测试验证 3. 简单分析i2c-gpio.c驱动3.1 解析设备树3.2 配置SDA和SCL3.3 注册到i2c-algo-bit.c 4. 简单分析i2c-algo-bit.c驱动4.1 提供I2C通信时的算法4.2 注册Adapter 5. 参考资料 1. …

翻车了,被读者找出 BUG

大家好呀&#xff0c;我是小楼。 本文是上篇文章《使用增强版 singleflight 合并事件推送&#xff0c;效果炸裂&#xff01;》的续集&#xff0c;没看过前文必须要先看完才能看本文&#xff0c;实在不想看&#xff0c;拉到文章末尾&#xff0c;给我点个赞再退出吧~Doge 上篇文…

如何进行App性能测试?SoloPi是最佳选择!

目录 引言 SoloPi简介 SoloPi特点 SoloPi的主要功能 下载SoloPi 安装SoloPi 使用SoloPi进行性能测试 性能数据查看与记录 环境加压 响应耗时计算工具 注意事项 Solopi提供的各项性能指标介绍 引言 大家好&#xff01;我是凡哥。 今天我想跟你们分享一下如何进行A…

Python的接口自动化-读写excel文件

目录 引言 一、xlrd、xlwt以及xlutils安装 二、xlrd操作excel文件的数据读取 三、xlwt向excel文件写入数据 四、xlutils操作excel文件 五、封装操作excel读和写的类 引言 使用python进行接口测试时常常需要接口用例测试数据、断言接口功能、验证接口响应状态等&#xff0…

Mysql升级8.0后日期类型兼容性问题

背景 最近对原有项目数据库进行升级&#xff0c;从MySQL 5.7 升级到8.0&#xff0c;因此项目种的驱动程序也要做相应升级。 问题 一、 升级后报&#xff1a;java.time.LocalDateTime cannot be cast to java.util.Date 该问题是因为代码中使用Map类型获取查询返回值&#xf…

lightdb检测不兼容工具CheckUnsupportOracle使用说明

oracle有很多特性在lightdb无法使用&#xff0c;使用该工具可以即时扫描某个在线数据库或本地文件夹中有哪些不兼容特性&#xff0c;-a -x对oracle不兼容特性有所区别&#xff0c;扫描范围可参考后续表格。 0、使用限制 默认扫描存储过程&#xff0c;函数及包默认仅支持oracl…

19JS10——预解析

文章目录 一、预解析二、变量预解析和函数预解析三、预解析案例1、案例1&#xff1a;结果是几&#xff1f;2、案例2&#xff1a;结果是几&#xff1f;3、案例3&#xff1a;结果是几&#xff1f;4、案例4&#xff1a;结果是几&#xff1f; 目标&#xff1a; 1、预解析 2、变量预…

电脑连上wifi但显示无网解决方案分享,轻松搞定电脑上网问题

有的时候我们会遇到这样的问题&#xff1a;电脑明明连接了网络但仍不能上网&#xff0c;并且出现错误提示“WiFi已连接但没有互联网”。遇到这种情况&#xff0c;我们可以先使用另一台设备访问网络&#xff0c;看看你能否正常上网。如果也不能上网&#xff0c;可以尝试重新启动…

七牛云存储开启referer防盗链后,微信小程序访问提示403

点击七牛云存储存储桶绑定的加速域名 配置站点域名和微信小程序域名 是否允许空Referer一定要打开&#xff0c;否则小程序上的视频或图片访问时将提示403

# 如何在Git上更改本地分支名称和远程分支名称

有时候我们需要修改git分支名称&#xff0c;例如不合理的分支名称。本篇文章分享了如何轻松地修改Git本地分支名称和修改远程分支名称。 在Git中&#xff0c;通常使用分支来使开发与您的主要工作流程分开。在软件工程团队中&#xff0c;通常要实施特定的工作流程。例如&#x…

[C语言实现]数据结构之《关于我转生成队列这档事》

&#x1f970;作者: FlashRider &#x1f30f;专栏: 数据结构 &#x1f356;知识概要&#xff1a;详解队列的概念、顺序队列和链式队列的优点和缺点&#xff0c;以及代码实现。 目录 什么是队列&#xff1f; 选择什么结构来实现队列&#xff1f; 链式队列的实现 队列的结构…

在UE中使用Stencil功能

Stencil是指利用深度buffer的后8位数据进行bit mask信息的绘制&#xff0c;从而制作类似角色mask遮罩等效果&#xff0c;下面就在UE中进行制作。 1.首先在Project Settings项目设置中开启stencil&#xff0c;搜索stencil关键字在Custom Depth Stencil Pass选项中设置为Enabled…

PNAS:勘探地球物理学论文

阅读 《Sensing prior constraints in deep neural networks for solving exploration geophysical problems dendrimers》 题目译为《深度神经网络中用于解决勘探地球物理问题的感知先验约束》 研究意义 该研究提出三种可能的策略&#xff0c;以有效地讲地质和/或地球物理约…

面试官再问分布式事务,三天吃透这份至尊级学习笔记怼他

分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。简单的说&#xff0c;就是一次大的操作由不同的小操作组成&#xff0c;这些小的操作分布在不同的服务器上&#xff0c;且属于不同的应用&#xff0c;分布式…

ABAP 新语法--Open SQL(草稿)

1. 常量 1.1 常量赋值 常量字段可以用来为内表中的部分字段赋初始值&#xff0c;字段类型和长度依据输入常量的值决定 SELECTmara~matnr, " 物料号mara~matkl, " 物料组mara~mtart, " 物料类型 AS lkenz, " 删除标识&#xff0c;常量空字符串123 AS fla…

QCon高分演讲:火山引擎容器技术在边缘计算场景下的应用实践与探索

近日&#xff0c;火山引擎边缘云原生团队的同学在QCon全球软件开发大会上分享了火山引擎容器技术在边缘计算场景下的应用实践与探索&#xff0c;并在一众AIGC、LLM等当下热门议题中脱颖而出&#xff0c;入选观众满意度投票中“叫好又叫座议题Top5”。 以下是演讲全文&#xff1…