我有一个包含许多对象的向量。我的代码使用循环根据特定条件将对象添加到 Vector。我的问题是,当我将对象添加到 Vector 时,原始对象引用是否添加到向量中,或者 Vector 是否创建该对象的新实例并添加它?
例如,在以下代码中:
private Vector numbersToCalculate;
StringBuffer temp = new StringBuffer();
while(currentBuffer.length() > i) {
//Some other code
numbersToCalculate.add(temp);
temp.setLength(0); //resets the temp StringBuffer
}
Run Code Online (Sandbox Code Playgroud)
我正在做的是将“temp”StringBuffer 添加到numbersToCalculate Vector 中。我应该在循环中创建一个新的 StringBuffer 并添加它,还是这段代码可以工作?谢谢您的帮助!
埃里克
我有以下代码,试图将 StringBuffer 对象作为键放入 TreeSet 中。我这样做的原因是看看是否可以将可变对象作为键。我没有收到任何编译错误。但是当我运行此代码时,我收到代码下方的错误。特别是,我明白了java.lang.StringBuffer cannot be cast to java.lang.Comparable。这个错误表明什么?
从javadoc我看到StringBuffer类被声明为final(public final class StringBuffer),这是否意味着它是不可变的,因此是可散列的?
我是散列和不可变的东西的新手,所以请在这里帮助我。
谢谢
import java.util.*;
class MutableKeys {
public static void main(String[] args) {
StringBuffer one = new StringBuffer("one");
StringBuffer two = new StringBuffer("two");
StringBuffer three = new StringBuffer("three");
Set<StringBuffer> sb=new TreeSet<StringBuffer>();
sb.add(one);
sb.add(two);
sb.add(three);
System.out.println("set before change: "+ sb);
one.append("onemore");
System.out.println("set After change: "+ sb);
}
}
Exception in thread "main" java.lang.ClassCastException: java.lang.StringBuffer cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(TreeMap.java:542)
at java.util.TreeSet.add(TreeSet.java:238) …Run Code Online (Sandbox Code Playgroud) 一个字节不能容纳来自世界上各种语言的字符的 unicode。所以使用字节数组我们不能有不同语言的字符串。为什么这些类使用字节数组而不是字符数组?
更新:
class First
{
public static void main(String[] args)
{
System.out.println();
String s = "\u0935\u0902\u0926\u0947 \u092e\u093e\u0924\u0930\u092e\u094d";
String s1 = "???? ??????";
System.out.println(sb);
System.out.println(sb1);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为上面的字符串每个字符需要两个字节。它们如何可以容纳在一个字节中?
给定:Class没有字段,每个变量都是本地的.littleString是通过在Eclipse中重构bigString创建的:
public String bigString()
{
StringBuffer bob = new StringBuffer();
this.littleString(bob);
return bob.toString();
}
private void littleString(final StringBuffer bob)
{
bob.append("Hello, I'm Bob");
}
Run Code Online (Sandbox Code Playgroud)
方法littleString不应该传回StringBuffer,但它是.什么样的黑魔法在这里?这打破了我所知道的所有封装规则.我很震惊,言语让我失望.
选择StringBuffer和之间的标准StringBuilder
我想创建自己的StringBuffer,它还有2-3个方法添加到java.lang.StringBuffer中.由于原始类是final,我无法扩展该类.
现在,如果我将类复制粘贴到我自己的类中,则表示"AbstractStringBuilder不可见"错误.
如何在我自己的命名空间中扩展此类(比如com.util).
我想在String中插入多个单词,但offset相对于原始String:
StringBuffer sb = new StringBuffer("abcdefghijk");
sb.insert(3,"123");
sb.insert(5,"456");
System.out.println(sb);
Run Code Online (Sandbox Code Playgroud)
结果:
abc124563defghijk
Run Code Online (Sandbox Code Playgroud)
我希望结果是:
abc123de456fghijk
Run Code Online (Sandbox Code Playgroud)
我能怎么做?谢谢你的任何建议.
所以对于我正在做的任务(仍然是初学者)我有一个名为Anagram的类的默认构造函数,它看起来像这样:
private StringBuffer word1, word2
public void Anagram(String s, String d){
StringBuffer word1 = new StringBuffer(s);
StringBuffer word2 = new StringBuffer(d);
}
Run Code Online (Sandbox Code Playgroud)
但是当我从另一个文件中调用此方法时,如下所示:
public Opponent(){
Anagram an = new Anagram(RandomWord.nextWord(),RandomWord.nextWord());
turn = 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,说构造函数不接受任何参数?我究竟做错了什么?
我目前正在做一段代码,必须能够匹配一些正则表达式,并在匹配正则表达式的字符串中进行一些替换.
为了做到这一点,我在java中使用matcher对象.但正如您可以在互联网上看到的那样,所有示例都使用StringBuffer来使用appendreplacement和appendtail方法(oracleDoc)进行替换.
但是当我推送我的代码时,Sonar抱怨使用stringbuffer而不是stringbuilder.
显然,一些开发人员抱怨这里.
我找到了一种不使用StringBuffer并使用StringBuilder的方法,但我确信这不如使用StringBuffer那样有效(并且可能是一种不好的做法).您可以在junit测试中复制粘贴,此示例代码如下:
String entry = "Actual 4.11-6 and 13-5";
String expectedReturn = "Actual 4*11^(-6) and 13^(-5)";
String number = "(^|\\s)-?\\d+((\\.||,)\\d+){0,1}(.\\d+){0,1}-\\d+";
Pattern pattern = Pattern.compile(number);
Matcher matcher = pattern.matcher(entry);
//USING STRING BUFFER
StringBuffer stringBuffer = new StringBuffer();
String substring;
while(matcher.find()){
substring = matcher.group(0);
matcher.appendReplacement(stringBuffer,substring.replace(".","*").replace("-","^(-")+")");
}
matcher.appendTail(stringBuffer);
//USING STRING BUILDER
matcher = pattern.matcher(entry);
int lastIndex = 0;
StringBuilder stringBuilder = new StringBuilder();
while(matcher.find()){
stringBuilder.append(entry.substring(lastIndex,matcher.start()));
substring = matcher.group(0);
stringBuilder.append(substring.replace(".","*").replace("-","^(-")+")");
lastIndex = matcher.end(); …Run Code Online (Sandbox Code Playgroud) Java中的StringBuffer/ StringBuilderclasses主要用于修改String值,而不必每次都初始化一个新的String对象.
是否有一个特定的原因,它不使用一个LinkedListChar数组作为它的底层数据结构?
将char插入到Array中将始终导致O(n)时间将所有元素复制到下一个索引,而在o(1)时间内将其复制到a LinkedList.
java ×10
stringbuffer ×10
string ×2
append ×1
arrays ×1
comparable ×1
constructor ×1
hashset ×1
java-9 ×1
linked-list ×1
methods ×1
sonarqube ×1
treeset ×1
vector ×1