1、StringBuilder:
测试代码1:
package stringbuilder.com;
import java.util.ArrayList;
import java.util.List; public class StringBuilderExample { public static void main(String[] args) { // 初始化StringBuilder StringBuilder sb = new StringBuilder("This is a complex example using StringBuilder. "); // 添加不同类型的数据 sb.append("It demonstrates ").append(42).append(" different operations. "); // 使用循环构建字符串 List<String> items = new ArrayList<>(); items.add("Item 1"); items.add("Item 2"); items.add("Item 3"); sb.append("The list contains: "); for (String item : items) { sb.append(item).append(", "); } // 移除最后一个逗号和空格 if (sb.length() > 0 && sb.charAt(sb.length() - 1) == ',') { sb.setLength(sb.length() - 2); // 移除逗号和空格 } // 反转部分字符串 String partialString = sb.substring(0, sb.indexOf("list contains:") + "list contains:".length()).trim(); StringBuilder reversedPartial = new StringBuilder(partialString).reverse(); // 在StringBuilder中插入反转后的部分字符串 sb.insert(0, "Reversed partial: ").insert(0, reversedPartial).append("\n"); // 转换并打印结果 System.out.println(sb.toString()); // 字符串与另一个StringBuilder合并 StringBuilder anotherSb = new StringBuilder("Additional information: "); anotherSb.append("This is more data to be appended."); // 合并两个StringBuilder sb.append(anotherSb); // 打印最终结果 System.out.println(sb.toString()); }
}
运行结果如下:
测试代码2:
package stringbuilder.com;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set; public class StringBuilderTest { private enum LogLevel { DEBUG, INFO, WARN, ERROR } private static final Map<LogLevel, Set<String>> logMessages = new HashMap<>(); static { // 初始化日志级别集合 for (LogLevel level : LogLevel.values()) { logMessages.put(level, new HashSet<>()); } } public static void main(String[] args) { // 日志记录 log(LogLevel.INFO, "System starting up..."); log(LogLevel.DEBUG, "Initializing configuration..."); log(LogLevel.WARN, "Old configuration file found, using defaults."); log(LogLevel.ERROR, "Failed to connect to database!"); // WARN和ERROR级别的日志 printLogs(LogLevel.WARN, LogLevel.ERROR); // 使用StringBuilder构建更复杂的日志消息 StringBuilder complexMessage = buildComplexLogMessage("UserActivity", "user123", LogLevel.INFO, "Logged in successfully."); log(complexMessage); // 打印所有WARN和ERROR级别的日志,包括新添加的 printLogs(LogLevel.WARN, LogLevel.ERROR); } public static void log(LogLevel level, String message) { logMessages.get(level).add(formatLogMessage(level, message)); } public static void log(StringBuilder message) { // INFO级别的日志log(LogLevel.INFO, message.toString()); } private static String formatLogMessage(LogLevel level, String message) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); return String.format("[%s] [%s] %s", formatter.format(LocalDateTime.now()), level.name(), message); } public static void printLogs(LogLevel... levels) { for (LogLevel level : levels) { System.out.println("--- " + level.name() + " LOGS ---"); for (String msg : logMessages.getOrDefault(level, Set.of())) { System.out.println(msg); } if (logMessages.getOrDefault(level, Set.of()).isEmpty()) { System.out.println("No " + level.name() + " logs found."); } } } public static StringBuilder buildComplexLogMessage(String category, String user, LogLevel level, String message) { StringBuilder sb = new StringBuilder(); sb.append("[") .append(category) .append("]") .append(" [") .append(user) .append("]") .append(" [") .append(level.name()) .append("] ") .append(message); // 额外的系统信息 if (level == LogLevel.ERROR) { sb.append(" [System Info: Memory Usage High]"); } return sb; }
}
运行结果如下:
测试代码3:
package stringbuilder.com;
public class ComplexStringBuilderTest { @SuppressWarnings("unused")public static void main(String[] args) { // 用户活动记录中的信息 String userId = "U12345"; String userName = "John Doe"; String activityType = "Login"; String ipAddress = "192.168.1.1"; boolean isSuccess = true; String errorMessage = null; // 假设登录成功,没有错误信息 String additionalInfo = "User logged in from a trusted IP."; // 初始化StringBuilder构建日志消息 StringBuilder logMessage = new StringBuilder(); // 添加基础信息 logMessage.append("Log Entry for User ").append(userId).append(" (").append(userName).append("):\n"); logMessage.append("Activity Type: ").append(activityType).append("\n"); logMessage.append("IP Address: ").append(ipAddress).append("\n"); // 根据是否成功添加不同的信息 if (isSuccess) { logMessage.append("Activity Result: Success\n"); } else { logMessage.append("Activity Result: Failed\n"); if (errorMessage != null && !errorMessage.isEmpty())logMessage.append("Error Message: ").append(errorMessage).append("\n"); } // 添加附加信息 if (additionalInfo != null && !additionalInfo.isEmpty()) { logMessage.append("Additional Information: ").append(additionalInfo).append("\n"); } // 记录活动发生的时间 String timestamp = "2023-04-01T12:34:56Z"; logMessage.append("Timestamp: ").append(timestamp).append("\n"); // 输出构建的日志消息 System.out.println(logMessage.toString()); }
}
运行结果如下:
测试代码4:
package stringbuilder.com;
public class OrderInfoBuilder { public static void main(String[] args) { // 订单数据 String orderId = "O00123456"; String customerName = "John Doe"; String customerEmail = "john.doe@example.com"; double totalAmount = 199.99; // 订单包含多个商品 Product product1 = new Product("Product A", 1, 99.99); Product product2 = new Product("Product B", 2, 50.00); Product[] products = {product1, product2}; // 使用StringBuilder构建订单信息 StringBuilder orderInfo = buildOrderInfo(orderId, customerName, customerEmail, totalAmount, products); // 输出订单信息 System.out.println(orderInfo.toString()); } public static StringBuilder buildOrderInfo(String orderId, String customerName, String customerEmail, double totalAmount, Product[] products) { StringBuilder sb = new StringBuilder(); // 添加订单基本信息 sb.append("Order Information:\n"); sb.append("Order ID: ").append(orderId).append("\n"); sb.append("Customer Name: ").append(customerName).append("\n"); sb.append("Customer Email: ").append(customerEmail).append("\n"); sb.append("Total Amount: $").append(String.format("%.2f", totalAmount)).append("\n"); // 添加商品列表 sb.append("\nItems in Order:\n"); for (Product product : products) { sb.append(String.format(" - %s (Quantity: %d, Price: $%.2f)\n", product.getName(), product.getQuantity(), product.getPrice())); } // 订单处理的额外信息 String processingStatus = "Processing"; String shippingAddress = "1234 Main St, Anytown, USA"; // 订单处理状态 sb.append("\nOrder Processing Status: ").append(processingStatus).append("\n"); // 配送地址 if (shippingAddress != null && !shippingAddress.isEmpty()) { sb.append("Shipping Address: ").append(shippingAddress).append("\n"); } // 订单备注信息String remarks = ""; // 来自用户输入或数据库 // 订单备注if (remarks != null && !remarks.isEmpty()) { sb.append("\nOrder Remarks: ").append(remarks).append("\n"); } // 时间戳 String timestamp = "2023-04-01T12:34:56Z"; sb.append("\nOrder Timestamp: ").append(timestamp).append("\n"); return sb; } // 订单中的商品类 static class Product { private String name; private int quantity; private double price; public Product(String name, int quantity, double price) { this.name = name; this.quantity = quantity; this.price = price; } public String getName() { return name; } public int getQuantity() { return quantity; } public double getPrice() { return price; } }
}
运行结果如下:
2、 StringBuilder与StringBuffer的区别:
测试代码:
package stringbuilder.com;
public class ThreadSafetyDemo {public static void main(String[] args) {//使用StringBuilder(非线程安全)//创建两个线程(thread1和thread2),它们同时尝试向同一个StringBuilder实例追加内容。//由于StringBuilder不是线程安全的,这两个线程可能会相互干扰,导致最终的字符串内容不可预测。//StringBuilder的输出是乱序的。StringBuilder sbNonThreadSafe = new StringBuilder();Thread thread1 = new Thread(() -> {for (int i = 0; i < 1000; i++) {sbNonThreadSafe.append("Thread 1: ");sbNonThreadSafe.append(i);sbNonThreadSafe.append("\n");}});Thread thread2 = new Thread(() -> {for (int i = 0; i < 1000; i++) {sbNonThreadSafe.append("Thread 2: ");sbNonThreadSafe.append(i);sbNonThreadSafe.append("\n");}});thread1.start();thread2.start();try {thread1.join();thread2.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("StringBuilder result (may be unpredictable):");System.out.println(sbNonThreadSafe.toString());// 使用StringBuffer(线程安全)//创建了两个新的线程(thread3和thread4),使用StringBuffer实例。//StringBuffer是线程安全的,即使两个线程同时尝试修改它,最终的字符串内容也将是可预测的。//每个线程将按顺序追加其内容,而不会出现内容错乱的情况。//StringBuffer的输出是有序。StringBuffer sbThreadSafe = new StringBuffer();Thread thread3 = new Thread(() -> {for (int i = 0; i < 1000; i++) {sbThreadSafe.append("Thread 3: ");sbThreadSafe.append(i);sbThreadSafe.append("\n");}});Thread thread4 = new Thread(() -> {for (int i = 0; i < 1000; i++) {sbThreadSafe.append("Thread 4: ");sbThreadSafe.append(i);sbThreadSafe.append("\n");}});thread3.start();thread4.start();try {thread3.join();thread4.join();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("\nStringBuffer result (predictable):");System.out.println(sbThreadSafe.toString());}
}
运行结果如下: