当MATLAB桌面打开时,MathWorks当前不允许您使用mex文件中的cout,因为它们已重定向stdout.他们目前的解决方法是提供一个函数mexPrintf,它们要求您使用它.在谷歌搜索了一下之后,我认为可以扩展std :: stringbuf类来完成我需要的工作.这是我到目前为止所拥有的.这是否足够强大,还是有其他方法需要重载或更好的方法来做到这一点?(寻找一般UNIX环境中的可移植性以及如果此代码未与mex可执行文件链接,则能够正常使用std :: cout)
class mstream : public stringbuf {
public:
virtual streamsize xsputn(const char *s, std::streamsize n)
{
mexPrintf("*s",s,n);
return basic_streambuf<char, std::char_traits<char>>::xsputn(s,n);
}
};
mstream mout;
outbuf = cout.rdbuf(mout.rdbuf());
Run Code Online (Sandbox Code Playgroud) 我想知道如何在数组末尾添加或附加新元素.是否有任何简单的方法可以在最后添加元素?我知道如何使用StringBuffer但我不知道如何使用它在数组中添加元素.没有ArrayList或列表我更喜欢它.我想知道StringBuffer是否适用于整数.
我在Java 1.6中编写了一个webapp并在tomcat中运行它.虽然我没有做任何明确的线程,但我想知道Spring和Tomcat幕后发生了什么.我会使用StringBuilder而不是StringBuffer遇到任何问题吗?
我知道StringBuffer和StringBuilder之间的区别.在这里阅读!
通常,正如javadoc所说,
在可能的情况下,建议首先使用此类优先于StringBuffer,因为在大多数实现中它会更快.
但是,StringBuilder的javadoc也说:
StringBuilder多个线程使用的实例不安全.如果需要这样的同步,则建议使用{@link java.lang.StringBuffer}
所以,我想知道,StringBuffer首选的情况真的存在吗?由于可变字符串主要用于单个线程,任何人都可以给我一个并发的现实场景,首选StringBuffer吗?
我希望用我的StringBuffer符号替换文本"REPLACEME".当我打印符号时,它是一个有效的字符串.当我打印我的查询时,它仍然有文本REPLACEME而不是符号.为什么?
private String buildQuery(){
String query = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(REPLACEME)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=";
deserializeQuotes();
StringBuffer symbols = new StringBuffer();
for(int i = 0; i < quotes.size();i++){
if(i == (quotes.size()-1))
symbols.append("%22" + quotes.get(i).getSymbol() + "%22%"); //end with a quote
else
symbols.append("%22" + quotes.get(i).getSymbol() + "%22%2C");
}
System.out.println("***SYMBOLS***" + symbols.toString());
query.replaceAll("REPLACEME", symbols.toString());
return query;
}
Run Code Online (Sandbox Code Playgroud) public static void main(String[] args) {
HashSet set = new HashSet();
set.add(new StringBuffer("abc"));
set.add(new StringBuffer("abc"));
set.add(new StringBuffer("abc"));
set.add(new StringBuffer("abc"));
System.out.println(set);
}
Run Code Online (Sandbox Code Playgroud)
输出:
[abc,abc,abc,abc]
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我添加StringBuffer("abc")了多次对象并Set添加了它,但Set从不添加重复项.
在Java 1.7+上我们是否还需要使用StringBuffer.append转换"this string"+"should"+"be"+"join"以获得最佳实践?
在JDK 8中,StringBuffer类有一个toStringCache,而StringBuilder没有.
/**
* A cache of the last value returned by toString. Cleared
* whenever the StringBuffer is modified.
*/
private transient char[] toStringCache;
Run Code Online (Sandbox Code Playgroud)
但为什么?
我能想到的一个可能原因是StringBuffer已经同步,因此可以更容易地实现缓存.
或者也许历史上StringBuffer是以这种方式实现的,所以旧代码在很大程度上依赖于这个功能?
鉴于具有逃逸分析和偏向锁定的现代JVM,差异是否相关?
示例代码:
StringBuffer sb = new StringBuffer("hi");
sb = null;
Run Code Online (Sandbox Code Playgroud)
题:
即使在StringBuffer被垃圾收集之后,文字字符串"hi"会以某种方式保留在内存中吗?或者它只是用于为StringBuffer创建一个char数组,然后永远不会放在内存中?
在java中修复stringbuffer长度的最佳做法是什么?也就是说,如果固定值为10且stringbuffer保持ABCDEFGHIJ,当我们追加K将导致A被清除并且结果值将是BCDEFGHIJK.我正在考虑使用StringBuffer的reverse()和setLenght()方法组合但不知道它的性能如何达到100 K长度.