【Java】Java中的String类

2023-11-19


一、认识 String 类

在C语言中如果想要表示字符串,就只能使用字符数组或者字符指针,然后通过标准库提供的一系列字符串操作函数对字符串进行操作。但是这是数据与操作数据的方法分离的方式显然不符合面向对象的思想。因此在Java中,String类就是一种符合面向对象思想的字符串类,String类是用于表示字符串的类。它是Java的核心类库中的一部分,因此无需特殊导入就可以在任何Java程序中使用。

String类是不可变的,这意味着一旦创建了一个字符串对象,就不能修改其内容。每当对字符串进行修改操作时,实际上是创建了一个新的字符串对象。这种设计是为了确保字符串的不可变性,以提高性能和安全性。因此如果在频繁的字符串拼接或修改场景中,建议使用StringBuilder类或StringBuffer类,它们提供了可变的字符串操作方法,可以避免不必要的对象创建。

二、String 类的常用方法

2.1 构造方法

String类提供了多个构造方法来创建字符串对象。下面是一些常用的构造方法:

  1. String():创建一个空字符串对象。
String str = new String();
  1. String(String original):通过将指定的字符串复制一份来创建一个新的字符串对象。
String str = new String("Hello");
  1. String(char[] value):通过字符数组创建一个新的字符串对象。
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars);
  1. String(char[] value, int offset, int count):通过字符数组的指定部分创建一个新的字符串对象。offset表示起始索引,count表示要复制的字符数量。
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars, 1, 3); // 结果为 "ell"
  1. String(byte[] bytes):通过字节数组创建一个新的字符串对象,使用默认的字符集解码字节数组。
byte[] bytes = {72, 101, 108, 108, 111};
String str = new String(bytes); // 结果为 "Hello"
  1. String(byte[] bytes, int offset, int length):通过字节数组的指定部分创建一个新的字符串对象,使用默认的字符集解码字节数组。offset表示起始索引,length表示要复制的字节数量。
byte[] bytes = {72, 101, 108, 108, 111};
String str = new String(bytes, 1, 3); // 结果为 "ell"
  1. 通过直接赋值一个常量字符串创建一个新的字符串对象。
String str = "Hello";

这些是String类的一些常用构造方法,更多的方法可见Java的在线文档。

另外需要注意的是:

  1. String类型是引用类型,内部储存的并不是字符串本身,在String类的源码中,String类实例变量的结构如下:


String类的内部,最主要的两个成员变量是value数组和hash变量。在早期的Java版本中,value数组的类型是char[]类型的数组,现在新版本的都是byte[]类型的数组,其作用就是储存字符串的字符内容,数组的长度就是字符串的长度,并且有final修饰,表明字符串对象被初始化后就不能再修改了。

hash是一个缓存的哈希码值,用于快速获取字符串的哈希码。哈希码是由字符串的内容计算得到的一个整数,用于在哈希表等数据结构中进行快速查找。hash 的值在字符串对象创建时被计算并缓存起来,以避免每次调用 hashCode() 方法时都重新计算。

public static void main(String[] args) {
	// s1和s2引用的是不同对象 s1和s3引用的是同一对象
	String s1 = new String("hello");
	String s2 = new String("world");
	String s3 = s1;
	
	System.out.println(s1.length());  // 获取字符串长度---输出5
	System.out.println(s1.isEmpty());  // 如果字符串长度为0,返回true,否则返回false
}

  1. 在Java中使用""引起来的字符串也是String类型对象。

比如:

public static void main(String[] args) {
    System.out.println("Hello".getClass());
}

其输出结果是:class java.lang.String,表明使用""引起来的字符串的类型就是String

2.2 String 类对象之间的比较

字符串的比较是一种常见的操作,在Java中提供了四种字符串的比较方式:

  1. 使用equals()方法

equals()方法用于比较两个字符串的内容是否相等。它是在Object类中定义的,因此所有的Java对象都可以使用该方法。在String类中,equals()方法已经被重写,以便比较字符串的内容而不是引用。例如:

