日常开发中代码技巧(个人使用)

news2024/12/23 23:20:27

日常开发中代码技巧

String,StringBuffer判断非空


  • String判断非空

    参考:https://blog.csdn.net/Echo_width/article/details/79653704

    首先,区分空串和null串

    • 1 空串""是长度为0的字符串,它有自己的串长度(0)和内容(空),判断一个字符串为空的方法:

      //
      if (str.length() == 0);
      //变式
      if (str.equals(""));
      
    • 2、 null串表示目前没有任何对象与该变量关联,检查一个字符串是否为null的方法:

       if (str == null);
      
    • 3、检查一个字符串既不是null串也不是空串,多用以下方法判断:

      if (str != null && str.length() != 0);
      

      注意:要先检查str不为null,否则在一个null值上调length()方法会出现错误。

    • 4、使用StringUtils工具类,判断不为null也不是空,如下:

      if (StringUtils.isNotBlank(str))
      
  • StringBuffer判断非空

    很简单,一种是利用StringBuffer的length()判断,另一种事转换为String判断

    //1.
    if(stringBuffer.length() > 0){
        System.out.println("非空")
    }
    //2.
    

List转数组和数组转List


List转换为数组


很简单 一句话就解决了 主要有两种方法 这两种方法本质上是一样的 只不过是写法不同而已

  1. 使用Stream

    String[] ss = list.stream().toArray(String[]::new);
    
  2. 使用List中的toArray()方法

    String[] sss = list.toArray(new String[listStrings.size()]);
    

