Java开发工具积累(符合阿里巴巴手册规范)

文章目录

  • 一、命名规约
  • 二、集合篇
    • 1. 栈、队列、双端队列
    • 2. List的升序倒序
    • 3. Map的升序降序
    • 4. 二维数组排序
    • 5. 集合之间的转换
    • 6. Map键值对遍历
  • 三、并发篇
    • 1. 创建线程池
    • 2. ThreadLocal的使用
  • 四、时间篇
    • 1. LocalDateTime的使用
    • 2. String、Date、LocalDateTime转换
  • 五、控制块
    • 1. switch
    • 2. 三目运算
    • 3. 循环体
    • 4. try-catch-finally-return
  • 六、其他
    • 1. 正则表达式
    • 2. BeanUtil的copy

一、命名规约

A) 各类命名方法
类名:UserControllerUserServiceUserMapper
模型名:UserUserDTOUserVO
对象名:userController
常量名:USER_NAMEB) Service/DAO 层方法命名规约
1) 获取单个对象的方法用 get 做前缀。
2) 获取多个对象的方法用 list 做前缀,复数结尾,如:listObjects。
3) 获取统计值的方法用 count 做前缀。
4) 插入的方法用 save/insert 做前缀。
5) 删除的方法用 remove/delete 做前缀。
6) 修改的方法用 update 做前缀。注意:POJO 类中布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。

二、集合篇

1. 栈、队列、双端队列

        Stack<Integer> stack = new Stack<>();       // 栈stack.push(1);      // 压入stack.pop();    // 弹出stack.peek();   // 获取但不弹出Queue<Integer> queue = new ArrayDeque<>();  //队列queue.offer(1);     //压入queue.poll();   // 弹出queue.peek();   // 获取但不弹出Deque<Integer> deque = new ArrayDeque<>();  // 双端队列deque.offerFirst(1);    // 压入队头deque.offerLast(2);     // 压入对尾deque.pollFirst();         // 弹出队头deque.pollLast();          // 弹出队尾deque.peekFirst();         // 获取队头但不弹出deque.peekLast();          // 获取队尾但不弹出

2. List的升序倒序

        List<Integer> list = Arrays.asList(10,1,6,4,8,7,9,3,2,5);System.out.println("原始数据:");list.forEach(n ->{System.out.print(n+", ");});System.out.println("");System.out.println("升序排列:");Collections.sort(list); // 升序排列list.forEach(n ->{System.out.print(n+", ");});// 降序的话:需要先升序再倒序,才能有降序的结果System.out.println("");System.out.println("降序排列:");Collections.reverse(list); // 倒序排列list.forEach(n ->{System.out.print(n+", ");});

3. Map的升序降序

        Map<Integer, String> map = new HashMap<>();map.put(100, "I'am a");map.put(99, "I'am c");map.put(2, "I'am d");map.put(33, "I'am b");// 按照value进行倒排,如果要根据key进行排序的话使用Map.Entry.comparingByKey()map.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue())).forEach(System.out::println);// 根据value进行正序排序,根据key进行排序的话使用comparingByKey()map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(System.out::println);// 如果要将排序的结果返回的话,我们可以使用下面的方法(注意:要使用LinkedHashMap进行保存,linkedHashMap可以保存插入顺序)Map<Integer, String> resultMap1 = map.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (s, s2) -> s,LinkedHashMap::new));// 下面的这种写法同上面的写法,只不过是将简写展开了,这样更易于理解Map<Integer, String> resultMap = map.entrySet().stream().sorted(Map.Entry.comparingByValue()).collect(Collectors.toMap(new Function<Map.Entry<Integer, String>, Integer>() {@Overridepublic Integer apply(Map.Entry<Integer, String> integerStringEntry) {return integerStringEntry.getKey();}}, new Function<Map.Entry<Integer, String>, String>() {@Overridepublic String apply(Map.Entry<Integer, String> integerStringEntry) {return integerStringEntry.getValue();}}, new BinaryOperator<String>() {@Overridepublic String apply(String s, String s2) {return s;}}, new Supplier<Map<Integer, String>>() {@Overridepublic Map<Integer, String> get() {return new LinkedHashMap<>();}}));// 同样如果需要将排序的将结果作为Map进行返回我们还可以使用下面的方法,但是不推荐这种方式(effectivejava 178页中说:foreach操作应该只用于报告stream计算的结果,而不是执行计算)Map<Integer, String> result2 = new LinkedHashMap<>();map.entrySet().stream().sorted(Map.Entry.comparingByValue()).forEach(new Consumer<Map.Entry<Integer, String>>() {@Overridepublic void accept(Map.Entry<Integer, String> integerStringEntry) {result2.put(integerStringEntry.getKey(), integerStringEntry.getValue());}});

