给自己和公司挖的坑

    1.配置启动,clean install spring-boot:run -D maven.tes.skip=true,然后发现项目启动的时候一直一直在运行正常来说不应该运行的代码,而应该调用才会运行的代码,我知道是启动了测试代码,但是不知道为啥。直到我发现tes不是test。正常命令是:clean install spring-boot:run -D maven.test.skip=true

     2.一不小心从测试环境切了一个分支,然后发现切错了,但是该分支并没有删除。后来改bug,忘记了。就从该分支上开始写,并且将代码上传到线上,导致线上bug。于是大家都只好强制回滚git rest 版本号 --hard。因为实在不确定,最后删了本地的线上分支,重新clone的。

      之后重新发布,还是出现问题,因为线上的jenkins拉的git没有回滚。

       再之后,上线之前,必须在本地mvn clean install -Ponline spring-boot:run -D maven.test.skip=true,测试一遍才可。

    3.写了一个配置文件类,但是这个功能不是所有的项目都需要,所以加了一个条件,

@ConditionalOnProperty(prefix = "db.**",name = "enabled")

    在需要使用该配置文件的项目中,需要在配置文件上(xml)中加上db.***.enabled=true。

    然后我在本地测试的时候加了这句配置,但是线上和测试环境都没有加,于是线上启动都启动不起来。

    4.做邮件发送功能,因为总有人离职,导致邮箱不能用,然后就报“com.sun.mail.smtp.SMTPSendFailedException: 250 Ok: queued as ; nested exception is: com.sun.mail.smtp.SMTPAddressFailedException: 550 Mailbox not found or access denied”,关键是报错并不告诉是你哪个邮箱账号出的错,你只好将邮箱地址全部拷出来,然后发一份邮件,然后邮件系统会提示你是哪个账号不好了。我只测试过foxmail,其他我不知道能不能这么用。

        后来别人告诉我一个配置,

mail.smtp.sendpartial

       靠着这个配置,就能即使有不可用的邮箱,还是可以给正常的邮箱发送邮件,并且还是会报错,让你知道有邮箱不可用了。但是这个配置我这样写可以用,

static {
        javaMailSender = new JavaMailSenderImpl();
        javaMailSender.setHost("fuwuqi");//链接服务器
        javaMailSender.setPort(465);
        javaMailSender.setUsername("zhanghao");//账号
        javaMailSender.setPassword("mima");//密码
        javaMailSender.setDefaultEncoding("UTF-8");

        Properties properties = new Properties();
        properties.setProperty("mail.smtp.auth", "true");//开启认证
        properties.setProperty("mail.smtp.port", Integer.toString(465));//设置端口
        properties.setProperty("mail.smtp.socketFactory.port", Integer.toString(465));//设置ssl端口
        properties.setProperty("mail.smtp.socketFactory.fallback", "false");
        properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        properties.setProperty("mail.smtp.sendpartial","true");
        javaMailSender.setJavaMailProperties(properties);
    }

         但是在配置文件中,却不管用;

#mail config
spring.mail.host=fuwuqi
spring.mail.username=zhanghao
spring.mail.password=mima
spring.mail.port=465
spring.mail.protocol=smtps
spring.mail.properties.mail.smtps.auth=true
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.transport.protocol=true
spring.mail.properties.mail.smtp.sendpartial=true

        后来发现原来在配置文件(xml)中,好死不死的写了spring.mail.protocal=smtps,而class中则没有,所以改成spring.mail.properties.mail.smtps.sendpartial=true,就可以用了。

           然后,这个一堆的账号,让运维换成邮件组了。

       5.SQL,group by1,2写成了group by 1,N月之后才因为有一组数据一直为0,与事实不符,才被发现。

         因为不小心,我已经出了N个bug了,已经成为一代大坑,希望以后还是小心谨慎吧。上司为我背了N个坑,实在对不起!