String str1 = "Hello";
String str2 = "World";
if (str1.equals(str2)) {
    System.out.println("Strings are equal.");
} else {
    System.out.println("Strings are not equal.");
}
  1. 使用compareTo()方法

compareTo()方法用于比较两个字符串的大小关系。它是在Comparable接口中定义的,String类实现了Comparable接口,因此可以使用该方法进行比较。compareTo()方法返回一个整数值,表示字符串之间的比较结果

  • 如果返回值为负数,则表示当前字符串小于被比较字符串;
  • 如果返回值为零,则表示两个字符串相等;
  • 如果返回值为正数,则表示当前字符串大于被比较字符串。

例如:

String str1 = "Apple";
String str2 = "Banana";
int result = str1.compareTo(str2);
if (result < 0) {
    System.out.println("str1 is less than str2.");
} else if (result > 0) {
    System.out.println("str1 is greater than str2.");
} else {
    System.out.println("str1 is equal to str2.");
}
  1. 使用equalsIgnoreCase()方法

equalsIgnoreCase()方法用于比较两个字符串的内容是否相等,但忽略大小写。例如:

String str1 = "Hello";
String str2 = "hello";
if (str1.equalsIgnoreCase(str2)) {
    System.out.println("Strings are equal (ignoring case).");
} else {
    System.out.println("Strings are not equal.");
}
  1. 使用==运算符

==运算符用于比较两个字符串对象的引用是否相等。它判断两个字符串对象是否指向同一个内存地址。如果两个字符串对象引用的是同一个对象,则返回true,否则返回false。例如:

String str1 = "Hello";
String str2 = "Hello";
if (str1 == str2) {
    System.out.println("References are equal.");
} else {
    System.out.println("References are not equal.");
}

需要注意的是,对于字符串的比较,通常使用equals()方法进行内容比较,而不是使用==运算符比较引用。因为==运算符比较的是对象的引用,而不是内容,只有在比较字符串的引用时才会使用==运算符。对于字符串的内容比较,应该使用equals()方法。

2.3 字符串查找

String类提供了多个用于字符串查找的方法。下面是一些常用的字符串查找方法:

  1. indexOf(String str):返回指定子字符串在原字符串中第一次出现的索引位置。如果找不到子字符串,则返回-1。
String str = "Hello, World!";
int index = str.indexOf("World");
System.out.println("Index of 'World': " + index); // 输出:Index of 'World': 7
  1. indexOf(String str, int fromIndex):从指定的起始索引位置开始,在原字符串中查找指定子字符串的第一次出现位置。
String str = "Hello, World!";
int index = str.indexOf("o", 5);
System.out.println("Index of 'o' starting from index 5: " + index); // 输出:Index of 'o' starting from index 5: 8
  1. lastIndexOf(String str):返回指定子字符串在原字符串中最后一次出现的索引位置。如果找不到子字符串,则返回-1。
String str = "Hello, World!";
int lastIndex = str.lastIndexOf("o");
System.out.println("Last index of 'o': " + lastIndex); // 输出:Last index of 'o': 8
  1. lastIndexOf(String str, int fromIndex):从指定的起始索引位置开始,从后往前在原字符串中查找指定子字符串的最后一次出现位置。
String str = "Hello, World!";
int lastIndex = str.lastIndexOf("o", 7);
System.out.println("Last index of 'o' starting from index 7: " + lastIndex); // 输出:Last index of 'o' starting from index 7: 4
  1. startsWith(String prefix):检查原字符串是否以指定的前缀开头,返回布尔值。
String str = "Hello, World!";
boolean startsWithHello = str.startsWith("Hello");
System.out.println("Starts with 'Hello': " + startsWithHello); // 输出:Starts with 'Hello': true
  1. endsWith(String suffix):检查原字符串是否以指定的后缀结尾,返回布尔值。
String str = "Hello, World!";
boolean endsWithWorld = str.endsWith("World!");
System.out.println("Ends with 'World!': " + endsWithWorld); // 输出:Ends with 'World!': true
  1. charAt(int index):返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常。
String str = "Hello, World!";
char ch = str.charAt(1);
System.out.println(ch); // 输出:e