举个实例:

 public void listTransArrayTest() {
        //先初始化集合
        List<Seckill> seckillList = new ArrayList<>(15);
        Date time = new Date(System.currentTimeMillis());
        long seckillId = 1001l;
        System.out.println("=========集合转换为数组===========");
        for (int i = 0; i <= 10; i++) {
            Seckill seckill = new Seckill(seckillId, "秒杀" + i, i, time, time, time);
            seckillList.add(seckill);
            seckillId++;
        }

        //转换方式1
//        Seckill[] result = seckillList.toArray(new Seckill[seckillList.size()]);
        //转换方式2 使用jdk1.8的stream流
        Seckill[] result = seckillList.stream().toArray(Seckill[]::new);
        System.out.println("转换成功 开始显示转换后的数组");
        for (Seckill seckill : result) {
            System.out.println(seckill);
        }

数组转换为List


这里有一个坑 等下再详细说

可能很多人都会直接想到下面这种方法

        String[] arrays = new String[]{"a", "b", "c"};
        List<String> listStrings = Arrays.asList(arrays);

但是这里有两个坑

  • 一是asList转换的是基本类型的数组的话,如int[] 转换失败 转换后的集合只有一个元素;

  • 二是asList转换后的集合不能add和remove的 因为asList转换后的集合类型并不是java.util.ArrayList,而是Arrays的一个内部类,这个内部类并没有add方法。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    在这里插入图片描述

    这个内部类的方法及属性如下。可以看到并没有add(),remove()。而set(int index,E element)修改方法但是有

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
    在这里插入图片描述

如果你想转换后的list可以add或者remove,那就使用下面的方法:

/*方法一*/
ArrayList<Integer> copyArrays=new ArrayList<>(Arrays.asList(integerArray));
 
/*方法二*/
List<Integer> integerList = new ArrayList<>();
Collections.addAll(integerList, integerArray);

参考博客:https://blog.csdn.net/weixin_41835612/article/details/83611082

位运算的实用技巧


1. 求奇数偶数


(n&1) == 0 这个表示偶数

2. 交换两个数


a ^= b;
b ^= a;
a ^= b;

参考博客:https://blog.yangx.site/2016/07/06/bit-operation-skills/ 或者到印象笔记那找

位进制转换


  1. 16进制转10进制

    Integer.parseInt("0xAA".substring(2));
    
  2. 10进制 转16进制

    Integer.toHexString(56);
    

mybatis的时间类型数据转换问题


字符串常见操作


按照某些字符进行分割截取


比如按照空格进行分割,StringUtils中封装了很多截取操作

mysql相关操作


主要是将平时遇到的有用的sql语句记录下来

比较两个select结果集中不一样的数据

比如我现在有两个

使用instr和concat完成模糊查询

使用INSTR和concat可以完成模糊查询,主要的作用是用于查询那种字段中有特殊字符分隔开值的,比如username中多个名字之间用,分割开。当然使用like也可以,只不过这也是一种方式。

下面是这两个函数的定义

INSTR

INSTR()函数返回字符串中子字符串第一次出现的位置。如果在str中找不到子字符串,则INSTR()函数返回零(0)。

下面说明了INSTR函数的语法。

INSTR(str,substr);

INSTR函数接受两个参数:

  • str是要搜索的字符串。
  • substr是要搜索的子字符串。

INSTR()函数不区分大小写。这意味着如果通过小写,大写,标题大小写等,结果总是一样的。

CONCAT:

连接字符串的函数

使用方式

  and  INSTR(CONCAT(',',#{reqid},','),CONCAT(",",t1.linkreqid,","))

springboot下的文件下载功能


https://blog.csdn.net/qq_15329947/article/details/100894906#commentBox

这是原文:https://www.callicoder.com/spring-boot-file-upload-download-rest-api-example/(原文中除了下载功能还有上传功能)

List.sort(Compareable compa)


背景:

有时候有一些比较复杂的排序方法我们不好用stream流的方式 只好用

数据库操作


将查询结果的某一列作为条件

当你使用下面的语句时会报错

delete FROM sys_xm_role where xmroleid in (
	select a.xmroleid from (
				select xmroleid,username
				from sys_xm_role 
				group by projid,roleid HAVING COUNT(projid) >1 and COUNT(roleid)  > 1)a				
)

报错信息:You can’t specify target table ‘sys_xm_role’ for update in FROM clause

在这里插入图片描述

正确的做法是:

delete FROM sys_xm_role where xmroleid in (
	select a.xmroleid from (
			select xmroleid
			from sys_xm_role 
			group by projid,roleid HAVING COUNT(projid) >1 and COUNT(roleid)  > 1)a
	)

集合的相关操作


参考:https://blog.csdn.net/qq_41902662/article/details/113843735

集合倒序输出


最简单的是这个

Collections.reverse(vsImVos);

这个排序的依据是集合里对象本身

这个应该是需要对象实现compare接口,或者要么就实现.equal方法

HashMap的遍历


很多种方式 但是还是Entry.entry最快速并且安全

java 8 stream:去重,排序,筛选,分组,聚合计算

流是从支持数据处理操作的源生成的元素序列,源可以是数组、文件、集合、函数。流不是集合元素,它不是数据结构并不保存数据,它的主要目的在于计算

  • 测试对象和数据
/**
 * @Description   :  stream流测试对象
 */
//允许链式set
@Accessors(chain = true)
@Data
public class StreamDto {

    private String name;
    private String addr;
    private Integer age;
    private Date birthDay;
    private BigDecimal money;

    public StreamDto(String name, String addr, Integer age, Date birthDay, BigDecimal money) {
        this.name = name;
        this.addr = addr;
        this.age = age;
        this.birthDay = birthDay;
        this.money = money;
    }

    public StreamDto() {
    }
}

    StreamDto d1 = new StreamDto();
    d1.setName("a").setAddr("北京").setAge(20)
            .setBirthDay(DateUtil.parse("2020-10-12")).setMoney(new BigDecimal(3));
    StreamDto d2 = new StreamDto();
    d2.setName("a").setAddr("南京").setAge(12)
            .setBirthDay(DateUtil.parse("2020-10-13")).setMoney(new BigDecimal(1));
    StreamDto d3 = new StreamDto();
    d3.setName("b").setAddr("北京").setAge(23)
            .setBirthDay(DateUtil.parse("2020-10-11")).setMoney(new BigDecimal(2));
    List<StreamDto> list = CollUtil.toList(d1,d2,d3);
    System.out.println("原始List=="+list.toString());

List排序


  • 不用stream 排序

      //age升序
      list.sort(Comparator.comparing(StreamDto::getAge));
      //age降序
      list.sort(Comparator.comparing(StreamDto::getAge).reversed());
      //正序排序,并将null放在最后(搭配reversed()就变成倒序):小->大->null
      list.sort(Comparator.comparing(StreamDto::getBirthday, 
                                   Comparator.nullsLast(Date::compareTo)));
      //先正序排序,并将null放在最前,搭配reversed()翻转就变成倒序:大->小->null
      list.sort(Comparator.comparing(StreamDto::getBirthday, 
                                   Comparator.nullsFirst(Date::compareTo)).reversed());
      //先后排序
      list.sort(Comparator.comparing(StreamDto::getAge).reversed()
                .thenComparing(Comparator.comparing(StreamDto::getName).reversed())
                .thenComparing(Comparator.comparing(StreamDto::getAddr).reversed()));
    
    
  • 使用stream

        //age升序
        List<StreamDto> l1 = list.stream().sorted(Comparator.comparing(StreamDto::getAge))
            					.collect(Collectors.toList());
        //age降序
        l1 = list.stream().sorted(Comparator.comparing(StreamDto::getAge).reversed())
            					.collect(Collectors.toList());
        //正序排序,并将null放在最后(搭配reversed()就变成倒序):小->大->null
        l2 = list.stream().sorted(Comparator.comparing(StreamDto::getBirthday, 
                                   Comparator.nullsLast(Date::compareTo))).collect(Collectors.toList());
        //先正序排序,并将null放在最前,搭配reversed()翻转就变成倒序:大->小->null
        l3 = list.stream().sorted(Comparator.comparing(StreamDto::getBirthday, 
                                   Comparator.nullsFirst(Date::compareTo)).reversed()).collect(Collectors.toList());
    
    

List 聚合计算


//包含了: 计数,最大,最小,求和,平均数, 每种方式都有单独的方式实现
DoubleSummaryStatistics statistics = list.stream()
    .collect(Collectors.summarizingDouble(StreamDto::getAge));
System.out.println("count:" + statistics.getCount() + ",max:" + statistics.getMax() + ",min=:" + statistics.getMin() + ",sum:" + statistics.getSum() + ",average:" + statistics.getAverage());
//count:3,max:23.0,min=:12.0,sum:55.0,average:18.333333333333332

//计数:
long count = list.stream().count();//3

//最大/最小,两种方式:
//sorted: 先按年龄降序排列后取第一个,同理最小则升序取第一
Integer max = list.stream().sorted(Comparator.comparing(StreamDto::getAge).reversed()).map(StreamDto::getAge).findFirst().get();
System.out.println("max = " + max);
//min/max
Integer min = list.stream().min(Comparator.comparing(StreamDto::getAge)).get().getAge();
System.out.println("min = " + min);

//求和
Integer sum1 = list.stream().collect(Collectors.summingInt(StreamDto::getAge));
Integer sum2 = list.stream().map(StreamDto::getAge).reduce(Integer::sum).get();

//平均数
Double collect2 = list.stream().collect(Collectors.averagingInt(StreamDto::getAge));
double asDouble = list.stream().mapToLong(StreamDto::getAge).average().getAsDouble();
double asDouble1 = list.stream().mapToInt(StreamDto::getAge).average().getAsDouble();
//...

List条件筛选


    List<StreamDto> l1 = null;
    //条件筛选
    l1 = list.stream().filter(b -> b.getAge() > 15).collect(Collectors.toList());
    //多条件
    l1 = list.stream()
        .filter(b -> DateUtil.compare(new Date(),b.getBirthDay()) > 0
                && b.getAge() < 15 )
        .collect(Collectors.toList());
    l1 = list.stream()
        .filter(b -> b.getMoney().compareTo(new BigDecimal(2)) > -1).collect(Collectors.toList());

List 分组


    //name分组
    Map<String,List<StreamDto>> map = list.stream().collect(Collectors.groupingBy(StreamDto::getName));
    //二级分组
    Map<String,Map<Integer,List<StreamDto>>> map1 = list.stream().collect(Collectors.groupingBy(StreamDto::getName,Collectors.groupingBy(StreamDto::getAge)));
    //二级分组,统计数量
    Map<String,Map<Integer,Long>> map2 = list.stream().collect(Collectors.groupingBy(StreamDto::getName,Collectors.groupingBy(StreamDto::getAge,Collectors.counting())));
    //多条件分组
    map = list.stream().collect(Collectors.groupingBy(b -> b.getName() + "-" + b.getAge()));
    //分组后又对集合进行处理,方式1
    Map<String,List<String>> map3 = list.stream().collect(Collectors.groupingBy(StreamDto::getName,Collectors.groupingBy(StreamDto::getAge,Collectors.mapping(StreamDto::getAddr, Collectors.toList()))));
    //方式2,只是拓展,不推荐
    map3 = list.stream().collect(Collectors.groupingBy(StreamDto::getName)).entrySet().stream().collect(Collectors.toMap(b -> b.getKey(), b -> CollUtil.map(b.getValue(), StreamDto::getAddr, true)));

 // 按照某列出现的次数分组

List去重


    //根据Addr去重
    List<StreamDto> list1 = list.stream()
            .collect(Collectors.collectingAndThen(Collectors.toCollection(
                    () -> new TreeSet<>(Comparator.comparing(StreamDto::getAddr))
            ), ArrayList::new));
    //简单去重
    list1 = list.stream().distinct().collect(Collectors.toList());

List 转map


   Map<String, Date> m = list.stream().collect(Collectors.toMap(b -> b.getName(), b -> b.getBirthDay()));
   Map<String, StreamDto> collect3 = list.stream().collect(Collectors.toMap(b -> b.getName(), b -> b));


返回自封装的List实现类


//封装的List实现,用于链式添加:addObj()和addObjs()
ArrayListProxy<String> allPlatNames = new ArrayListProxy<>();
allPlatNames.addObjs(bidSecPlats).addObjs(projPlats);
//去重,这里要返回ArrayListProxy必须自己实现,collect(Collectors.toList())只能返回List,allPlatNames接收不了
allPlatNames = allPlatNames.stream().distinct().collect(ArrayListProxy::new, (r, x) -> {
                r.addObj(x);
            }, List::addAll);

集合合并返回新集合

List<String> list1 = CollUtil.toList("1");
List<String> list2 = CollUtil.toList("2");
List<List<String>> all = CollUtil.toList(list1, list2);

/**
*	第一种方式
*/
ArrayList<String> collect = all.stream().collect(ArrayList::new, (list, value) -> list.addAll(value), List::addAll);
//或者
//串行流:第一个元素时会通过ArrayList::new获得一个初始化容器a,容器a执行ArrayList::addAll方法操作流中的每一个元素,最后返回容器a,最后容器a就只有一个,所以不会用到List::addAll
ArrayList<String> collect = all.stream().collect(ArrayList::new, ArrayList::addAll, List::addAll);
//并行流:将all中的元素分片处理,每片中第一个元素时会通过ArrayList::new获得一个初始化容器a,
//容器a执行ArrayList::addAll方法操作流中的每一个元素,每片最后会返回容器a,最后多个容器a通过List::addAll方法合并后输出
ArrayList<String> collect = all.parallelStream().collect(ArrayList::new, ArrayList::addAll, List::addAll);

/**
*	第二种方式
* 	reduce
*/
//new ArrayList<>() 作为初始值加入计算
List<String> reduce = all.stream().reduce(CollUtil.toList("3"), (b, c) -> {
            b.addAll(c);
            return b;
        });//返回["3","1","2"]
//不添加初始值计算
Optional<List<String>> reduce = all.stream().reduce((b, c) -> {
            b.addAll(c);
            return b;
        });//返回["1","2"]

Map转换


//假设有数据
Map<String, List<StreamDto>> map = new HashMap<>();
//取出key和集合中第一个对象的时间参数
Map<String, Date> m = map.entrySet().stream()
   .collect(Collectors.toMap(b -> b.getKey(), b -> b.getValue().get(0).getBirthDay()));

Map排序


//前5名
Map<String, Long> top5Names = new LinkedHashMap<>();
//假设有数据
List<String> mainQ = new ArrayList<>();
//分组后统计数量
Map<String, Long> countMap = mainQ.stream()
    .collect(Collectors.groupingBy(b -> b, Collectors.counting()));
//value排序,然后取出前5名
countMap.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByValue().reversed()).forEachOrdered(b -> {
    if (top5Names.size() < 6) {
        top5Names.put(b.getKey(), b.getValue());
    }
});
//取出全部
Map<String, Long> allMap = countMap.entrySet().stream()
    .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
    .collect(Collectors.toMap(
        Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> newValue, 		      					LinkedHashMap::new
    ));
//key排序
countMap.entrySet().stream().sorted(Map.Entry.<String, Long>comparingByKey().reversed());

Map过滤


//假设有数据
List<String> mainQ = new ArrayList<>();
Map<String, Long> countMap = mainQ.stream()
        .collect(Collectors.groupingBy(b -> b, Collectors.counting()));
//map过滤
countMap.entrySet().stream().filter(b -> b.getKey() != "").collect(HashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), HashMap::putAll);

Map合并


/**
 * @Description: 合并两个map,如果key相同,那么选取时间靠后的value 
 */
public static Map<String, Date> concatMap(Map<String, Date> map1, Map<String, Date> map2) {
    Map<String, Date> result = Stream.concat(map1.entrySet().stream(), map2.entrySet().stream())
            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (value1, value2) -> {
                if (DateUtil.compare(value1, value2) >= 0) {
                    return value1;
                } else {
                    return value2;
                }
            }));
    return result;
}

