Java字符串 StringBuilder 相关

1. StringBuilder(String str)

package string;

/**
 * StringBuilder
 * 由于String的优化完全是基于重用性考虑的,带来的问题是频繁的修改会产生内存开销大,
 * 运行速度慢等问题
 * 为了解决这些问题java推出了一个专门用来修改字符串的API:StringBuilder
 * StringBuilder内部维护一个可变的char数组,修改某个字符串时会先将该字符串内容复
 * 制到内部的数组
 * 中然后进行修改。并且提供了便于修改字符串的相关操作:增删改插,以及String中操作字
 * 符串的功能。
 *
 */
public class StringBuilderDemo {
    public static void main(String[] args) {
        String str = "好好学习java";
        //默认表示一个空字符串
//        StringBuilder builder = new StringBuilder();
        //将给定的字符串内容复制到StringBuilder内部,基于它进行修改
        StringBuilder builder = new StringBuilder(str);
//        StringBuffer builder = new StringBuffer(str);
        /*
            好好学习java
            好好学习java,为了实现财富自由!
            append():追加操作
         */
        builder.append(",为了实现财富自由!");
        //String s = builder.toString();
        System.out.println(builder);
        /*
            好好学习java,为了找个好工作!
            好好学习java,就是为了改变世界!
            replace():替换,将指定范围内的字符串替换为给定字符串
         */
        builder.replace(9,16,"就是为了改变世界");
//        System.out.println(builder.toString());
        System.out.println(builder);

        /*
            好好学习java,就是为了改变世界!
            ,就是为了改变世界!
            delete():删除,删除指定范围内的字符串
         */
        builder.delete(0,8);
        System.out.println(builder);

        /*
            ,就是为了改变世界!
            活着,就是为了改变世界!
            insert():在指定位置插入给定字符串
         */
        builder.insert(0,"活着");
        System.out.println(builder);
    }
}

2. StringBuilder 修改 字符串,性能测试

package string;

/**
 * StringBuilder修改字符串的性能
 */
public class StringBuilderDemo2 {
    public static void main(String[] args) {
        String str = "a";
        StringBuilder builder = new StringBuilder(str);
        for(int i=0;i<10000000;i++){
            builder.append("a");
        }
        System.out.println("执行完毕!");
    }
}

3. 直接用 String 修改 字符串,性能测试(这个会报异常)

package string;

/**
 * 字符串频繁创建带来的的性能损耗
 */
public class StringDemo2 {
    public static void main(String[] args) {
        String str = "a";
        for(int i=0;i<10000000;i++){
            str = str + str;
        }
        System.out.println("执行完毕!");
    }
}

SQL中拼接的日期,在代码中处理

import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author 孙永潮
 */
public class StringSubstring {

    public static void main(String[] args) {
//        int[] nums = {2,3,5,8,6};
//        int target = 9;
//        int[] twoSum = StringSubstring.twoSum(nums,target);
//        System.out.println(twoSum[0]+", "+twoSum[1]);

		//type: 1:年 02:季 3:月 4:日 5:小时    num偏移量:近6个月
        List<String> xAxis = createDateScope(3, 6)
                .stream()
                .map(it -> it.replace("/","-"))
                .collect(Collectors.toList());

        for (String s : xAxis){
            System.out.print(s+" ");
        }

		//处理年月数据 生成SQL
        StringBuilder sb = new StringBuilder("");
        for(String year : xAxis){
            stringBuilder.append("union select '");
            stringBuilder.append(year.split("-")[0])
                    .append("' yearA, '")
                    .append(Integer.parseInt(year.split("-")[1]))
                    .append("' monthA ");

        }
        
        //移除第一个 union
        String sql  = sb.substring(6);
        System.out.println(sql);
        
		String str = "2024-1";
        String s = str.split("-")[1];
        System.out.println(s);
    }


    public static int[] twoSum(int[] nums, int target) {

        int length = nums.length;
        for (int i = 0; i < length; i++){
            for (int j = i + 1; j < length; j++){
                if (nums[i] + nums[j] == target){

                    return new int[]{i,j};
                }
            }
        }

        return new int[]{};
    }

	/**
     * 获取当前日期 ~ 偏移量之间的日期范围
     *
     * @param type 1:年 2:季 3:月 4:日 5:小时
     * @param num  偏移量
     * @return
     */
    public static List<String> createDateScope(Integer type, Integer num) {
        return createDateScope(new Date(), type, num, null);
    }
    
    public static List<String> createDateScope(Date now, Integer type, Integer num, String format) {
        List<String> list = new LinkedList<>();
        switch (type) {
            case 1:
                for (int i = num - 1; i >= 0; i--) {
                    DateTime offset = DateUtil.offset(now, DateField.YEAR, -i);
                    String date = DateUtil.format(offset, CharSequenceUtil.isNotBlank(format) ? format : "yyyy");
                    list.add(date);
                }
                return list;
            case 2:
                for (int i = num - 1; i >= 0; i--) {
                    DateTime offset = DateUtil.offsetMonth(now, -i * 3);
                    int quarter = DateUtil.quarter(offset);
                    String date = DateUtil.format(offset, "yyyy");
                    list.add(date + "/" + quarter + "季度");
                }
                break;
            case 3:
                for (int i = num - 1; i >= 0; i--) {
                    DateTime offset = DateUtil.offsetMonth(now, -i);
                    String date = DateUtil.format(offset, CharSequenceUtil.isNotBlank(format) ? format : "yyyy/MM");
                    list.add(date);
                }
                break;
            case 4:
                for (int i = num - 1; i >= 0; i--) {
                    DateTime offset = DateUtil.offsetDay(now, -i);
                    String date = DateUtil.format(offset, CharSequenceUtil.isNotBlank(format) ? format : "MM/dd");
                    list.add(date);
                }
                break;
            case 5:
                for (int i = num - 1; i >= 0; i--) {
                    DateTime offset = DateUtil.offsetHour(now, -i);
                    String date = DateUtil.format(offset, CharSequenceUtil.isNotBlank(format) ? format : "HH");
                    list.add(date);
                }
                break;
        }
        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值