这些方法可以用于在字符串中查找特定的子字符串、前缀或后缀、获取指定位置的字符等。它们提供了灵活的查找功能,可以帮助处理字符串中的特定内容。

2.4 字符串的转换

String类提供了多个用于字符串转换的方法。下面是一些常用的字符串转换方法:

  1. toCharArray():将字符串转换为字符数组,返回一个新的char[]数组。
String str = "Hello";
char[] charArray = str.toCharArray();
System.out.println(charArray); // 输出:Hello
  1. getBytes():将字符串转换为字节数组,使用默认的字符集编码。
String str = "Hello";
byte[] byteArray = str.getBytes();
System.out.println(Arrays.toString(byteArray)); // 输出:[72, 101, 108, 108, 111]
  1. toLowerCase():将字符串中的所有字符转换为小写形式,返回一个新的字符串。
String str = "Hello";
String lowercase = str.toLowerCase();
System.out.println(lowercase); // 输出:hello
  1. toUpperCase():将字符串中的所有字符转换为大写形式,返回一个新的字符串。
String str = "Hello";
String uppercase = str.toUpperCase();
System.out.println(uppercase); // 输出:HELLO
  1. trim():去除字符串开头和结尾的空白字符(空格、制表符、换行符等),返回一个新的字符串。
String str = "  Hello  ";
String trimmed = str.trim();
System.out.println(trimmed); // 输出:Hello
  1. valueOf():将其他类型的数据转换为字符串。valueOf()是一个静态方法,可以通过类名直接调用。它接受不同类型的参数,包括基本数据类型和对象类型,返回相应类型的字符串表示。
int num = 42;
String str = String.valueOf(num);
System.out.println(str); // 输出:42

boolean flag = true;
String boolStr = String.valueOf(flag);
System.out.println(boolStr); // 输出:true

这些方法可以用于将字符串与其他数据类型进行转换,或者对字符串进行大小写转换、去除空白字符等操作。它们提供了灵活的字符串转换功能,帮助处理字符串与其他数据类型之间的转化需求。

2.5 字符串替换

String类提供了多个用于字符串替换的方法。下面是一些常用的字符串替换方法:

  1. replace(char oldChar, char newChar):将字符串中所有的指定字符 oldChar 替换为新的字符 newChar,并返回替换后的新字符串。
String str = "Hello, World!";
String replaced = str.replace('o', '0');
System.out.println(replaced); // 输出:Hell0, W0rld!
  1. replace(CharSequence target, CharSequence replacement):将字符串中所有的指定子字符串 target 替换为新的子字符串 replacement,并返回替换后的新字符串。CharSequence是一个接口,String类实现了该接口,因此可以接受字符串作为参数。
String str = "Hello, World!";
String replaced = str.replace("World", "Java");
System.out.println(replaced); // 输出:Hello, Java!
  1. replaceAll(String regex, String replacement):使用正则表达式 regex 匹配字符串中的内容,并将匹配到的部分替换为指定的字符串 replacement,并返回替换后的新字符串。正则表达式可以用于更复杂的模式匹配和替换。
String str = "Hello, 123 World!";
String replaced = str.replaceAll("\\d", "*");
System.out.println(replaced); // 输出:Hello, *** World!
  1. replaceFirst(String regex, String replacement):使用正则表达式 regex 匹配字符串中的第一个匹配项,并将其替换为指定的字符串 replacement,并返回替换后的新字符串。
String str = "Hello, World!";
String replaced = str.replaceFirst("o", "O");
System.out.println(replaced); // 输出:HellO, World!

这些方法可以用于替换字符串中指定的字符、子字符串或模式匹配项,并返回替换后的新字符串。

2.6 字符串拆分

String类提供了多个用于字符串拆分的方法。下面是一些常用的字符串拆分方法:

  1. split(String regex):根据正则表达式 regex 将字符串拆分成子字符串数组,并返回拆分后的结果。拆分时将字符串按照匹配正则表达式的部分进行分割。
String str = "Hello, World!";
String[] parts = str.split(", ");
System.out.println(Arrays.toString(parts)); // 输出:[Hello, World!]
  1. split(String regex, int limit):根据正则表达式 regex 将字符串拆分成子字符串数组,并返回拆分后的结果。拆分时将字符串按照匹配正则表达式的部分进行分割。limit 参数指定了拆分的限制,即最多拆分出多少个子字符串。如果超过限制,剩余的部分将作为最后一个元素包含在结果中。