Map遍历


/**
 * 遍历Map的方式
 */
Map<String,List<ResOrgUserDto>> map =new HashMap<>();
//1.通过Map.keySet遍历key和value
for (String key : map.keySet()) {
    System.out.println(map.get(key));
}
//Java8
map.keySet().forEach(k -> {
    System.out.println(map.get(k));
});

//2.通过Map.entrySet使用Iterator遍历key和value
while (map.entrySet().iterator().hasNext()){
    Map.Entry<String,List<ResOrgUserDto>> entry = map.entrySet().iterator().next();
    System.out.println(entry.getValue());
}
//Java8
map.entrySet().iterator().forEachRemaining(m -> System.out.println(m.getValue()));

//3.通过Map.entrySet遍历key和value,在大容量时推荐使用
for (Map.Entry<String, List<ResOrgUserDto>> entry : map.entrySet()) {
    System.out.println(entry.getValue());
}
//Java8
map.entrySet().forEach(entry -> {
    System.out.println(entry.getValue());
});

//4.通过Map.values()遍历所有的value,但不能遍历key
for (List<ResOrgUserDto> values : map.values()) {
    System.out.println(values);
}
//Java8
map.values().forEach(v -> {
    System.out.println(v);
});

//5.通过k,v遍历,Java8独有的
map.forEach((k,v) -> {
    System.out.println(v);
});