4. 二维数组排序

Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] interval1, int[] interval2) {return interval1[0] - interval2[0];}});

5. 集合之间的转换

// Object转基本元素
List<String> tableNames=list.stream().map(User::getMessage).collect(Collectors.toList());// Object转Map
Map<String, Account> map = accounts.stream().collect(Collectors.toMap(Account::getUsername, Function.identity(), (key1, key2) -> key2));// Object转Map
/** * 1. 避免key重复* 在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时,一定要使* 用含有参数类型为 BinaryOperator,参数名为 mergeFunction 的方法,否则当出现相同 key* 值时会抛出 IllegalStateException 异常。* 说明:参数 mergeFunction 的作用是当出现 key 重复时,自定义对 value 的处理策略* 2. 避免值为null* 在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时,一定要注*	意当 value 为 null 时会抛 NPE 异常。
**/
Map<Long, String> getIdNameMap = accounts.stream().collect(Collectors.toMap(Account::getId, Account::getUsernamee, (v1, v2) -> v2));// String转Long
List<Long>=stringList.stream().map(Long::valueOf).collect(Collectors.toList());// Long转String
List<String>=longList.stream().map(String::valueOf).collect(Collectors.toList());// Integer转Long
List<Long> listLong = JSONArray.parseArray(listInt.toString(),Long.class);// Long 转Integer
List<Integer> integerList = JSONArray.parseArray(LongList.toString(), Integer.class);
// 或者
List<Integer> integerList = longList.stream().map(x -> Integer.valueOf(String.valueOf(x))).collect(Collectors.toList());// JSONArray转List
JSONArray jsonArray = updateApplicationSchemaDTO.getJSONArray("configTrophyDTOList");
configTrophyDTOList = jsonArray.toJavaList(ConfigTrophyDTO.class);// List转数组
String[] array = list.toArray(new String[0]);// 数组转List
List list = Arrays.asList(strArray);

6. Map键值对遍历

System.out.println("====4、通过entrySet()获得key-value值——使用迭代器遍历====");
Set set1 = hashMap.entrySet();
Iterator iterator1 = set1.iterator();
while(iterator1.hasNext()){Object itset = iterator1.next();Map.Entry entry = (Map.Entry) itset;System.out.println(entry.getKey()+"-"+entry.getValue());
}

三、并发篇

1. 创建线程池

ThreadPoolExecutor 参数介绍

 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {}

参数 1:corePoolSize
核心线程数,线程池中始终存活的线程数。

参数 2:maximumPoolSize
最大线程数,线程池中允许的最大线程数,当线程池的任务队列满了之后可以创建的最大线程数。

参数 3:keepAliveTime
最大线程数可以存活的时间,当线程中没有任务执行时,最大线程就会销毁一部分,最终保持核心线程数量的线程。

参数 4:unit:
单位是和参数 3 存活时间配合使用的,合在一起用于设定线程的存活时间 ,参数 keepAliveTime 的时间单位有以下 7 种可选:

TimeUnit.DAYS:天
TimeUnit.HOURS:小时
TimeUnit.MINUTES:分
TimeUnit.SECONDS:秒
TimeUnit.MILLISECONDS:毫秒
TimeUnit.MICROSECONDS:微妙
TimeUnit.NANOSECONDS:纳秒

参数 5:workQueue
一个阻塞队列,用来存储线程池等待执行的任务,均为线程安全,它包含以下 7 种类型:较常用的是 LinkedBlockingQueue 和 Synchronous,线程池的排队策略与 BlockingQueue 有关。

ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue:一个由链表结构组成的有界阻塞队列。
SynchronousQueue:一个不存储元素的阻塞队列,即直接提交给线程不保持它们。
PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列,只有在延迟期满时才能从中提取元素。
LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。与SynchronousQueue类似,还含有非阻塞方法。
LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。