String str = "one,two,three,four,five";
String[] parts = str.split(",", 3);
System.out.println(Arrays.toString(parts)); // 输出:[one, two, three,four,five]

这些方法可以根据指定的分隔符或正则表达式将字符串拆分成多个子字符串,并返回拆分后的结果。

2.7 字符串截取

String类提供了多个用于字符串截取的方法。下面是一些常用的字符串截取方法:

  1. substring(int beginIndex):从指定的索引位置开始截取字符串,截取从 beginIndex 到字符串末尾的部分,并返回截取后的新字符串。
String str = "Hello, World!";
String substr = str.substring(7);
System.out.println(substr); // 输出:World!
  1. substring(int beginIndex, int endIndex):截取字符串中从 beginIndex 开始到 endIndex(不包括 endIndex)之间的部分,并返回截取后的新字符串。
String str = "Hello, World!";
String substr = str.substring(7, 12);
System.out.println(substr); // 输出:World
  1. substring(int beginIndex, int endIndex):截取字符串中从 beginIndex 开始到 endIndex(不包括 endIndex)之间的部分,并返回截取后的新字符串。
String str = "Hello, World!";
String substr = str.substring(7, 12);
System.out.println(substr); // 输出:World
  1. split(String regex):根据正则表达式 regex 将字符串拆分成子字符串数组,并返回拆分后的结果。拆分时将字符串按照匹配正则表达式的部分进行分割。
String str = "Hello, World!";
String[] parts = str.split(", ");
System.out.println(parts[0]); // 输出:Hello
System.out.println(parts[1]); // 输出:World!

这些方法可以根据指定的索引或正则表达式来截取字符串的特定部分,并返回截取后的新字符串或拆分后的子字符串数组。

2.8 字符串常量池

字符串常量池是Java中的一种特殊存储区域,用于存储字符串常量。在Java中,字符串是不可变的,即创建后不能被修改。为了提高性能和节省内存空间,Java使用了字符串常量池来共享字符串常量对象。

当我们创建一个字符串常量时(例如,使用双引号括起来的字符串字面值),Java会首先检查字符串常量池中是否存在相同值的字符串。如果存在,则返回常量池中的引用,而不会创建新的对象。这样可以避免重复创建相同内容的字符串,节省了内存空间。

例如,下面的代码中,虽然使用了两个不同的字符串对象,但它们的值相同,因此只会在字符串常量池中创建一个对象:

String str1 = "Hello";
String str2 = "Hello";

在Java中,字符串常量池位于堆内存中的特殊区域,与其他对象的存储不同。可以通过调用intern()方法来将一个字符串对象添加到字符串常量池中,或者获取字符串常量池中相同值的字符串对象的引用。intern()方法会返回字符串常量池中的引用,如果常量池中已经存在相同值的字符串,则直接返回该引用。

例如,下面的代码中,通过intern()方法将字符串对象添加到字符串常量池中,并且后续的字符串对象调用equals()方法进行比较时,将返回true

String str1 = new String("Hello").intern();
String str2 = new String("Hello");

System.out.println(str1 == str2); // 输出:true

需要注意的是,字符串常量池中的字符串是不可变的,一旦创建就不能修改。如果对字符串进行修改操作,将会创建新的字符串对象,而不会在常量池中进行修改。

字符串常量池在Java中起到了重要的作用,可以提高字符串的共享和重用,有助于节省内存空间,并提高字符串操作的效率。

2.9 字符串的不可变性

在Java中,String类的对象是不可变的,也就是说一旦创建了一个字符串对象,它的值就不能被修改。这意味着对字符串对象进行操作时,实际上是创建了一个新的字符串对象,而原始的字符串对象保持不变。

