JAVA 实现五种基本排序方法的实现以及时间的统计

简介: JAVA 实现五种基本排序方法的实现以及时间的统计
package test;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class sort {
  /**
   *Author:April
   *Date:2018.12.1
   *Version:0.1
   *Description:1、选择排序、冒泡排序、归并排序、快速排序、插入排序的算法原理。
   *            2.不同排序算法时间效率的经验分析方法,验证理论分析与经验分析的一致性。
   *
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    func();   
  }
  private static void func() {
    // TODO Auto-generated method stub
    System.out.println("1.选择排序 2.冒泡排序 3.合并排序 4.快速排序  5.插入排序");
    @SuppressWarnings("resource")
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入要选择的字母:");
    int num = sc.nextInt();
    //int num  = sc.nextInt();
    switch(num){
    case 1:
      //System.out.println("1");
        select();
      break;
    case 2:
      bubble();
      break;
    case 3:
      merge();
      break;
    case 4:
      fast();
      break;
    case 5:
      insert();
      break;
    default:
      System.out.println("请输入正确的字母");
    }
  }
//插入排序
  private static void insert() {
    // TODO Auto-generated method stub
    //数据规模为10时
    double begin = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
    int[] nums = new int[10];  //定义一个一维数组
      int count=0;
      while(count<10) {
       nums[count]=(int)(Math.random()*100);//产生100以内的随机数给nums
       count++;
      }
      //插入排序
      int insertNote;
      for (int i = 1; i < nums.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
              insertNote = nums[i];// 设置数组中的第2个元素为第一次循环要插入的数据
              int j = i - 1;
              while ( j >= 0 && insertNote < nums[j]) {
                nums[j + 1] = nums[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
                  j--;
              }
              nums[j + 1] = insertNote;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
          }
      System.out.println("数据规模为"+nums.length+"时");//数组长度
      System.out.println("排序后序列为:");
      for (int i = 0; i < nums.length; i++) {   //循环并打印出每个数组的数字
       System.out.print(nums[i]+"\t") ;
       }
      double end = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
      double time = end - begin;// 程序的运行时间    
      System.out.println("\n排序所花平均时间(ms):"+time / 60*1000 );
//数据规模为100时   
      double begin1 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
      int[] nums1 = new int[100];  //定义一个一维数组
        int count1=0;
        while(count1<100) {
         nums1[count1]=(int)(Math.random()*100);//产生100以内的随机数给nums
         count1++;
        }
        //插入排序
        int insertNote1;
        for (int i = 1; i < nums.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
                insertNote1 = nums[i];// 设置数组中的第2个元素为第一次循环要插入的数据
                int j = i - 1;
                while ( j >= 0 && insertNote1 < nums[j]) {
                  nums[j + 1] = nums[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
                    j--;
                }
                nums[j + 1] = insertNote1;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
            }
        System.out.println("数据规模为"+nums1.length+"时");//数组长度
        System.out.println("排序后序列为:");
        for (int i = 0; i < nums1.length; i++) {   //循环并打印出每个数组的数字
         System.out.print(nums1[i]+"\t") ;
         }
        double end1 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
        double time1 = end1 - begin1;// 程序的运行时间   
        System.out.println("\n排序所花平均时间(ms):"+time1 / 60*1000 );
//数据规模为1000时
        double begin2 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
        int[] nums2 = new int[1000];  //定义一个一维数组
          int count2=0;
          while(count2<1000) {
            nums2[count2]=(int)(Math.random()*100);//产生100以内的随机数给nums
            count2++;
          }
          //插入排序
          int insertNote2;
          for (int i = 1; i < nums.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
                  insertNote2 = nums[i];// 设置数组中的第2个元素为第一次循环要插入的数据
                  int j = i - 1;
                  while ( j >= 0 && insertNote2 < nums[j]) {
                    nums[j + 1] = nums[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
                      j--;
                  }
                  nums[j + 1] = insertNote2;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
              }
          System.out.println("数据规模为"+nums2.length+"时");//数组长度
          System.out.println("排序后序列为:");
          for (int i = 0; i < nums2.length; i++) {   //循环并打印出每个数组的数字
           System.out.print(nums2[i]+"\t") ;
           }
          double end2 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
          double time2 = end2 - begin2;// 程序的运行时间   
          System.out.println("\n排序所花平均时间(ms):"+time2 / 60*1000 );
//数据规模为10000时
          double begin3 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
          int[] nums3 = new int[10000];  //定义一个一维数组
            int count3=0;
            while(count3<10000) {
              nums3[count3]=(int)(Math.random()*100);//产生100以内的随机数给nums
              count3++;
            }
            //插入排序
            int insertNote3;
            for (int i = 1; i < nums.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
                    insertNote3 = nums[i];// 设置数组中的第2个元素为第一次循环要插入的数据
                    int j = i - 1;
                    while ( j >= 0 && insertNote3 < nums[j]) {
                      nums[j + 1] = nums[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
                        j--;
                    }
                    nums[j + 1] = insertNote3;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
                }
            System.out.println("数据规模为"+nums3.length+"时");//数组长度
            System.out.println("排序后序列为:");
            for (int i = 0; i < nums3.length; i++) {   //循环并打印出每个数组的数字
             System.out.print(nums3[i]+"\t") ;
             }
            double end3 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
            double time3 = end3 - begin3;// 程序的运行时间   
            System.out.println("\n排序所花平均时间(ms):"+time3 / 60*1000 );
//数据规模为100000时
            double begin4 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
            int[] nums4 = new int[100000];  //定义一个一维数组
              int count4=0;
              while(count4<100000) {
                nums4[count4]=(int)(Math.random()*100);//产生100以内的随机数给nums
                count4++;
              }
              //插入排序
              int insertNote4;
              for (int i = 1; i < nums.length; i++) {// 从数组的第二个元素开始循环将数组中的元素插入
                      insertNote4 = nums[i];// 设置数组中的第2个元素为第一次循环要插入的数据
                      int j = i - 1;
                      while ( j >= 0 && insertNote4 < nums[j]) {
                        nums[j + 1] = nums[j];// 如果要插入的元素小于第j个元素,就将第j个元素向后移动
                          j--;
                      }
                      nums[j + 1] = insertNote4;// 直到要插入的元素不小于第j个元素,将insertNote插入到数组中
                  }
              System.out.println("数据规模为"+nums4.length+"时");//数组长度
//              System.out.println("排序后序列为:");
//              for (int i = 0; i < nums4.length; i++) {   //循环并打印出每个数组的数字
//               System.out.print(nums4[i]+"\t") ;
//               }
              double end4 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
              double time4 = end4 - begin4;// 程序的运行时间   
              System.out.println("\n排序所花平均时间(ms):"+time4 / 60*1000 );
  }
//快速排序
  private static void fast() {
    // TODO Auto-generated method stub
  }
//合并排序
  private static void merge() {
    // TODO Auto-generated method stub
  }
//冒泡排序
  private static void bubble() {
    // TODO Auto-generated method stub
    //数据规模为10时
    double begin = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
    int[] nums = new int[10];  //定义一个一维数组
      int count=0;
      while(count<10) {
       nums[count]=(int)(Math.random()*100);//产生100以内的随机数给nums
       count++;
      }
      //冒泡排序
    for (int i = 0; i < nums.length - 1; i++) {// 外层循环控制排序趟数
      for (int j = 0; j < nums.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次
        if (nums[j] > nums[j + 1]) {
          int temp = nums[j];
          nums[j] = nums[j + 1];
          nums[j + 1] = temp;
        }
      }
    }
      System.out.println("数据规模为"+nums.length+"时");//数组长度
      System.out.println("排序后序列为:");
      for (int i = 0; i < nums.length; i++) {   //循环并打印出每个数组的数字
       System.out.print(nums[i]+"\t") ;
       }
      double end = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
      double time = end - begin;// 程序的运行时间    
      System.out.println("\n排序所花平均时间(ms):"+time / 60*1000 );
//数据规模为100时   
      double begin1 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
      int[] nums1 = new int[100];  //定义一个一维数组
        int count1=0;
        while(count1<100) {
         nums1[count1]=(int)(Math.random()*100);//产生100以内的随机数给nums
         count1++;
        }
        //冒泡排序
        for (int i = 0; i < nums.length - 1; i++) {// 外层循环控制排序趟数
          for (int j = 0; j < nums.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次
            if (nums[j] > nums[j + 1]) {
              int temp = nums[j];
              nums[j] = nums[j + 1];
              nums[j + 1] = temp;
            }
          }
        }
        System.out.println("数据规模为"+nums1.length+"时");//数组长度
        System.out.println("排序后序列为:");
        for (int i = 0; i < nums1.length; i++) {   //循环并打印出每个数组的数字
         System.out.print(nums1[i]+"\t") ;
         }
        double end1 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
        double time1 = end1 - begin1;// 程序的运行时间   
        System.out.println("\n排序所花平均时间(ms):"+time1 / 60*1000 );
//数据规模为1000时
        double begin2 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
        int[] nums2 = new int[1000];  //定义一个一维数组
          int count2=0;
          while(count2<1000) {
            nums2[count2]=(int)(Math.random()*100);//产生100以内的随机数给nums
            count2++;
          }
          //冒泡排序
          //冒泡排序
          for (int i = 0; i < nums.length - 1; i++) {// 外层循环控制排序趟数
            for (int j = 0; j < nums.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次
              if (nums[j] > nums[j + 1]) {
                int temp = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = temp;
              }
            }
          }
          System.out.println("数据规模为"+nums2.length+"时");//数组长度
          System.out.println("排序后序列为:");
          for (int i = 0; i < nums2.length; i++) {   //循环并打印出每个数组的数字
           System.out.print(nums2[i]+"\t") ;
           }
          double end2 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
          double time2 = end2 - begin2;// 程序的运行时间   
          System.out.println("\n排序所花平均时间(ms):"+time2 / 60*1000 );
//数据规模为10000时
          double begin3 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
          int[] nums3 = new int[10000];  //定义一个一维数组
            int count3=0;
            while(count3<10000) {
              nums3[count3]=(int)(Math.random()*100);//产生100以内的随机数给nums
              count3++;
            }
            //冒泡排序
            //冒泡排序
            for (int i = 0; i < nums.length - 1; i++) {// 外层循环控制排序趟数
              for (int j = 0; j < nums.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次
                if (nums[j] > nums[j + 1]) {
                  int temp = nums[j];
                  nums[j] = nums[j + 1];
                  nums[j + 1] = temp;
                }
              }
            }
            System.out.println("数据规模为"+nums3.length+"时");//数组长度
            System.out.println("排序后序列为:");
            for (int i = 0; i < nums3.length; i++) {   //循环并打印出每个数组的数字
             System.out.print(nums3[i]+"\t") ;
             }
            double end3 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
            double time3 = end3 - begin3;// 程序的运行时间   
            System.out.println("\n排序所花平均时间(ms):"+time3 / 60*1000 );
//数据规模为100000时
            double begin4 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
            int[] nums4 = new int[100000];  //定义一个一维数组
              int count4=0;
              while(count4<100000) {
                nums4[count4]=(int)(Math.random()*100);//产生100以内的随机数给nums
                count4++;
              }
              //冒泡排序
              for (int i = 0; i < nums.length - 1; i++) {// 外层循环控制排序趟数
                for (int j = 0; j < nums.length - 1 - i; j++) {// 内层循环控制每一趟排序多少次
                  if (nums[j] > nums[j + 1]) {
                    int temp = nums[j];  //temp是用于交换时的临时变量
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                  }
                }
              }
              System.out.println("数据规模为"+nums4.length+"时");//数组长度
//              System.out.println("排序后序列为:");
//              for (int i = 0; i < nums4.length; i++) {   //循环并打印出每个数组的数字
//               System.out.print(nums4[i]+"\t") ;
//               }
              double end4 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
              double time4 = end4 - begin4;// 程序的运行时间   
              System.out.println("\n排序所花平均时间(ms):"+time4 / 60*1000 );
  }
//选择排序
  private static void select() {  
    // TODO Auto-generated method stub
    //数据规模为10时
    double begin = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
    int[] nums = new int[10];  //定义一个一维数组
      int count=0;
      while(count<10) {
       nums[count]=(int)(Math.random()*100);//产生100以内的随机数给nums
       count++;
      }
      //选择排序
      for(int i = 0; i < nums.length-1; ++i){  //外层循环数组寻找最小的数
              int k = i;
              for(int j = i; j < nums.length; ++j){  //内层循环,做比较
                  if(nums[k] > nums[j]){  //若j比k小,则把j放入前面的位置
                      k = j;
                  }
              }
              if(k != i){  //交换元素
                  int temp = nums[i];  //temp是用于交换时的临时变量
                  nums[i] = nums[k];
                  nums[k] = temp;
              }
          }
      System.out.println("数据规模为"+nums.length+"时");//数组长度
      System.out.println("排序后序列为:");
      for (int i = 0; i < nums.length; i++) {   //循环并打印出每个数组的数字
       System.out.print(nums[i]+"\t") ;
       }
      double end = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
      double time = end - begin;// 程序的运行时间    
      System.out.println("\n排序所花平均时间(ms):"+time / 60*1000 );
//数据规模为100时   
      double begin1 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
      int[] nums1 = new int[100];  //定义一个一维数组
        int count1=0;
        while(count1<100) {
         nums1[count1]=(int)(Math.random()*100);//产生100以内的随机数给nums
         count1++;
        }
        //选择排序
        for(int i = 0; i < nums1.length-1; ++i){  //外层循环数组寻找最小的数
                int k = i;
                for(int j = i; j < nums1.length; ++j){  //内层循环,做比较
                    if(nums1[k] > nums1[j]){  //若j比k小,则把j放入前面的位置
                        k = j;
                    }
                }
                if(k != i){  //交换元素
                    int temp = nums1[i];  //temp是用于交换时的临时变量
                    nums1[i] = nums1[k];
                    nums1[k] = temp;
                }
            }
        System.out.println("数据规模为"+nums1.length+"时");//数组长度
        System.out.println("排序后序列为:");
        for (int i = 0; i < nums1.length; i++) {   //循环并打印出每个数组的数字
         System.out.print(nums1[i]+"\t") ;
         }
        double end1 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
        double time1 = end1 - begin1;// 程序的运行时间   
        System.out.println("\n排序所花平均时间(ms):"+time1 / 60*1000 );
//数据规模为1000时
        double begin2 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
        int[] nums2 = new int[1000];  //定义一个一维数组
          int count2=0;
          while(count2<1000) {
            nums2[count2]=(int)(Math.random()*100);//产生100以内的随机数给nums
            count2++;
          }
          //选择排序
          for(int i = 0; i < nums2.length-1; ++i){  //外层循环数组寻找最小的数
                  int k = i;
                  for(int j = i; j < nums2.length; ++j){  //内层循环,做比较
                      if(nums2[k] > nums2[j]){  //若j比k小,则把j放入前面的位置
                          k = j;
                      }
                  }
                  if(k != i){  //交换元素
                      int temp = nums2[i];  //temp是用于交换时的临时变量
                      nums2[i] = nums2[k];
                      nums2[k] = temp;
                  }
              }
          System.out.println("数据规模为"+nums2.length+"时");//数组长度
          System.out.println("排序后序列为:");
          for (int i = 0; i < nums2.length; i++) {   //循环并打印出每个数组的数字
           System.out.print(nums2[i]+"\t") ;
           }
          double end2 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
          double time2 = end2 - begin2;// 程序的运行时间   
          System.out.println("\n排序所花平均时间(ms):"+time2 / 60*1000 );
//数据规模为10000时
          double begin3 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
          int[] nums3 = new int[10000];  //定义一个一维数组
            int count3=0;
            while(count3<10000) {
              nums3[count3]=(int)(Math.random()*100);//产生100以内的随机数给nums
              count3++;
            }
            //选择排序
            for(int i = 0; i < nums3.length-1; ++i){  //外层循环数组寻找最小的数
                    int k = i;
                    for(int j = i; j < nums3.length; ++j){  //内层循环,做比较
                        if(nums3[k] > nums3[j]){  //若j比k小,则把j放入前面的位置
                            k = j;
                        }
                    }
                    if(k != i){  //交换元素
                        int temp = nums3[i];  //temp是用于交换时的临时变量
                        nums3[i] = nums3[k];
                        nums3[k] = temp;
                    }
                }
            System.out.println("数据规模为"+nums3.length+"时");//数组长度
            System.out.println("排序后序列为:");
            for (int i = 0; i < nums3.length; i++) {   //循环并打印出每个数组的数字
             System.out.print(nums3[i]+"\t") ;
             }
            double end3 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
            double time3 = end3 - begin3;// 程序的运行时间   
            System.out.println("\n排序所花平均时间(ms):"+time3 / 60*1000 );
//数据规模为100000时
            double begin4 = System.currentTimeMillis(); // 程序开始时间,调用系统的当前时间
            int[] nums4 = new int[100000];  //定义一个一维数组
              int count4=0;
              while(count4<100000) {
                nums4[count4]=(int)(Math.random()*100);//产生100以内的随机数给nums
                count4++;
              }
              //选择排序
              for(int i = 0; i < nums4.length-1; ++i){  //外层循环数组寻找最小的数
                      int k = i;
                      for(int j = i; j < nums4.length; ++j){  //内层循环,做比较
                          if(nums4[k] > nums4[j]){  //若j比k小,则把j放入前面的位置
                              k = j;
                          }
                      }
                      if(k != i){  //交换元素
                          int temp = nums4[i];  //temp是用于交换时的临时变量
                          nums4[i] = nums4[k];
                          nums4[k] = temp;
                      }
                  }
              System.out.println("数据规模为"+nums4.length+"时");//数组长度
//              System.out.println("排序后序列为:");
//              for (int i = 0; i < nums4.length; i++) {   //循环并打印出每个数组的数字
//               System.out.print(nums4[i]+"\t") ;
//               }
              double end4 = System.currentTimeMillis(); // 程序结束时间,调用系统当前时间
              double time4 = end4 - begin4;// 程序的运行时间   
              System.out.println("\n排序所花平均时间(ms):"+time4 / 60*1000 );
  }
}
相关文章
|
24天前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
1月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
68 9
|
22天前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
36 4
|
22天前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
24 4
|
20天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
24 1
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
50 17
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
109 4
|
1月前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
156 2
|
2月前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
22 2
|
1月前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。