我在同一台机器上连续运行这个程序:
class Test {
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.hashCode());
}
}
Run Code Online (Sandbox Code Playgroud)
每次在我的机器上运行程序(Windows 7 64位)时结果都是一样的:4384790
在另一台机器上(Windows server 2008,64位),大多数时候它给了我:1671711.但有时候结果是:11394033.
在我的机器上,我在Java HotSpot(TM)Client VM 1.6.0_26/1.6.0_33下运行该程序
我已经阅读了Object类的文档:
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术.)
但是如果确实通过将对象的内部地址转换为整数来实现hashCode(),我仍然不明白为什么每次运行它时Java VM都为Test对象分配相同的地址.
是否确切知道默认的hashCode()如何运作?
在C Primer Plus(第6版)中,它 以这种方式定义尾递归概念:
在最简单的递归形式中,递归调用位于函数的末尾,就在return语句之前.这称为尾递归或结束递归,因为递归调用最后会发生.尾递归是最简单的形式,因为它就像一个循环.
它给出了以尾递归方式计算阶乘的示例:
long rfact(int n) {
long ans;
if (n > 0)
ans = n * rfact(n - 1);
else
ans = 1;
return ans;
}
Run Code Online (Sandbox Code Playgroud)
它也是一个侧面说明,在我看来这是不正确的:
请注意,虽然对rfact()的递归调用不是函数中的最后一行,但它是n> 0时执行的最后一个语句,因此它是尾递归.
可以清楚地看到,最后一个语句是n * rfact(n - 1),如果递归扩展,它将导致一系列延迟乘法.该过程在本质上是递归的,从而所描述的实现不能尾递归这里.
这个例子具有误导性.你有什么意见?
java.io.Console类的javadoc中有一个安全说明:
安全说明:如果应用程序需要读取密码或其他安全数据,则应使用readPassword()或readPassword(String,Object ...)并在处理后手动将返回的字符数组归零,以最大限度地缩短内存中敏感数据的生命周期.
Console cons;
char[] passwd;
if ((cons = System.console()) != null &&
(passwd = cons.readPassword("[%s]", "Password:")) != null) {
...
java.util.Arrays.fill(passwd, ' ');
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么你需要这么激烈的措施?当读取密码的方法弹出堆栈时,passwd局部变量引用的数组对象将有资格进行垃圾回收.没有人(甚至是攻击者)可以获得对该数组的引用,假设数组没有转义方法范围.
那么为什么你需要修改数组(删除密码),当你知道一旦方法弹出堆栈就有资格获得GC?他们说:
最小化内存中敏感数据的生命周期
但对我来说,这种编程风格似乎相当......绝望.
我需要将java.util.Map传递给aa测试方法在tsv文件中,我尝试创建一个这样的字典:
${MYDICT} = Create Dictionary a 1 b 2
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误:
设置变量'$ {MYDICT} =创建字典a 1 b 2'失败:变量名'$ {MYDICT} =创建字典a 1 b 2'无效.
我在变量部分声明字典,如下所示:
${MYDICT}= Create Dictionary COUNTRY US CURRENCY_CODE USD
Run Code Online (Sandbox Code Playgroud)
测试用例是这样的:
testCase1 run the test using ${MYDICT}
Run Code Online (Sandbox Code Playgroud)
并且测试关键字的定义如下:
run the test using ${MAP}
call java method ${MAP}
Run Code Online (Sandbox Code Playgroud)
而Java方法是:
public void CallJavaMethod(Map<String, String> map)
Run Code Online (Sandbox Code Playgroud)
但是,如果我在Test关键字部分声明字典,一切正常,并调用Java方法:
run the test using
${MYDICT}= Create Dictionary COUNTRY US CURRENCY_CODE USD
call java method ${MYDICT}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我必须在我想要使用它的地方声明字典.如果我想用不同的输入运行该测试用例怎么办?
修复(使用@Uri和@Brian建议的内容)我尝试使用"Set Suite Variable",如下例所示:
*** Settings ***
Library Collections
Suite Setup …Run Code Online (Sandbox Code Playgroud) 如果A定义如下:
class A {
List<B> bList;
}
Run Code Online (Sandbox Code Playgroud)
如果给出A的列表(列表aList),我怎样才能将它转换为包含存储在aList中每个元素中的所有B的List?我想用番石榴来做这件事.
我是C新手,我想执行此任务:声明并初始化一个字符串,然后将每个字符串元素重新分配给一个新值.
以这种方式编写代码:
char *str = "geeksforgeeks\0";
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
抛出分段错误.
但是如果我以这种方式编写代码:
char string[] = "geeksforgeeks\0";
char *str = string;
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
程序行为正确.
还有这段代码:
char str[] = "geeksforgeeks\0";
for (int i = 0; str[i] != '\0'; ++i) {
str[i] = 'a';
}
Run Code Online (Sandbox Code Playgroud)
行为正确.
两者有什么区别?不应该相同吗?