这种不可变性的特性有以下几个方面的影响和好处:

  1. 线程安全:由于字符串是不可变的,多个线程可以同时访问和共享字符串对象,而不需要担心数据的修改和同步的问题。

  2. 缓存哈希值:由于字符串的值不变,可以在创建字符串对象时计算并缓存其哈希值,以便后续的哈希操作更高效。

  3. 安全性:字符串作为参数传递给方法时,不可变性确保方法内部无法改变传递的字符串对象,避免了潜在的安全漏洞。

  4. 字符串常量池:字符串常量池利用字符串的不可变性,可以实现字符串的共享,节省内存空间。

由于字符串的不可变性,对字符串进行拼接、替换、截取等操作时,实际上是创建了一个新的字符串对象,而不是在原始对象上进行修改。这样的设计决策可以避免意外的修改和数据竞争,同时提供了更可靠和可预测的行为。

需要注意的是,尽管字符串对象本身是不可变的,但可以通过引用变量重新指向新的字符串对象来实现对字符串的修改。例如:

String str = "Hello";
str = str + ", World!"; // 创建了一个新的字符串对象,并将新的引用赋值给str变量

在这个例子中,原始的字符串对象"Hello"保持不变,而str变量指向了一个新创建的字符串对象"Hello, World!"。这也是字符串不可变性的一种表现形式。

总之,字符串的不可变性在Java中是一个重要的特性,它带来了线程安全性、安全性、哈希缓存等好处,并为字符串常量池的实现提供了基础。

三、StringBuilder 和 StringBuffer

3.1 StringBuilder

StringBuilder是Java中提供的一个可变的字符串类,它允许对字符串进行动态修改,而不会创建多个对象。与String类不同,StringBuilder对象的值是可变的,可以进行插入、追加、替换、删除等操作。

以下是StringBuilder类的一些常用方法:

  1. append(String str):将指定的字符串追加到当前字符串的末尾。
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World!");
System.out.println(sb.toString()); // 输出:Hello, World!
  1. insert(int offset, String str):在指定的偏移量位置插入指定的字符串。
StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, ", World!");
System.out.println(sb.toString()); // 输出:Hello, World!
  1. replace(int start, int end, String str):用指定的字符串替换从指定起始位置到结束位置的子字符串。
StringBuilder sb = new StringBuilder("Hello, World!");
sb.replace(7, 12, "Java");
System.out.println(sb.toString()); // 输出:Hello, Java!
  1. delete(int start, int end):删除从指定起始位置到结束位置的子字符串。
StringBuilder sb = new StringBuilder("Hello, World!");
sb.delete(7, 12);
System.out.println(sb.toString()); // 输出:Hello, !
  1. reverse():反转当前字符串。
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb.toString()); // 输出:olleH

StringBuilder类提供了许多其他方法来操作和处理字符串,如查询长度、获取指定位置的字符、获取子字符串等。它的使用类似于String,但具有可变性的特点,适合在需要频繁修改字符串的场景下使用。

需要注意的是,StringBuilder是非线程安全的,如果在多线程环境下使用,应考虑使用线程安全的StringBuffer类代替。

3.2 StringBuffer

StringBuffer是Java中提供的一个可变的、线程安全的字符串类,它与StringBuilder类似,可以进行动态修改字符串的操作。与StringBuilder不同的是,StringBuffer的方法是线程安全的,适用于多线程环境。

以下是StringBuffer类的一些常用方法:

  1. append(String str):将指定的字符串追加到当前字符串的末尾。
StringBuffer sb = new StringBuffer("Hello");
sb.append(", World!");
System.out.println(sb.toString()); // 输出:Hello, World!
  1. insert(int offset, String str):在指定的偏移量位置插入指定的字符串。
StringBuffer sb = new StringBuffer("Hello");
sb.insert(5, ", World!");
System.out.println(sb.toString()); // 输出:Hello, World!
  1. replace(int start, int end, String str):用指定的字符串替换从指定起始位置到结束位置的子字符串。
StringBuffer sb = new StringBuffer("Hello, World!");
sb.replace(7, 12, "Java");
System.out.println(sb.toString()); // 输出:Hello, Java!
  1. delete(int start, int end):删除从指定起始位置到结束位置的子字符串。