List,Map综合


//前5名名称
List<String> names = top5Names.entrySet().stream().map(b -> b.getKey()).collect(Collectors.toList());
//获取各表前五名平台的最后数据接收时间
Map<String, Date> bidSecLasts = bidSecQ.stream().filter(b -> names.contains(b.getTradeplat()))//筛选出前5的数据
        .sorted(Comparator.comparing(BusBidsection::getSubmittimestamp).reversed())//先排序
        .collect(Collectors.groupingBy(BusBidsection::getTradeplat))//在分组
        //最后取出key和最后数据接收时间
        .entrySet().stream().collect(Collectors.toMap(b -> b.getKey(), b -> b.getValue().get(0).getSubmittimestamp()));

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

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

相关文章

Python每日一练:小艺读书醉酒的狱卒非降序数组(详解快排)

文章目录 前言一、小艺读书二、醉酒的狱卒三、非降序数组总结 前言 今天这个非降序数组&#xff0c;阅读解理小学水平&#xff0c;说起来都是泪啊。我折腾了一天都没搞定&#xff0c;从冒泡写到快速排序。换了几种都还不行&#xff0c;我又给快排加上插入排序。结果还是不能全…

MySQL--复合查询--0422

注&#xff1a;为了方便查看 mysql语句会有突然的换行&#xff0c;书写时请勿模仿。 目录 1.单表查询回顾 显示工资最高的员工的名字和工作岗位 显示工资高于平均工资的员工信息 2.多表查询 比如需要查询雇员名字和所在部门编号及部门名字。 显示部门号为10的部门名&…