参数 6:threadFactory
线程工厂,主要用来创建线程,默认为正常优先级、非守护线程。

参数 7:handler
拒绝策略,拒绝处理任务时的策略,系统提供了 4 种可选:默认策略为 AbortPolicy。

AbortPolicy:拒绝并抛出异常。
CallerRunsPolicy:使用当前调用的线程来执行此任务。
DiscardOldestPolicy:抛弃队列头部(最旧)的一个任务,并执行当前任务。
DiscardPolicy:忽略并抛弃当前任务。

ThreadPoolExecutor执行流程
ThreadPoolExecutor 关键节点的执行流程如下:

  • 当线程数小于核心线程数时,创建线程。
  • 当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列。
  • 当线程数大于等于核心线程数,且任务队列已满:若线程数小于最大线程数,创建线程;若线程数等于最大线程数,抛出异常,拒绝任务。
    在这里插入图片描述

ThreadPoolExecutor自定义拒绝策略

public static void main(String[] args) {// 任务的具体方法Runnable runnable = new Runnable() {@Overridepublic void run() {System.out.println("当前任务被执行,执行时间:" + new Date() +" 执行线程:" + Thread.currentThread().getName());try {// 等待 1sTimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}}};// 创建线程,线程的任务队列的长度为 1ThreadPoolExecutor threadPool = new ThreadPoolExecutor(1, 1,100, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1),new RejectedExecutionHandler() {@Overridepublic void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {// 执行自定义拒绝策略的相关操作System.out.println("我是自定义拒绝策略~");}});// 添加并执行 4 个任务threadPool.execute(runnable);threadPool.execute(runnable);threadPool.execute(runnable);threadPool.execute(runnable);
}

在这里插入图片描述

2. ThreadLocal的使用

/**
ThreadLocal的api很简单,就4个* get——获取threadlocal局部变量* set——设置threadlocal局部变量* initialvalue——设置局部变量的初始值* remove——删除该局部变量
**/
public class SequenceNumber {  // ThreadLocal 对象使用 static 修饰,ThreadLocal 无法解决共享对象的更新问题。private static ThreadLocal<Integer> seqNum = new ThreadLocal<Integer>(){  public Integer initialValue(){  return 0;  }  };  public int getNextNum() {  seqNum.set(seqNum.get() + 1);  return seqNum.get();  }  public static void main(String[] args) {  SequenceNumber sn = new SequenceNumber();  TestClient t1  = new TestClient(sn);  TestClient t2  = new TestClient(sn);  TestClient t3  = new TestClient(sn);  t1.start();  t2.start();  t3.start();  t1.print();  t2.print();  t3.print();   }  
}private static class TestClient extends Thread {  private SequenceNumber sn;  public TestClient(SequenceNumber sn ) {  this.sn = sn;  }  public void run() {  for(int i=0; i< 3; i++) {  System.out.println( Thread.currentThread().getName()  + " --> " + sn.getNextNum());  }  }  public void print() {  for(int i=0; i< 3; i++) {  System.out.println( Thread.currentThread().getName()  + " --> " + sn.getNextNum());  }  }  
}  
Thread-2 --> 1  
Thread-2 --> 2  
Thread-2 --> 3  
Thread-0 --> 1  
Thread-0 --> 2  
Thread-0 --> 3  
Thread-1 --> 1  
Thread-1 --> 2  
Thread-1 --> 3  
main --> 1  
main --> 2  
main --> 3  
main --> 4  
main --> 5  
main --> 6  
main --> 7  
main --> 8  
main --> 9  

结论:可以发现,static的ThreadLocal变量是一个与线程相关的静态变量,即一个线程内,static变量是被各个实例共同引用的,但是不同线程内,static变量是隔开的。

四、时间篇

1. LocalDateTime的使用