StringBuffer sb = new StringBuffer("Hello, World!");
sb.delete(7, 12);
System.out.println(sb.toString()); // 输出:Hello, !
  1. reverse():反转当前字符串。
StringBuffer sb = new StringBuffer("Hello");
sb.reverse();
System.out.println(sb.toString()); // 输出:olleH

StringBuffer类提供了许多其他方法来操作和处理字符串,类似于StringBuilderString。不同的是,StringBuffer的方法是同步的,它使用了内部的同步机制来确保线程安全,因此适用于多线程环境下的操作。

由于StringBuffer的同步性,它在性能上可能比StringBuilder稍慢。因此,如果在单线程环境下进行字符串操作,推荐使用StringBuilder;而在多线程环境下,或需要保证线程安全性时,应使用StringBuffer

3.3 String、StringBuffer 和 StringBuilder 之间的区别

在Java中,StringStringBufferStringBuilder是用于操作字符串的三个类,它们之间有以下区别:

  1. 不可变性:

    • String是不可变的,一旦创建就不能修改,任何对String的操作都会创建新的字符串对象。
    • StringBufferStringBuilder是可变的,允许对字符串进行动态修改。StringBuffer是线程安全的,而StringBuilder是非线程安全的。
  2. 线程安全性:

    • String是不可变的,因此在多线程环境下是线程安全的。
    • StringBuffer是线程安全的,它的方法使用了同步机制来保证线程安全性。
    • StringBuilder是非线程安全的,它的方法没有同步机制,适用于单线程环境。
  3. 性能:

    • String的不可变性带来了一些性能优化,例如字符串常量池和缓存的哈希值。然而,频繁的字符串拼接和修改会导致大量的临时对象创建,性能较低。
    • StringBufferStringBuilder的可变性使得字符串的操作更高效,避免了不必要的对象创建和拷贝。由于StringBuffer的线程安全性,它在性能上可能稍慢于StringBuilder
  4. 适用场景:

    • String适用于字符串不需要修改的情况,例如常量、参数传递等。
    • StringBuffer适用于多线程环境或需要线程安全的场景,例如多线程共享字符串的修改。
    • StringBuilder适用于单线程环境,不需要线程安全的场景,例如字符串的拼接、修改等操作。