“智慧赋能 强链塑链”——精细化工行业仓储物流数字化转型探讨

精细化工行业作为衡量国家化学工业水平高低的重要标志&#xff0c;为国民经济提供重要的终端产品支持&#xff0c;相比较大化工产品&#xff0c;精细化工产品需要高度专业技能和工艺&#xff0c;其生产过程需要复杂的化学反应&#xff0c;以及严格的控制条件&#xff0c;产出的…

基于 TiDB + Flink 实现的滑动窗口实时累计指标算法

作者&#xff1a;李文杰 前言 在不少的支付分析场景里&#xff0c;大部分累计值指标可以通过 Tn 的方式计算得到 。随着行业大环境由增量市场转为存量市场&#xff0c;产品的运营要求更加精细化、更快速反应&#xff0c;这对各项数据指标的实时性要求已经越来越高。产品如果能…

UDS-19服务的状态掩码字节解析

19服务读DTC信息有01、02、04、06、0A等子服务&#xff0c;使用诊断仪读取DUT数据一般只需发送4字节有效数据&#xff0c;其他无效字节用00或者CC填充&#xff0c;如03 19 02 09 00 00 00 00&#xff0c; 数据分解&#xff1a; 03&#xff1a;表示报文类型未单帧&#xff0c;长…

考研计算机组成原理总结(8)

