小编Boh*_*ian的帖子

方法原型中varargs的多个对象类型?

我正在尝试编写可以使用任意数量的整数和字符串调用的Java函数的原型:

myMethod(1, 2, 3, "Hello", "World"); // Valid call
myMethod(4, "foo", "bar", "foobar"); // Valid call
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望以任何顺序(并且可能混合)给出整数和字符串:

myMethod(1, "Hello", 2, "World", 3); // Valid call
Run Code Online (Sandbox Code Playgroud)

我想过使用varargs,但原型中只能有一个.我的另一个想法是使用以下原型:

public void myMethod(Object ... objs) { [...] }
Run Code Online (Sandbox Code Playgroud)

...但我觉得如果用预期类型以外的东西调用它应该有一个编译错误.当然,instanceof可以执行运行时检查(),但这不是一个非常优雅的解决方案,不是吗?

你会怎么做?

java variadic-functions

13
推荐指数
2
解决办法
8240
查看次数

如何在List中获取唯一值

我有2个带有数据的文本文件.我正在阅读这些文件BufferReader并将每个文件的一列数据放入a List<String>.

我在每个数据中都有重复的数据,但我需要在第一个数据中使用唯一数据List来对抗第二个数据中的重复数据List.

如何从中获取唯一值List

java list unique-values

13
推荐指数
2
解决办法
2万
查看次数

finally块中的关闭文件不起作用

try {
    FileReader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);
    String line = null;
} catch (FileNotFoundException fnf) {
    fnf.printStackTrace();
} finally {
    fr.close();
}
Run Code Online (Sandbox Code Playgroud)

fr.close()显示一个错误:

fr无法解决

我曾经读过在finally块中关闭一个文件是一个很好的做法.
那是做错了什么的?

java try-catch-finally

12
推荐指数
2
解决办法
2万
查看次数

如何通过Tab栏控制器传递数据viewcontroller

我想通过标签栏控制器将数据从视图控制器传递到视图控制器.

我的意思是,我的故事板是这样的.

View Controller ? Tab Bar Controller ? VC1/VC2/VC3
Run Code Online (Sandbox Code Playgroud)

出于这个目的,我尝试使用PrepareforSegue,但它失败了.
代码在这里.

(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
friendsDetailViewController* vc = [[friendsDetailViewController alloc] init];
vc = (friendsDetailViewController*)[segue destinationViewController];

vc.candidateid = [[NSString alloc] init];
vc.candidateid = [candidateid objectAtIndex:selectedIndexPath.row];
Run Code Online (Sandbox Code Playgroud)

虽然我试图将数据从VC传递到VC1,但SIGABT发生在最后一行.


更新:

我已经弄明白了.这是脚本:

friendsDetailViewController* vc = [[friendsDetailViewController alloc] init];
UITabBarController* tbc = [segue destinationViewController];
vc = (friendsDetailViewController*)[[tbc customizableViewControllers] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)

首先,我必须附上Tab Bar Controller.
其次,检索每个View Controller的指针.
您可以使用objectIndex进行选择.

uitabbarcontroller

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

ConcurrentHashMap锁定

我已经在某处读过ConcurrentHashMap,整个地图对象没有被锁定,而是在Map的一部分上进行锁定.

有人可以详细说明何时锁定进入图片?

是否正确读取Map时没有涉及到锁定,但在更新时只使用锁定?

java concurrenthashmap

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

切换似乎比如果慢

我对速度感到好奇switch,认为它"非常"快,但是我有一个测试用例,似乎显示单个开关大约和4个if测试一样快,当我预期(没有坚实的理由)它和1次测试一样快.这里有两种方法我写的比较switchif:

public static int useSwitch(int i) {
    switch (i) {
        case 1: return 2;
        case 2: return 3;
        case 3: return 4;
        case 4: return 5;
        case 5: return 6;
        case 6: return 7;
        default: return 0;
    }
}

public static int useIf(int i) {
    if (i == 1) return 2;
    if (i == 2) return 3;
    if (i == 3) return 4;
    if (i == 4) return 5;
    if (i == …
Run Code Online (Sandbox Code Playgroud)

java performance if-statement switch-statement

12
推荐指数
2
解决办法
1130
查看次数

为什么单个"if"比"switch"慢?

可能重复:
Java中if/else与switch语句的相对性能差异是什么?

给出以下两种方法:

public static int useSwitch(int i) {
    switch (i) {
    case 0:
        return 1;
    default:
        return 0;
    }
}

public static int useIf(int i) {
    if (i == 0)
        return 1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

测试显示,switch执行速度比if版本快一点(我的机器每次调用1.4纳秒).

我一直认为开关的好处没有开始,直到至少有几个ifs可以避免,

为什么switch比单一的更快if

java performance if-statement switch-statement

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

Java为什么将long(64)转换为float(32)被视为加宽?

正如它从oracle说的那样

Oracle Docs的参考资料

扩展原始转换19对基本类型的特定转换称为扩展原语转换:

  1. byte to short,int,long,float或double
  2. 短,int,long,float或double
  3. char到int,long,float或double
  4. int到long,float或double
  5. 长期漂浮或加倍
  6. 漂浮加倍

如果一个浮点数有32位而一个长数据有64位,那怎么算是加宽?这不应该被视为缩小范围吗?

java promotions

12
推荐指数
2
解决办法
3243
查看次数

在插入之前清除LAST_INSERT_ID()以告知返回的内容是否来自我的插入

LAST_INSERT_ID() 通过自动增量列返回为当前连接生成的最新id,但是如何判断该值是来自最后一个插入而不是来自同一连接上的先前插入?

假设我正在使用池中的连接,该连接可能在我获得连接之前插入了一行,并且我执行了一个条件插入:

insert into mytable (colA)
select 'foo' from bar
where <some condition>;
select LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)

我无法知道返回的值是否来自我的插入.

我想到的一种方式是:

@previousId := LAST_INSERT_ID();
insert into mytable (colA)
select 'foo' from bar
where <some condition>;
select if(LAST_INSERT_ID() != @previousId, LAST_INSERT_ID(), null);
Run Code Online (Sandbox Code Playgroud)

有没有办法"清除"该LAST_INSERT_ID()值,所以我知道如果返回非零值,它是由我的SQL引起的新值?

mysql auto-increment last-insert-id

12
推荐指数
3
解决办法
3746
查看次数

如何使用gradle中的"复制"任务复制目录

我想将一系列文件和整个目录复制到单个Copy任务中的另一个目录中.我可以复制单个文件和目录的内容,但是如何复制目录本身?

这是我的任务:

task myTask(type: Copy) {
    from 'path/to/file'
    from 'path/to/dir'
    into 'path/to/target'
}
Run Code Online (Sandbox Code Playgroud)

它复制文件OK,但只复制dir中的文件.我想最终得到dir的内容path/to/target/dir(不是在path/to/target).

我找到了一个使用的工作:

task myTask(type: Copy) {
    from 'path/to/file'
    from 'path/to'
    into 'path/to/target'
    include 'dir'
}
Run Code Online (Sandbox Code Playgroud)

但这容易发生名称冲突.我实际上有很多文件和dirs要复制,我想把它作为一项任务.

directory copy gradle

12
推荐指数
2
解决办法
5197
查看次数