综上所述,String适用于不需要修改的字符串,StringBuffer适用于多线程环境或需要线程安全的字符串操作,StringBuilder适用于单线程环境下的字符串操作。根据具体的需求和性能要求,选择适合的类来操作字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java】Java中的String类 的相关文章

  • 什么是抽象类? [复制]

    这个问题在这里已经有答案了 当我了解抽象类时 我说 WT H 问题 创建一个无法实例化的类有什么意义呢 为什么有人想要这样的课程 什么情况下需要抽象类 如果你明白我的意思 最常见的是用作基类或接口 某些语言有单独的interface构建 有
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • Android 无法解析日期异常

    当尝试解析发送到我的 Android 客户端的日期字符串时 我得到一个无法解析的日期 这是例外 java text ParseException 无法解析的日期 2018 09 18T00 00 00Z 位于 偏移量 19 在 java t
  • 如何成功地用 XML 中的批处理替换文本

    我尝试使用批处理在 XML 页面中替换字符串 但无法成功完全替换它 我有这个批处理代码 echo off setlocal EnableDelayedExpansion set search logLevel 3 set replace l
  • 蓝牙发送和接收文本数据

    我是 Android 开发新手 我想制作一个使用蓝牙发送和接收文本的应用程序 我得到了有关发送文本的所有内容逻辑工作 但是当我尝试在手机中测试它时 我看不到界面 这是Main Activity Code import android sup
  • Jetty、websocket、java.lang.RuntimeException:无法加载平台配置器

    我尝试在 Endpoint 中获取 http 会话 我遵循了这个建议https stackoverflow com a 17994303 https stackoverflow com a 17994303 这就是我这样做的原因 publi
  • 在 Java 中获取并存储子进程的输出

    我正在做一些需要我开始子处理 命令提示符 并在其上执行一些命令的事情 我需要从子进程获取输出并将其存储在文件或字符串中 这是我到目前为止所做的 但它不起作用 public static void main String args try R
  • JDBC 时间戳和日期 GMT 问题

    我有一个 JDBC 日期列 如果我使用 getDate 则会得到 date 仅部分2009 年 10 月 2 日但如果我使用 getTimestamp 我会得到完整的 date 2009 年 10 月 2 日 13 56 78 890 这正
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • Spring @Cacheable 和 @Async 注解

    我需要缓存一些异步计算的结果 具体来说 为了克服这个问题 我尝试使用 Spring 4 3 缓存和异步计算功能 作为示例 我们采用以下代码 Service class AsyncService Async Cacheable users C
  • 部署 .war 时出现 Glassfish 服务器错误:部署期间发生错误:准备应用程序时出现异常:资源无效

    我正在使用以下内容 NetBeans IDE 7 3 内部版本 201306052037 爪哇 1 7 0 17 Java HotSpot TM 64 位服务器虚拟机 23 7 b01 NetBeans 集成 GlassFish Serve
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • java 中的蓝牙 (J2SE)

    我是蓝牙新手 这就是我想做的事情 我想获取连接到我的电脑上的蓝牙的设备信息并将该信息写入文件中 我应该使用哪个 api 以及如何实现 我遇到了 bluecove 但经过几次搜索 我发现 bluecove 不能在 64 位电脑上运行 我现在应
  • Java 正则表达式中的逻辑 AND

    是否可以在 Java Regex 中实现逻辑 AND 如果答案是肯定的 那么如何实现呢 正则表达式中的逻辑 AND 由一系列堆叠的先行断言组成 例如 foo bar glarch 将匹配包含所有三个 foo bar 和 glarch 的任何
  • Android View Canvas onDraw 未执行

    我目前正在开发一个自定义视图 它在画布上绘制一些图块 这些图块是从多个文件加载的 并将在需要时加载 它们将由 AsyncTask 加载 如果它们已经加载 它们只会被绘制在画布上 这工作正常 如果加载了这些图片 AsyncTask 就会触发v
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Erlang:如何将原子转换为字符串?

    我想从原子转换为字符串 Input hello world Output hello world 我该如何实现这一目标 Use atom to list http erlang org doc man erlang html atom to
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp

随机推荐

  • 这款毕设至少得收一千五,Python实现学生教师刷脸签到系统。

    背景 今天我在母校群又接到了一个做毕业设计的单子 论题 用Python或者Java实现学生教师刷脸签到系统 一般来讲做学生信息管理系统收500 这个大家觉得报价1500贵吗 我先带大家看干货 简介 利用Python语言 Flask框架 Dl
  • mysql查询时加不加引号的问题

    在查询mysql时碰到了查询条件加引号和不加引号的问题 一 如果字段本身是int类型 如果查询条件中加了引号 比如select from user where id 4 这时候可以查出id 4的用户信息 但是使用select from us
  • 打开mysql的步骤。

    安装mysql软件之后 打开mysql 显示error Can t connect to MySQL server on localhost 10061 原因是服务器没开 这个时候workbench连接不上 然后client登录不上 总结m
  • 2023华为OD机试真题【星际篮球争霸赛/动态规划】

    题目描述 在星球争霸篮球赛对抗赛中 最大的宇宙战队希望每个人都能拿到MVP MVP的条件是单场最高分得分获得者 可以并列所以宇宙战队决定在比赛中尽可能让更多队员上场 并且让所有得分的选手得分都相同 然而比赛过程中的每1分钟的得分都只能由某一
  • Radxa Rock 3a NPU调用指南

    0x0 Radxa Rock 3a开发板介绍 Radxa Rock 3a开发板是基于瑞芯微RK3568芯片设计的 ARM CPU采用4核Cortex A55 Cortex A53的继任者 主频最高可达2 0Ghz CPU性能相当于中高端手机
  • paramiko sftp 问题记录

    paramiko 是一款非常优秀得远程ssh库 能够ssh远程到主机 并执行命令 而且还能通过sftp连接主机 笔者得测试环境 因为安全关系 ssh默认端口修改成其他端口 再往上查阅资料 连接sftp 代码 t paramiko Trans
  • 坐标移动c语言,C语言 坐标移动详解及实例代码

    搜索热词 题目描述 开发一个坐标计算工具 A表示向左移动 D表示向右移动 W表示向上移动 S表示向下移动 从 0 0 点开始移动 从输入字符串里面读取一些坐标 并将最终输入结果输出到输出文件里面 输入 合法坐标为A 或者D或者W或者S 数字
  • 【狂神说】Mybatis学习笔记(全)

    文章目录 前言 1 简介 1 1 什么是MyBatis 1 2 如何获得Mybatis 1 3 持久化 1 3 1 数据持久化 1 3 2 为什么需要持久化 1 4 持久层 1 5 为什么需要MyBatis 2 第一个Mybatis程序 2
  • 《IT项目管理》-大题&计算题保分秘籍

    经过今天的努力 已经把大部分大题和计算题全部总结完了 希望对你们有用 查看链接自取 百度网盘 APP即可获取 链接 https pan baidu com s 1U0EFY23KgTtM8lKlYnjrug pwd tehx 提取码 teh
  • 软考-嵌入式系统设计师-笔记:历年专业英语题

    文章目录 2020年 2019年 2018年 2017年 2016年 2015年 2014年 2013年 2020年 题目 加粗的为各题答案 Fog computing is a mid layer between cloud data c
  • deepIn 、 DDE 系统桌面黑屏解决方案

    桌面黑屏有两种情况 1 桌面除了底部菜单栏 其它全是黑的 解决方案 Deepin sudo apt install reinstall dde DDE sudo apt fix broken install sudo apt install
  • 基于SpringBoot和vue的若依后台管理系统 部署

    RuoYi Vue是一款前后端分离的极速后台开发框架 基于SpringBoot和Vue 目录 一 准备 二 启动前端项目 解决报错 digital envelope routines unsupported 测试 三 启动后端项目 四 运行
  • 8个适合新手的Python小项目

    这是我挑出来的8个适合新手的小项目 涉及了爬虫 多线程 selenium PhantomJs itchat 邮件发送 crontab 命令行颜色显示 excel操作 PIL 识别验证码 首先说明 天下没有免费的午餐 每个项目平均下来2元多一
  • 根据子网掩码算出 IP 地址 的网络号和主机号

    我们如何根据子网掩码算出 IP 地址 的网络号和主机号呢 举个例子 比如 10 100 122 0 24 后面的 24表示就是 255 255 255 0 子网掩码 255 255 255 0 二进制是 11111111 11111111
  • Ant design Pro V5 +Typescript + Hooks + Umi + Dev + SpringBoot + mysql + redis + scrity 实现动态菜单权限管理

    Ant design Pro V5 Typescript Hooks Umi Dev SpringBoot mysql redis scrity 实现动态菜单权限管理 企业中台架构 1 app tsx页面配置 该页面集成了登陆权限控制 动态
  • Android实战系列(三)---级联菜单

    需求A 一级菜单 多级菜单联动 1 在activity上弹出多个pop窗口 达到父菜单与子菜单级联的效果 2 多个Activity页面相互的嵌套实现多级菜单 考虑 传值 数据结构的定义 之前在用前端写Android构造级联菜单出现过标题栏不
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • Finetuner+:为企业实现大模型微调和私有化部署

    如 ChatGPT GPT4 这样的大型语言模型就像是你为公司请的一个牛人顾问 他在 OpenAI Google 等大公司被预训练了不少的行业内专业知识 所以加入你的公司后 你只需要输入 Prompt 给他 介绍一些业务上的背景知识 他就能
  • 2021-01-08

    问题 F 有序数组中插入元素 时间限制 1 Sec 内存限制 128 MB 提交 2116 解决 967 提交 状态 讨论版 题目描述 输入n n lt 20 输入n个有序整数 降序或升序 插入元素e 使新序列仍按原来的排序规则为有序序列
  • 【Java】Java中的String类

    文章目录 一 认识 String 类 二 String 类的常用方法 2 1 构造方法 2 2 String 类对象之间的比较 2 3 字符串查找 2 4 字符串的转换 2 5 字符串替换 2 6 字符串拆分 2 7 字符串截取 2 8 字