<think>好的,我现在需要帮助用户找到Java实现的快速排序封装函数示例代码。首先,用户明确要求的是Java代码,并且希望是封装好的函数,所以我需要确保提供的代码结构清晰,函数封装得当。 首先,我应该回忆一下快速排序的基本原理。快速排序是通过选择一个基准元素,将数组分成两部分,一部分小于基准,另一部分大于等于基准,然后递归地对这两部分进行排序。这个过程需要分区(partition)递归排序两个主要步骤。 接下来,我需要考虑用户可能需要的代码结构。用户提到“封装函数”,所以应该提供一个静态方法,可能放在一个类中,方便直接调用。同时,用户可能需要一个示例,包括main方法,展示如何使用这个排序函数。 然后,我要参考用户提供的引用内容。引用[2]中提到了优化pivot的选择,比如三数取中法,这可以避免最坏情况的时间复杂度。此外,还提到了优化不必要的交换,这可能涉及到分区函数的实现细节。因此,在代码示例中,我应该包含这些优化点,以提高代码的效率。 现在,我需要编写代码。首先,定义快速排序的入口方法,比如quickSort,接受一个整数数组作为参数。然后,内部调用一个重载的方法,传入数组以及左右边界。这样封装可以让用户只需传入数组,而无需关心边界参数,提高易用性。 在分区函数中,使用三数取中法选择pivot。具体来说,在low、mid、high三个位置中选择中间值作为基准,并将其交换到low的位置。这样可以减少最坏情况发生的概率。然后进行双指针遍历,将小于pivot的元素移到左边,大于的移到右边,最后返回基准的位置。 另外,考虑到用户可能希望代码简洁,我需要确保代码的可读性,添加必要的注释,解释关键步骤,比如三数取中的逻辑分区的过程。 最后,在main方法中创建测试数组,调用quickSort方法,并打印排序前后的结果,以展示代码的实际效果。 需要检查代码是否符合Java语法,比如正确的循环结构、递归调用、变量作用域等。同时,确保分区的逻辑正确,避免死循环或数组越界的问题。 总结步骤: 1. 定义公开的quickSort方法,接受整型数组。 2. 实现重载的递归排序方法,处理左右边界。 3. 实现分区方法,使用三数取中优化pivot选择。 4. 编写swap辅助方法,用于元素交换。 5. 在main方法中测试排序功能。 现在将这些步骤转化为具体的代码,确保每个部分都正确无误,并符合最佳实践。例如,递归的终止条件是左边界不小于右边界,分区后的递归调用处理左右子数组,避免包含基准元素导致无限递归。 测试代码时,需要考虑不同情况,比如已排序数组、逆序数组、随机数组等,确保代码在各种情况下都能正确工作。不过,用户可能只需要示例代码,因此main方法中的简单测试即可。 最后,整理代码结构,添加必要注释,确保用户能够理解每部分的作用,并顺利集成到自己的项目中。</think>以下是一个经过优化的快速排序Java实现示例,包含三数取中法选择基准值封装好的函数: ```java public class QuickSort { // 封装的快速排序入口方法 public static void quickSort(int[] arr) { if (arr == null || arr.length == 0) return; sort(arr, 0, arr.length - 1); } // 递归排序核心方法 private static void sort(int[] arr, int left, int right) { if (left >= right) return; int pivot = partition(arr, left, right); sort(arr, left, pivot - 1); sort(arr, pivot + 1, right); } // 分区方法(含三数取中优化) private static int partition(int[] arr, int low, int high) { // 三数取中优化 int mid = low + ((high - low) >>> 1); medianOfThree(arr, low, mid, high); int pivot = arr[low]; while (low < high) { while (low < high && arr[high] >= pivot) high--; arr[low] = arr[high]; while (low < high && arr[low] <= pivot) low++; arr[high] = arr[low]; } arr[low] = pivot; return low; } // 三数取中辅助方法 private static void medianOfThree(int[] arr, int a, int b, int c) { if (arr[a] > arr[b]) swap(arr, a, b); if (arr[a] > arr[c]) swap(arr, a, c); if (arr[b] > arr[c]) swap(arr, b, c); swap(arr, a, b); // 将中间值放到左端 } // 元素交换辅助方法 private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {9, 7, 5, 11, 12, 2, 14, 3, 10, 6}; quickSort(arr); System.out.println("排序结果: " + Arrays.toString(arr)); } } ``` 代码特点说明: 1. **三数取中优化**:通过`medianOfThree`方法选择左、中、右三个元素的中值作为基准,有效避免最坏时间复杂度$O(n^2)$的情况[^2] 2. **原地排序**:仅使用常数级别额外空间,空间复杂度为$O(\log n)$(递归栈空间) 3. **双指针优化**:使用填数法减少元素交换次数,提升执行效率[^2] 4. **完整封装**:用户只需调用`quickSort(int[] arr)`即可完成排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值