小编Ale*_*lex的帖子

hashCode()的默认行为

我在同一台机器上连续运行这个程序:

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()如何运作?

java

5
推荐指数
2
解决办法
544
查看次数

尾递归调用(C primer plus book example)

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),如果递归扩展,它将导致一系列延迟乘法.该过程在本质上是递归的,从而所描述的实现不能尾递归这里.

这个例子具有误导性.你有什么意见?

c tail-recursion

5
推荐指数
1
解决办法
146
查看次数

使用System.console()读取密码

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

4
推荐指数
2
解决办法
669
查看次数

创建一个字典并将其作为映射传递给Robot Framework中的Java方法

我需要将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)

java robotframework

4
推荐指数
1
解决办法
1万
查看次数

如何将List <A>转换为List <B>?

如果A定义如下:

class A {
    List<B> bList;
}
Run Code Online (Sandbox Code Playgroud)

如果给出A的列表(列表aList),我怎样才能将它转换为包含存储在aList中每个元素中的所有B的List?我想用番石榴来做这件事.

java list guava

1
推荐指数
1
解决办法
134
查看次数

C字符串赋值给出了分段错误

我是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)

行为正确.

两者有什么区别?不应该相同吗?

c c-strings

0
推荐指数
2
解决办法
534
查看次数

标签 统计

java ×4

c ×2

c-strings ×1

guava ×1

list ×1

robotframework ×1

tail-recursion ×1