关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » JAVA »Stack Overflow 上人气最旺的 10 个 Java 问题

    Stack Overflow 上人气最旺的 10 个 Java 问题

    2015-10-17 00:00:00 出处:ImportNew
    分享

    1、 为什么两个(1927年)时间相减得到一个奇怪的结果?

    (3623个赞)

    如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较:

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
        String str3 = "1927-12-31 23:54:07";  
        String str4 = "1927-12-31 23:54:08";  
        Date sDt3 = sf.parse(str3);  
        Date sDt4 = sf.parse(str4);  
        long ld3 = sDt3.getTime() /1000;  
        long ld4 = sDt4.getTime() /1000;
        System.out.println(ld4-ld3);
    }

    输出是:

    353

    为什么 ld4-lD3 不是1(因为我希望这两个时间差是一秒),而是353?

    如果将日期字符串各加一秒:

    String str3 = "1927-12-31 23:54:08";  
    String str4 = "1927-12-31 23:54:09";

    ld4-ld3 的结果是1.

    sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
    offset=28800000,dstSavings=0,
    useDaylight=false,
    transitions=19,
    lastRule=null]
    
    Locale(Locale.getDefault()): zh_CN

    解决方案

    这是上海时区,在12月31日有一个变化。

    查阅这个网址来了解上海在1927年时区变化的细节。基本上在1927年年底的午夜,始终会回拨5分52秒。所以“1927-12-31 23:54:08”实际上发生了两次,看起来Java解析了后一次的时间作为当地的日期和时间导致了差异。

    2、Java是“引用传递”还是“值传递”?

    (2480个赞)

    我一直认为Java是引用传递;然而,我看了一堆博客(例如这篇)声称不是这样的。我认为我没有理解它们之间的区别。

    给个解释?

    解决方案

    Java一直是值传递。不幸的是,他们决定把指针叫做引用,因此新人总是被搞晕。因为这些引用也是通过值传递的。

    3、一个关于Java += 操作符的问题

    (2223赞)

    直到今天我认为这个例子:

    i += j;

    只是一个简写的:

    i = i + j;

    但如果这样做:

    int i = 5;
    long j = 8;

    然而 i = i + j; 没法编译,而 i += j; 就可以编译。

    这意味着i += j; 实际上是i = (type of i) (i + j)的简写么?

    解决方案

    总有人问这类问题,JLS里有答案。参见 §15.26.2复合赋值运算符。摘录:

    E1 op= E2 型的复合赋值表达式等价于 E1 = (T)((E1) op (E2)),这里 T 是 E1 的类型,不同的是 E1 只计算一次。

    一个例子,引自 §15.26.2

    [...] 下面的代码是正确的:

    short x = 3;
    x += 4.6;

    x的结果等于7,因为它等价于:

    short x = 3;
    x = (short)(x + 4.6);

    换句话说,你的假设是正确的。

    4、HashMap 和 Hashtable 之间的不同

    (1769个赞)

    Java中 HashMap 和 Hashtable的不同是什么?

    非多线程应用中使用哪个更有效率?

    解决方案

    Java 中 HashMap 和 HashTable 有几个不同点:

    Hashtable 是同步的,然而 HashMap不是。 这使得HashMap更适合非多线程应用,因为非同步对象通常执行效率优于同步对象。 Hashtable 不允许 null 值和键。HashMap允许有一个 null 键和人一个 NULL 值。 HashMap的一个子类是LinkedHashMap。所以,如果想预知迭代顺序(默认的插入顺序),只需将HashMap转换成一个LinkedHashMap。用Hashtable就不会这么简单。

    因为同步对你来说不是个问题,我推荐使用HashMap。如果同步成为问题,你可能还要看看ConcurrentHashMap。

    5、(如何) 读取或者把一个 InputStream 转成一个 String

    (1724个赞)

    如果你有一个 java.io.InputStream 对象,如处理这个对象并生成一个字符串?

    假定我有一个 InputStream 对象,它包含文本数据,我希望将它转化成一个字符串(例如,这样我可以将流的内容写到一个log文件中)。

    InputStream 转化成 String 最简单方法是什么?

    解决方案

    使用 Apache commons IOUtils库来拷贝InputStream到StringWriter是一种不错的方式,类似这样:

    StringWriter writer = new StringWriter();
    IOUtils.copy(inputStream, writer, encoding);
    String theString = writer.toString();

    甚至

    // NB: does not close inputStream, you can use IOUtils.closeQuietly for that
    // 注意:不关闭inputStream,你可以使用 IOUtils.closeQuietly
    String theString = IOUtils.toString(inputStream, encoding);

    或者,如果不想混合Stream和Writer,可以使用 ByteArrayOutputStream。

    6、为什么Java中的密码优先使用 char[] 而不是String?

    (1574个赞)

    在Swing中,密码字段有一个getPassword()(返回 char数组)方法而不是通常的getText()(返回String)方法。同样的,我遇到过一个建议,不要使用 String 来处理密码。

    为什么String涉及到密码时,它就成了一个安全威胁?感觉使用char数组不太方便。

    解决方案

    String是不可变的。这意味着一旦创建了字符串,如果另一个进程可以进行内存转储,在GC发生前,(除了反射)没有方法可以清除字符串数据。

    使用数组操作完之后,可以显式地清除数据:可以给数组赋任何值,密码也不会存在系统中,甚至垃圾回收之前也是如此。

    所以,是的,这是一个安全问题 – 但是即使使用了char数组,仅仅缩小了了攻击者有机会获得密码的窗口,它值针对制定的攻击类型。

    7、遍历HashMap的最佳方法

    (1504个赞)

    遍历HashMap中元素的最佳方法是什么?

    解决方案

    这样遍历entrySet:

    public static void printMap(Map mp) {
        Iterator it = mp.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry pair = (Map.Entry)it.next();
            System.out.println(pair.getKey() + " = " + pair.getValue());
            it.remove(); // avoids a ConcurrentModificationException
        }
    }

    更多请查阅Map。

    8、(如何)从数组创建ArrayList

    (1468个赞)

    我有一个数组,初始化如下:

    Element[] array = {new Element(1), new Element(2), new Element(3)};

    我希望将这个数组转化成一个ArrayList类的对象。

    解决方案

    new ArrayList<Element>(Arrays.asList(array))

    9、产生一个Java的内存泄露

    (1478个赞)

    我有过一个面试,被问到如何产生一个Java内存泄露。不用说,我感到相当傻,甚至如何产生一个的线索都没有。

    那么怎么才能产生一个内存泄露呢?

    解决方案

    在纯Java中,有一个很好的方式可以产生真正的内存泄露(通过执行代码使对象不可访问但仍存在于内存中):

    应用产生一个长时间运行的线程(或者使用一个线程池加速泄露)。 线程通过一个(可选的自定义)类加载器加载一个类。 该类分配大内存(例如,new byte[1000000]),赋值给一个强引用存储在静态字段中,再将它自身的引用存储到ThreadLocal中。分配额外的内存是可选的(泄露类实例就够了),但是这样将加速泄露工作。 线程清除所有自定义类的或者类加载器载入的引用。 重复上面步骤。

    这样是有效的,因为ThreadLocal持有对象的引用,对象持有类的引用,接着类持有类加载器的引用。反过来,类加载器持有所有已加载类的引用。这会使泄露变得更加严重,因为很多JVM实现的类和类加载都直接从持久带(permgen)分配内存,因而不会被GC回收。

    10、使用Java在一个区间内产生随机整数数

    (1422个赞)
    我试着使用Java生成一个随机整数,但是随机被指定在一个范围里。例如,整数范围是5~10,就是说5是最小的随机值,10是最大的。5到10之间的书也可以是生成的随机数。

    解决方案

    标准的解决方式(Java1.7 之前)如下:

    import java.util.Random;
    
    public static int randInt(int min, int max) {
    
        Random rand;
        int randomNum = rand.nextInt((max - min) + 1) + min;
    
        return randomNum;
    }

    请查看相关的JavaDoc。在实践中,java.util.Random 类总是优于 java.lang.Math.random()。

    特别是当标准库里有一个直接的API来完成这个工作,就没有必要重复制造轮子了。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。