目录
2. StringBuffer和StringBuilder:
2.1 StringBuffer和StringBuilder的区别:
2.2 StringBuffer和StringBuilder的方法:
1. String:
String类的对象实例是不可变的,一旦创建下来,对字符串施加操作后并不改变字符串本身,而是生成了一个实例。
1.1 常见的字符串操作方法
获取信息:
length()
:获取字符串的长度。charAt(int index)
:获取字符串中指定位置的字符。提取子串:
substring(int beginIndex)
或substring(int beginIndex, int endIndex)
:获取字符串的子串,可以指定起始位置和结束位置。连接字符串:
concat(String str)
或使用+
运算符:将两个字符串链接在一起。比较字符串:
equals(Object obj)
或equalsIgnoreCase(String anotherString)
:用于比较字符串是否相等,可以忽略大小写。查找子字符串:
indexOf(String str)
或lastIndexOf(String str)
:查找指定子字符串在字符串中第一次或最后一次出现的位置。判断开头和结尾:
startsWith(String prefix)
和endsWith(String suffix)
:判断字符串是否以指定前缀或后缀开头。替换和转换:
replace(char oldChar, char newChar)
或replace(CharSequence target, CharSequence replacement)
:替换字符串中的字符或子字符串。toLowerCase()
和toUpperCase()
:将字符串转换为小写或大写形式。去除空格:
trim()
:去除字符串首尾的空格。拆分字符串:
split(String regex)
:根据指定的正则表达式将字符串拆分为子字符串数组。格式化字符串:
format(String format, Object... args)
:使用指定格式化字符串和参数创建格式化字符串。
//获取信息:
String str = "Hello, World!";
int length = str.length();
char firstChar = str.charAt(0);
System.out.println("Length: " + length);
System.out.println("First character: " + firstChar);
//提取子串:
String str = "Hello, World!";
String substr1 = str.substring(7);
String substr2 = str.substring(7, 12);
System.out.println("Substring 1: " + substr1);
System.out.println("Substring 2: " + substr2);
//连接字符串:
String str1 = "Hello, ";
String str2 = "World!";
String result = str1.concat(str2);
System.out.println("Concatenated string: " + result);
// 或者使用 + 运算符
String result2 = str1 + str2;
System.out.println("Concatenated string using + operator: " + result2);
//比较字符串:
String str1 = "hello";
String str2 = "HELLO";
boolean isEqual = str1.equalsIgnoreCase(str2);
System.out.println("Strings are equal (ignoring case): " + isEqual);
//查找子字符串:
String str = "Hello, World!";
int index1 = str.indexOf("o");
int index2 = str.lastIndexOf("o");
System.out.println("First 'o' is at index: " + index1);
System.out.println("Last 'o' is at index: " + index2);
//判断开头和结尾:
String str = "Hello, World!";
boolean startsWith = str.startsWith("Hello");
boolean endsWith = str.endsWith("World!");
System.out.println("Starts with 'Hello': " + startsWith);
System.out.println("Ends with 'World!': " + endsWith);
//替换和转换:
String str = "Hello, World!";
String replacedStr = str.replace("Hello", "Hi");
String lowerCaseStr = str.toLowerCase();
String upperCaseStr = str.toUpperCase();
System.out.println("Replaced string: " + replacedStr);
System.out.println("Lowercase string: " + lowerCaseStr);
System.out.println("Uppercase string: " + upperCaseStr);
//去除空格:
String str = " Hello, World! ";
String trimmedStr = str.trim();
System.out.println("Original string: '" + str + "'");
System.out.println("Trimmed string: '" + trimmedStr + "'");
//拆分字符串:
String str = "apple,orange,banana";
String[] parts = str.split(",");
for (String part : parts) {
System.out.println(part);
}
//格式化字符串:
String formattedStr = String.format("The value of pi is %.2f", Math.PI);
System.out.println("Formatted string: " + formattedStr);
2. StringBuffer和StringBuilder:
Java 中还提供了
StringBuffer
和StringBuilder
这两个类来处理字符串。这两个类主要用于解决字符串拼接时的性能和线程安全性问题,对于那些需要改变内容并有许多操作的字符串,可以使用StringBuffer和StringBuilder类。
2.1 StringBuffer和StringBuilder的区别:
- StringBuffer 是线程安全的可变字符序列,适合在多线程环境下进行字符串操作。
- StringBuffer 的方法都是同步的,保证了多线程情况下的数据安全,但性能相对较低。
- 适合在单线程或者多线程安全要求较高的场景下使用。
示例:
StringBuffer sb = new StringBuffer(); sb.append("Hello"); sb.append("World"); String result = sb.toString();
- StringBuilder 也是可变字符序列,但不是线程安全的,适合在单线程环境下进行字符串操作。
- StringBuilder 的方法都是非同步的,性能比 StringBuffer 更高。
- 适合在单线程环境下进行字符串操作,例如在需要频繁进行字符串拼接的场景。
示例:
StringBuilder sb = new StringBuilder(); sb.append("Hello"); sb.append("World"); String result = sb.toString();
总的来说,如果在单线程环境下进行字符串操作,推荐使用 StringBuilder 来提升性能;如果在多线程环境下进行字符串操作,需要考虑线程安全性,则使用 StringBuffer。根据具体需求选择合适的类来操作字符串,可以更高效地处理字符串拼接和修改操作。
2.2 StringBuffer和StringBuilder的方法:
StringBuffer
和 StringBuilder
类都用于进行可变的字符串操作,主要提供了以下方法:
-
共同方法:
append(String str)
:将指定字符串追加到序列。insert(int offset, String str)
:在指定位置插入字符串。delete(int start, int end)
:删除指定范围内的字符。replace(int start, int end, String str)
:替换指定范围内的字符。reverse()
:反转序列中的字符。
-
StringBuffer 特有方法:
capacity()
:返回当前容量。ensureCapacity(int minCapacity)
:确保容量至少等于指定的最小值。setCharAt(int index, char ch)
:将指定索引处的字符设置为指定的字符。substring(int start, int end)
:返回一个新的字符串,它包含此序列当前所包含的字符子序列。
-
StringBuilder 特有方法:
- 与 StringBuffer 具有相同的方法,但不是线程安全的。
区别:
String
是不可变的字符串类型,一旦创建就不能被修改,任何修改字符串的操作实际上都会创建一个新的字符串对象。这种不可变性使得字符串在多线程环境下更加安全。StringBuffer
是线程安全的可变字符序列,适合在多线程环境下进行字符串操作,其方法都是同步的。StringBuilder
也是可变字符序列,但不是线程安全的,适合在单线程环境下进行字符串操作,其方法都是非同步的,并且性能比StringBuffer
更高。
因此,StringBuffer
和 StringBuilder
主要用于解决字符串拼接时的性能和线程安全性问题,可以动态地构建字符串内容,而 String
则适合于表示不变的字符串常量。
3. 开发场景(解析txt文件并保存到数据库):
注:只包含部分代码主要用来展示字符串的实际操作:
public void dataParser(File folder){
//遍历主文件夹中的所有子文件夹
if (folder.exists() && folder.isDirectory()){
File[] subFolders = folder.listFiles(File::isDirectory);
if (subFolders != null){
for (File subFolder : subFolders){
processSubFolder(subFolder);
// 递归调用dataParser方法,遍历子文件夹中的文件夹
dataParser(subFolder);
}
}
}
}
private void processSubFolder(File subFolder){
String subFolderName = subFolder.getName();
File[] files = subFolder.listFiles((dir, name) -> name.endsWith(".txt"));
if (files != null){
for (File file : files){
processFile(file,subFolderName);
}
}
}
private void processFile(File file, String subFolderName) {
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
switch (subFolderName) {
case "01":
l01Service.save(readWholeFile(br));
break;
case "02":
l02Service.save(readWholeFile(br));
break;
//.....
}
} catch (IOException e) {
e.printStackTrace();
}
}
private String readWholeFile(BufferedReader br) throws IOException {
StringBuilder content = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
content.append(line);
}
return content.toString();
}
public File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException {
File file = new File(Objects.requireNonNull(multipartFile.getOriginalFilename()));
FileCopyUtils.copy(multipartFile.getBytes(), file);
return file;
}
public File saveUploadedFile(MultipartFile file) throws IOException {
String uploadDir = "D:\\uploads\\";
File directory = new File(uploadDir);
if (!directory.exists()) {
directory.mkdirs();
}
File savedFile = new File(uploadDir + file.getOriginalFilename());
file.transferTo(savedFile);
return savedFile;
}
//save方法
public boolean save(String line) {
String newLine = line.replaceAll("(?<=;);", "null;");
String replaceAll = newLine.replaceAll("\\|\\|", "");
String[] split = replaceAll.split("~");
String[] finalSplit = split[0].split(";");
for (String s : split) {
L01 l01 = new L01();
System.out.println("***********************************************************");
System.out.println(" ");
System.out.println(s);
if (!s.equals(split[0])) {
//文件体
String[] strings = s.split(";");
//文件头数据解析设置
l01.seth("null".equals(finalSplit[0]) ? null : finalSplit[0]);
l01.setc("null".equals(finalSplit[1]) ? null : finalSplit[1]);
//日期类型转换
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//数据时间
try {
LocalDateTime dataTime = LocalDateTime.parse(finalSplit[2], formatter);
Date newDataTime = Date.from(dataTime.atZone(ZoneId.systemDefault()).toInstant());
l01.setDataTime(newDataTime);
} catch (DateTimeParseException e) {
// 处理日期格式解析异常
System.err.println("Date parse exception for dataTime: " + e.getMessage());
l01.setDataTime(null); // 设置默认日期
} catch (Exception e) {
// 其他异常,打印错误日志
System.err.println("Other exception: " + e.getMessage());
}
//解析设置文件体
l01.setFm("null".equals(strings[0]) ? null : strings[0]);
l01.setFz("null".equals(strings[1]) ? null : strings[1]);
//设置xyz坐标
//X
try{
l01.setX("null".equals(strings[2]) ? null : new BigDecimal(strings[2]));
}catch (NumberFormatException e){
// 处理NumberFormatException异常,打印错误日志
System.err.println("NumberFormatException: " + e.getMessage());
l01.setX(null); // 设置默认值为null
}
//Y
try{
l01.setY("null".equals(strings[3]) ? null : new BigDecimal(strings[3]));
}catch (NumberFormatException e){
// 处理NumberFormatException异常,打印错误日志
System.err.println("NumberFormatException: " + e.getMessage());
l01.setY(null); // 设置默认值为null
}
//Z
try{
l01.setZ("null".equals(strings[4]) ? null : new BigDecimal(strings[4]));
}catch (NumberFormatException e){
// 处理NumberFormatException异常,打印错误日志
System.err.println("NumberFormatException: " + e.getMessage());
l01.setZ(null); // 设置默认值为null
}
Date date = new Date();
l01.setGgddiw(date);
l01.setGgddiwa(date);
//保存数据到数据库
save(l01);
for (String s1 : strings){
System.out.println(s1);
}
}
}
return true;
}