// 获取当前时间
LocalDateTime now = LocalDateTime.now();// 获取指定时间
LocalDateTime localDateTime = LocalDateTime.of(2021, 6, 16, 16, 37, 20, 814 * 1000 * 1000);
LocalDateTime ldt = LocalDateTime.now().withYear(2021).withMonth(6).withDayOfMonth(16).withHour(10).withMinute(10).withSecond(59).withNano(999 * 1000 * 1000);// 获取指定时区时间
LocalDateTime datetime = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
LocalDateTime datetime2 = LocalDateTime.now(ZoneId.of("+8"));// 获取年月日信息
LocalDateTime now = LocalDateTime.now();
int year = now.getYear();
int month = now.getMonthValue();
int dayOfYear = now.getDayOfYear();
int dayOfMonth = now.getDayOfMonth();
int hour = now.getHour();
int minute = now.getMinute();
int second = now.getSecond();
int nano = now.getNano();// 日期计算
LocalDateTime now = LocalDateTime.now();
LocalDateTime tomorrow = now.plusDays(1L);
tomorrow = tomorrow.plusHours(2L);
tomorrow = tomorrow.plusMinutes(10L);LocalDateTime yesterday = now.minus(Duration.ofDays(1));
yesterday = yesterday.plusHours(2L);
yesterday = yesterday.plusMinutes(10L);// 时间格式化,DateTimeFormatter是线程安全的类。
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String format = LocalDateTime.now().format(df);

2. String、Date、LocalDateTime转换

// LocalDateTime转Date
public static Date localDateTime2Date(LocalDateTime localDateTime) {return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}// LocalDateTime转String
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static String localDateTime2String(LocalDateTime localDateTime) {return localDateTime.format(DATE_TIME_FORMATTER);
}// String 转 LocalDateTime,DateTimeFormatter是线程安全的类,可以将此类放到常量中。
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
public static LocalDateTime string2LocalDateTime(String str) {return LocalDateTime.parse(str, DATE_TIME_FORMATTER);
}// String 转 Date,SimpleDateFormat是非线程安全的类,在多线程操作时会报错。
public static Date string2Date(String str) throws ParseException {SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return simpleDateFormat.parse(str);
}// Date 转 LocalDateTime
public static LocalDateTime date2LocalDateTime(Date date) {return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}// Date 转 String
public static String date2String(Date date) {SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return formatter.format(date);
}

五、控制块

1. switch

public class SwitchString {public static void main(String[] args) {method("sth");}public static void method(String param) {// 1. 当 switch 括号内的变量类型为 String 并且为外部参数时,必须先进行 null判断。if(StringUtils.isEmpty(param)){return;}switch(param){case"sth": System.out.printin("it's sth"); break;case"sb": System.out.println("it's sb"); break;// 2. 在一个 switch 块内,都必须包含一个 default语句并且放在最后default: System.out.println("default"); break;}}
}

2. 三目运算

三目运算符 condition? 表达式 1 : 表达式 2 中,高度注意表达式 1 和 2 在类型对齐 时,可能抛出因自动拆箱导致的 NPE 异常。

// 反例
Integer a = 1;
Integer b = 2;
Integer c = null;
Boolean flag = false;
// a*b 的结果是 int 类型,那么 c 会强制拆箱成 int 类型,抛出 NPE 异常
Integer result=(flag? a*b : c);

3. 循环体

1. 循环体中的语句要考量性能,以下操作尽量移至循环体外处理,如定义对象、变量、 获取数据库连接,进行不必要的 try-catch 操作(这个 try-catch 是否可以移至循环体外)

4. try-catch-finally-return

  • return的执行优先级高于finally的执行优先级,但是return语句执行完毕之后并不会马上结束函数,而是将结果保存到栈帧中的局部变量表中,然后继续执行finally块中的语句;
  • 如果finally块中包含return语句,则不会对try块中要返回的值进行保护,而是直接跳到finally语句中执行,并最后在finally语句中返回,返回值是在finally块中改变之后的值
// return 1
public static int test1() {int x = 1;try {return x;} finally {x = 2;}
}// return 2
public static int test2() {int x = 1;try {return x;} finally {x = 2;return x;}
}

六、其他

1. 正则表达式

在使用正则表达式时,利用好其预编译功能,可以有效加快正则匹配速度。

// 反例
public void addSyncConfigToCache(String configName, ESSyncConfig config) {Pattern pattern = Pattern.compile(".*:(.*)://.*/(.*)\\?.*$");Matcher matcher = pattern.matcher(dataSource.getUrl());
}// 正例
private static final Pattern pattern = Pattern.compile(regexRule);
public void addSyncConfigToCache(String configName, ESSyncConfig config) {Matcher matcher = pattern.matcher(dataSource.getUrl());
}

2. BeanUtil的copy

Apache BeanUtils 性能较差,可以使用其他方案比如 Spring BeanUtils, Cglib BeanCopier,注意
均是浅拷贝。

Person source = Person("Alice", 25);
Person destination = new Person();
BeanUtils.copyProperties(destination, source);

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

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

相关文章

【Hive】——DDL(TABLE)

1 查询指定表的元数据信息 如果指定了EXTENDED关键字&#xff0c;则它将以Thrift序列化形式显示表的所有元数据。 如果指定了FORMATTED关键字&#xff0c;则它将以表格格式显示元数据。 describe formatted student&#xff1b;2 删除表 如果已配置垃圾桶且未指定PURGE&…

220V转3.3V单片机电源供电芯片WT5107

220V转3.3V单片机电源供电芯片WT5107 今天给大家介绍一款高效、精准的开关电源恒压控制驱动芯片WT5107。 WT5107适用于85VAC~265VAC全范围输入电压的非隔离Buck、Buckboost拓扑结构&#xff0c;220V降3.3V适用于小家电、白色家电等电源的驱动。WT5107内部集成高压功率管&#…

C#Winform+DevExpress打开相机拍照功能实例

1&#xff0c;先展示一下界面&#xff0c;点击打开相机会打开另一个界面 如下所示&#xff1b; 2&#xff0c;点击上图拍照 按钮 会把图片显示在第一个界面上 3&#xff0c; Dev还可以打开指定的相机&#xff0c;比如只打开平板电脑的后置摄像头 以Microsoft 为例 点击打开…

服务器数据恢复-EqualLogic PS存储硬盘坏道导致存储不可用的数据恢复案例

服务器数据恢复环境&#xff1a; 一台DELL EqualLogic PS系列存储&#xff0c;存储中有一组由16块SAS硬盘组成的RAID5。上层是VMFS文件系统&#xff0c;存放虚拟机文件。存储上层分了4个卷。 服务器故障&检测&#xff1a; 存储上有2个硬盘指示灯显示黄色&#xff0c;磁盘出…

华为数通——企业双出口冗余

目标&#xff1a;默认数据全部经过移动上网&#xff0c;联通低带宽。 R1 [ ]ip route-static 0.0.0.0 24 12.1.1.2 目的地址 掩码 下一条 [ ]ip route-static 0.0.0.0 24 13.1.1.3 preference 65 目的地址 掩码 下一条 设置优先级为65 R…

word2vec,BERT,GPT相关概念

词嵌入&#xff08;Word Embeddings&#xff09; 词嵌入通常是针对单个词元&#xff08;如单词、字符或子词&#xff09;的。然而&#xff0c;OpenAI 使用的是预训练的 Transformer 模型&#xff08;如 GPT 和 BERT&#xff09;&#xff0c;这些模型不仅可以为单个词元生成嵌入…

高空抛物屡禁不止?智能分析视频监控如何保障空中安全?

日前&#xff0c;长春高空抛物事件已经落下帷幕&#xff0c;此事件的爆出一时间轰动全网&#xff0c;周某漠视他人生命的行为令人愤怒&#xff0c;而年轻女孩的生命也被无情剥夺。为什么高空抛物事件如此频繁&#xff0c;还屡禁不止呢&#xff1f;面对这样令人痛心的新闻作为智…

锁--07_1----插入意向锁-Insert加锁过程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 插入意向锁MySQL执行插入Insert时的加锁过程MySQL官方文档MySQL insert加锁流程1.加插入意向锁2.判断插入记录是否有唯一键3. 插入记录并对记录加X锁插入意向锁----…

统一观测丨使用 Prometheus 监控 Memcached 最佳实践

作者&#xff1a;啃唯 Memcached 简介 Memcached 是什么&#xff1f; Memcached 是一个免费开源、高性能、分布式内存对象缓存系统&#xff0c;支持将任意数据类型的 chunk 数据以键值对的方式存储。本质上 Memcached 是通用于所有的应用的&#xff0c;但最初用于存储被经常…

GD32F4标准外设库

学习目标 了解标准库来源熟悉模板搭建流程掌握在已有模板基础下进行开发学习内容 标准外设库获取 标准固件库获取我们可以从官网进行下载。 下载链接:兆易创新GigaDevice-资料下载兆易创新GD32 MCU 找到 GD32F4xx Firmware Library 这个压缩包 下载完成后,进行解压,解压…

【期末复习向】n元gram的应用

当 n 1 时&#xff0c; 即出现 在 第 i 位 上 的基 元 w i 独 立于 历 史 。 一元文法也 被 写 为 uni-gram 或 monogram&#xff1b; 当 n 2 时 , 2-gram ( bi-gram ) 被称 为 1 阶 马 尔 可夫 链&#xff1b; 当 n 3 时 , 3-gram( tri-gram ) 被称为 2 阶马尔 可 夫 链 &am…

人工智能多模态:看、听、说,智能感知的全方位融合

导言 人工智能多模态技术是指通过整合视觉、听觉、语言等多个感知模态的信息&#xff0c;实现对丰富、多样化数据的理解与处理。本文将深入研究人工智能多模态的技术原理、应用场景以及对未来感知智能的影响。 1. 简介 人工智能多模态技术通过整合多个感知模态的信息&#xff…

红帽认证RHCE9.0版本2023年12月的红帽9.0版本RHCSA题⽬+答案,本人已过,全国通用

红帽认证9版本2023年12月的红帽9.0版本RHCSA题⽬答案&#xff0c;本人已过&#xff0c;全国通用 需要完整的RHCSA和RHCE的考试答案的题目以及RHCE9考试的模拟环境和考试笔记教材的请添加微信&#xff0c;需备注来自csdn&#xff0c;不然通不过 1、配置⽹络设置? 将?node1?…

「Verilog学习笔记」RAM的简单实现

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1ns module ram_mod(input clk,input rst_n,input write_en,input [7:0]write_addr,input [3:0]write_data,input read_en,input [7:0]read_addr,output reg…

关于uview-ui的u-tabs标签滑块不居中的问题

在uniapp中&#xff0c;打开文件 uni_modules/uview-ui/components/u-tabs/u-tabs.vue 然后在style中添加以下代码即可 /deep/ .u-tabs__wrapper__nav__line {left: 18rpx; } 之前效果图&#xff1a; 之后效果图&#xff1a; 注意&#xff0c;代码中的18rpx需要自行调整

语音机器人话术设计重点

要使用语音机器人&#xff0c;首先得要先准备一套业务的话术脚本&#xff0c;这个话术脚本的设计&#xff0c;可能直接决定了语音机器人后续的使用效果。这个脚本的编写一般不是机器人厂家直接能完成的&#xff0c;只有业务的使用方&#xff0c;他们才最了解自己的业务&#xf…

报错“找不到mfc100u.dll,程序无法继续执行”的解决方法,完美解决

在软件操作过程中&#xff0c;部分用户可能遇到"计算机缺失mfc140u.dll导致无法启动程序"的困扰。这种情况常常发生在启动某特定应用&#xff0c;特别是需要VC Redistributable支持的软件时。以下为详尽解决策略&#xff0c;让用户轻松应对这类技术难题&#xff0c;重…

【1】自动化测试环境配置(ARM服务器)

想要从事 or 了解自动化测试开发、装备开发的小伙伴&#xff0c;本专栏内容将从0到1学习如何针对ARM服务器产品进行自动化测试平台的搭建&#xff0c;包括&#xff1a;测试界面的实现&#xff08;GUI&#xff09;、测试项的功能实现&#xff08;压力测试、接口测试、版本更新&a…

LeetCode 每日一题 Day 12 (Hard)|| 二维前缀和二维差分

2132. 用邮票贴满网格图 给你一个m x n的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&#xff09;。 给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩阵中&#xff0c;且满足以下 限制 和 …

PhotoMaker——通过堆叠 ID 嵌入定制逼真的人像照片

论文网址链接&#xff1a;https://arxiv.org/abs/2312.04461 详情网址链接&#xff1a;PhotoMaker 开源代码网址链接&#xff1a;GitHub - TencentARC/PhotoMaker: PhotoMaker 文本到图像AI生成的最新进展在根据给定文本提示合成逼真的人类照片方面取得了显着进展。然而&#…