一.计算机工作过程 计算机工作的过程&#xff0c;即一条条指令工作的过程&#xff1a; 取指令&#xff1a; 1.(PC)—>MAR&#xff0c;把PC存放的指令存储地址传送给MAR3.M(MAR)—>MDR&#xff0c;主存根据地址取出指令存放到MDR中4.(MDR)—>IR&#xff0c;指令从MD…

[golang gin框架] 28.Gin 发送短信,DES加密解,Cookie加密,解密操作

一.发送短信 1.简介 在用户注册的时候,需要发送短信来校验用户以及手机号,达到用户注册的目的,一般有很多短信接口来达到发送短信的操作,比如:云片短信服务,阿里云短信服务, 腾讯云短信服务等等,这里以腾讯云短信服务来发送短信: 腾讯云短信服务相关网址: 短信介绍 发送短信AP…

【计算机视觉 | 目标检测】Grounding DINO:开集目标检测论文解读

介绍一篇较新的目标检测工作&#xff1a; Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection论文地址为&#xff1a; https://arxiv.org/pdf/2303.05499.pdfgithub 地址为&#xff1a; https://github.com/IDEA-Research/GroundingD…

flask框架之----Flask-Mail邮件

介绍&#xff1a; Web应用程序经常需要向用户、客户端、管理员、运维人员等相关人员发送邮件。在Flask框架中提供了Flask-Mail邮件库来管理电子邮件的收发。 安装&#xff1a;flask-mail: pip3 install flask-mail配置&#xff1a; 服务器信息&#xff1a; Flask-Mail &…

