我想从表示十六进制值(大写或小写)的字符转换为字节,如
'0'->0, '1' -> 1, 'A' -> 10, 'a' -> 10, 'f' -> 15 etc...
Run Code Online (Sandbox Code Playgroud)
我会经常调用这种方法,所以性能很重要.有没有比使用预先初始化HashMap<Character,Byte>从中获取值更快的方法?
回答
看起来这是使用switch-case和Jon Skeet的直接计算解决方案之间的一个折腾 - 尽管如此,交换机案例解决方案似乎有点微不足道.Greg的阵列方法胜出.以下是各种方法的200,000,000次运行的性能结果(以ms为单位):
Character.getNumericValue:
8360
Character.digit:
8453
HashMap<Character,Byte>:
15109
Greg's Array Method:
6656
JonSkeet's Direct Method:
7344
Switch:
7281
Run Code Online (Sandbox Code Playgroud)
多谢你们!
基准方法代码
你好,JonSkeet,你是老竞争对手.;-)
public class ScratchPad {
private static final int NUMBER_OF_RUNS = 200000000;
static byte res;
static HashMap<Character, Byte> map = new HashMap<Character, Byte>() {{
put( Character.valueOf( '0' ), Byte.valueOf( (byte )0 ));
put( Character.valueOf( '1' ), Byte.valueOf( …Run Code Online (Sandbox Code Playgroud) 当可用内存达到某个阈值时,是否有一种优雅的方法可以自动向我的Java应用程序发出内存警告?
请注意,这是一个Jeopardy风格的问题,我已经有了答案,只是想在这里发布以供世界发现,因为解决方案帮助了我一堆.
是否有更好,更优雅(和/或可能更快)的方式
boolean isNumber = false;
try{
Double.valueOf(myNumber);
isNumber = true;
} catch (NumberFormatException e) {
}
Run Code Online (Sandbox Code Playgroud)
...?
编辑:因为我不能选择两个答案我正在使用正则表达式,因为a)它优雅而且b)说"Jon Skeet解决了问题"是一个重言式,因为Jon Skeet本身就是所有问题的解决方案.
我有一个TextView带OnTouchListener.我想要的是当我得到时用户指向的字符索引MotionEvent.有没有办法获得的基础字体指标TextView?
在Tomcat中,当服务器关闭时,它会尝试将它知道的类中的所有静态变量设置为null.通过触摸这些类,它们的静态初始化器运行,这可能导致我们的一些具有大量静态初始化器的遗留类的无限循环.
是否有一种优雅的方法来检测当前是否正在关闭?然后我们可以在静态初始化器的顶部检查我们是否处于关闭模式,然后忽略初始化.
我们找到的唯一可行的方法就是优雅:
try{
Thread hook = new Thread();
Runtime.getRuntime().addShutdownHook( hook ); // fires "java.lang.IllegalStateException: Shutdown in progress" if currently in shutdown
Runtime.getRuntime().removeShutdownHook( hook );
}catch(Throwable th){
throw new Error("Init in shutdown thread", th );
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试构建IKVM(请参阅此问题),但现在遇到了与IKVM无关的问题,因此我打开了一个新问题:
使用Visual Studio 2008命令提示符(从"开始"菜单)在IKVM目录上运行nant时,出现以下错误:
Run Code Online (Sandbox Code Playgroud)ikvm-native-win32: [cl] Compiling 2 files to C:\ikvm-0.36.0.11\native\Release'. [cl] jni.c [cl] os.c [cl] C:\ikvm-0.36.0.11\native\os.c(25) : fatal error C1083: Cannot open include file: 'windows.h': No such file or directory [cl] Generating Code... BUILD FAILED C:\ikvm-0.36.0.11\native\native.build(17,10): External Program Failed: cl (return code was 2)
我安装了Platform SDK.我错过了什么?我确定这很简单......
编辑#1我刚刚检查过 - 我在路径上有包含windows.h的目录. 编辑#2找到答案(参见下面的答案):包含windows.h的目录需要在"Include"路径变量中.
我来自Java,目前正在开发一个C#项目.建议的方法是:a)单元测试现有的C#代码和b)为C#开发完成TDD?
对于Visual Studio和C#代码,还有相当于EMMA/EclEmma(免费但功能强大的代码覆盖工具)吗?
我有以下课程:
public abstract class AbstractParent {
static String method() {
return "OriginalOutput";
}
}
Run Code Online (Sandbox Code Playgroud)
我想嘲笑这个方法.我决定使用JMockit.所以我创建了一个模拟类:
public class MockParent {
static String method() {
return "MOCK";
}
}
Run Code Online (Sandbox Code Playgroud)
我的测试代码如下所示:
public class RealParentTest {
@Before
public void setUp() throws Exception {
Mockit.redefineMethods( AbstractParent.class, MockParent.class );
}
@Test
public void testMethod() {
assertEquals(MockParent.method(),AbstractParent.method());
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个测试表明AbstractParent返回"OriginalOutput"而不是"MOCK".有什么想法吗?难道我做错了什么?我已经尝试将我的模拟类声明为抽象,但无济于事.
编辑注意,使方法公开会导致测试运行没有问题...这很奇怪,因为使用JMockit,您应该能够模拟任何范围的方法.
回答只有mock方法需要公开,你可以保留原来的方法.
我有一个可编辑的JTable,并设置了一个DefaultCellEditor,如下所示:
colModel.getColumn( 1 ).setCellEditor( new DefaultCellEditor( txtEditBox ) {
// ...
@Override
public void cancelCellEditing() {
super.cancelCellEditing();
// handling the event
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是,在编辑此列中的单元格时按下escape时,虽然编辑模式已完成,但不会调用此方法.有什么想法吗?难道我做错了什么?有没有办法处理这个(除了手动添加KeyListener)?