ESP32学习笔记 -- ESP32-S3使用NVS存储数据

什么是NVS? 非易失性存储(Non-Volatile Storage)简称NVS,是用来保存一些设备断电后不能丢失的数据,乐鑫的ESP32-S3芯片使用了一套NVS库函数对外置的SPI FLASH进行读、写、擦除等操作。 ESP-IDF通过分区表的方式,在外部SPI FLASH里面开辟一段存储空间(也称作NVS分区),…

Vue3 基础语法

文章目录 1.创建Vue项目1.1创建项目1.2 初始项目 2.vue3 语法2.1 复杂写法2.2 简易写法2.3 reactive&#xff08;对象类型&#xff09;2.4 ref&#xff08;简单类型&#xff09;2.5 computed(计算属性)2.6 watch&#xff08;监听&#xff09; 3.vue3 生命周期4.vue3 组件通信4.…

程序员应该怎么自学才能入门 ?我来聊聊自己的经历

当你想成为一名程序员&#xff0c;如何自学入门是一个非常重要的问题。在这里我分享一下我的经验&#xff0c;希望能对你有所帮助。 首先&#xff0c;为了制定好你的学习路线&#xff0c;你可以在网上的培训机构网站找到一张基础路线图。这张路线图必须是跟行业对标的&#xf…

Leetcode 42 接雨水

Leetcode42接雨水 题解1&#xff1a;正反两扫&#xff08;Simple and effect&#xff09;题解2&#xff1a;DP题解3&#xff1a;单调栈&#xff08;单调栈存储的是下标&#xff0c;满足从栈底到栈顶的下标对应height的元素呈递减&#xff09;题解4&#xff1a;双指针&#xff0…

【CSS系列】第六章 · CSS列表、表格、背景、鼠标属性

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

【数据结构】- 链表之带头(哨兵位)双向循环链表(上)

文章目录 前言&#x1f31f;一、带头双向循环链表&#x1f31f;二、带头双向循环链表结构图&#xff1a;&#x1f31f;三、带头双向循环链表代码实现&#xff1a;&#x1f30f;3.1头插&#xff1a;&#x1f30f;3.2头插流程图&#x1f30f;3.3 尾插&#x1f30f;3.4尾插流程图&…

【CSS系列】第三章 · CSS三大特性和颜色的表示

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

Swagger简单了解

Swagger 介绍 使用swagger你只需要按照它的规范去定义接口及接口相关信息&#xff0c;在通过swagger衍生出来的一系列项目和工具&#xff0c;就可以做到生成各种格式的接口文档&#xff0c;以及在线接口调试页面等等。 官网&#xff1a;https://swagger.io/ knife4j是为javaMVC…

Linux网络——Shell编程之函数

Linux网络——Shell编程之函数 一、概述二、定义函数的格式1.格式一2.格式二 三、函数的查看和删除1.查看 declare2.删除 declare 四、函数的返回值1.return 返回值2.echo 返回值 五、函数的参数传入与变量范围1.函数的传参2.函数变量的作用范围 六、函数的应用1.阶乘2.递归目录…

知识不断分叉,知怎么来,才知怎么去

知识不断分叉&#xff0c;知怎么来&#xff0c;才知怎么去 定位方法论在中国的演化和继承 趣讲大白话&#xff1a;知道什么来&#xff0c;方知怎么去 【趣讲信息科技159期】 **************************** 定位也谈不上是科学意义上的理论 而是商业实践方法 不能神话 但也要有基…

深入了解目标检测技术--从基本概念到算法入门

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 众所周知&#xff0c;目标检测是计算机视觉领域中的重要任务之一&#xff0c;其目的是识别图像或视频中包含的物体实例并将其定位。实现目标检测可以帮助人们在自动驾驶、机器人导航、安防监控等领域中更好地理解和应用图…