这里本意是希望用当前类来加载希望的对象, 但是这里的getClass()可能抛出异常, 特别在一些受管理的环境中, 比如应用服务器, web容器, Java WebStart环境中, 最好的做法是使用当前应用上下文的类加载器来加载 这里有两个错误, 一个是没有没有将毫秒归零, 不过最大的错误是没有指定TimeZone, 不过一般的桌面应用没有问题, 但是如果是服务器端应用则会有一些问题, 比如同一时刻在上海和伦敦就不一样, 因此需要指定的 关于时间的问题可以参考这篇文章: http://www.odi.ch/prog/design/datetime.php 这里主要的问题是Date对象并不包含Time Zone信息. 当然这里又涉及到另外一个OO设计的问题, 对外暴露Date实例本身就是不好的做法(一般的做法是在setter方法中设置Date引用参数的clone对象). 如果java编译器能针对这种情况给出警告. 或者在java语言规范中不支持浮点数类型的==操作就最好了。 正确的写法: ? 用浮点数来保存money 错误的写法: ? 这个也是一个老生常谈的错误.
本文为《Java Coding Problems》读书笔记。学习语言从解决问题开始,《Java Coding Problems》一书中包含了Java编程中常遇到的一些问题。 57Working With Date And Time 58-77Type Inference 78-98Arrays, Collections, And Data Structures 99-128Java I/O Paths, Files, Buffers, Scanning, And Formatting 129-148Java Reflection Classes, Interfaces, Constructors 书中以Java的方式解决诸多常见问题。后续文章中记录这些问题的解法,以此学习Java语言的常规技巧。 参考资料:https://learning.oreilly.com/library/view/java-coding-problems/9781789801415/。
原文:Java Coding Problems 协议:CC BY-NC-SA 4.0 贡献者:飞龙 本文来自【ApacheCN Java 译文集】,自豪地采用谷歌翻译。 本节介绍的问题和解决方案基于 Java 语言架构师 Brian Goetz 的定义: “Optional旨在为库方法返回类型提供一种有限的机制,在这种情况下,需要有一种明确的方式来表示无结果,并且使用null 问题 使用以下问题来测试你的Optional编程能力。 本场景的候选对象是 Java 反射 APIMethod.invoke()(见第 7 章、“Java 反射类、接口、构造器、方法、字段”。 isbn1 = get(isbns, "Book1"); // null String isbn2 = get(isbns, "Book2"); // 123-456-789 String isbn3
/** * 学习ThreadLocal * Created by mrf on 2016/3/6. */ public class ConnectionManager { private =null) connection.close(); } } 假设有这样一个数据库连接管理类,这段代码在单线程中使用没有任何问题的,但是如果在多线程就会存在线程安全问题: 那么,大家来自习分析一下这个问题,这地方到底需不需要讲connect变量进行共享?事实上,是不需要的。 ,由于每次都是在方法内部创建的连接,那么线程之间自然不存在线程安全问题。 /** * Created by mrf on 2016/3/4. */ public class TestThreadLocal { private static ThreadLocal<
2天的时间完成 HTML+Erlang的Todo应用的前后端 2天时间把3、4、5、6的事情发表到博客上去 3天时间学习PhoneGap引擎的基本使用 2天时间修改你的web页面以适应PhoneGap, ,而程序员思维经常被当做贬义词,因为多数情况下程序员思考问题像个计算机,并把这种思考模式带到了生活当中。 复杂到看不出问题还是简单到明显没有问题? 熟悉git吗?熟悉svn吗?他们的原理如何?最佳实践呢? 代码运行效率 统计过CPU/GPU/磁盘IO/网络IO/内存的消耗吗? 一次磁盘IO耗时多少? 至少一门静态编程语言,一门动态编程语言,一门函数性语言 2. 会web编程、app编程 3. 会大数据相关的技术:存储、挖掘、分析 4. 实践 其实这只是变为优秀程序员的一个步骤而已,根据我的观察,多数人学习编程时死在了这个山头。
本章包括 21 个涉及 JEP286 或 Java 局部变量类型推断(LVTI)的问题,也称为var类型。这些问题经过精心设计,以揭示最佳实践和使用var时所涉及的常见错误。 问题 使用以下问题来测试您的类型推断编程能力。 结合 LVTI 和面向接口编程技术:编写一个程序,通过面向接口编程技术来举例说明var的用法。 结合 LVTI 和菱形运算符:编写一个程序,举例说明var和菱形运算符的用法。 a41c-4cc5-bff2-9d08083bcc91.png)] 这个问题的解决方案包括使用显式 Java 字面值: // Prefer var intNumber = 10; // inferred 使用var而不考虑可能的清晰度损失会产生这些问题。像这样的一些问题和代码将成为一个真正的痛苦。 83 LVTI 与面向接口编程技术相结合 Java 最佳实践鼓励我们将代码绑定到抽象。
Executors 在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。 Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。 因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程 Java 开发者很有必要学习和理解他们,以便更高效的使用 Java 提供的不同类型的线程池。 3、有界队列。
本章包括 22 个涉及 Java 函数式编程的问题。这里,我们将重点讨论在流中遇到的涉及经典操作的几个问题(例如,filter和map),并讨论无限流、空安全流和缺省方法。 一旦您涵盖了本章和上一章,您就可以在生产应用上释放函数式编程了。下面的问题将为您准备各种各样的用例,包括角落用例或陷阱。 问题 使用以下问题来测试您的函数式编程能力。 在流和函数式编程(java8)之前,这样的任务是通过一堆繁琐、冗长且容易出错的意大利面代码应用于集合的。从 Java8 开始,我们有分组收集器。 在下一节中,我们来看看单级分组和多级分组。 /raw/master/docs/java-coding-prob/img/f66eb284-6695-44a3-83c3-f787b1cd75a3.png)] 因此,在甜瓜分类示例中,一个键是Melon /apachecn/apachecn-java-zh/raw/master/docs/java-coding-prob/img/299fb4da-3ba6-408e-bf3c-3bf925db688b.png
这里有一个问题,connect可以指定超时时间,但是read无法指定超时时间。但是可以设置阻塞(block)时间。 正确的写法: ? 为了解决这些问题,一般采用缓存和异步/消息队列处理。 频繁使用计时器 错误代码: ? 这是EJB3的一个查询操作,可能出现异常的原因是:结果不唯一;没有结果;数据库无法访问,而捕获所有的异常,设置为null将掩盖各种异常情况。 正确的写法: ? 忽略所有异常 ? 这个代码有两个问题, 一个是没有告诉调用者, 系统调用出错了. 第二个是日志没有出错原因, 很难跟踪定位问题。 正确的写法: ? 重复包装RuntimeException 错误的写法: ?
本章包括涉及 Java 并发的 13 个问题,涉及 Fork/Join 框架、CompletableFuture、ReentrantLock、ReentrantReadWriteLock、StampedLock 读完本章,您将对并发性有相当的了解,这是每个 Java 开发人员都需要的。 问题 使用以下问题来测试您的并发编程能力。 -3 Total: 0 让我们看看另一个问题。 以下是可能的输出: [INFO ] Fetch invoice by: ForkJoinPool.commonPool-worker-3 [SEVERE] Exception: java.lang.IllegalStateException 我们可以通过同步来修复问题,或者通过原子变量来更好地解决问题。 原子变量类在java.util.concurrent.atomic中可用。
每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题。虽然一般没有什么大问题,但是最好别这样做。 另外这里提到的很多问题其实可以通过Findbugs( http://findbugs.sourceforge.net/ )来帮我们进行检查出来。 字符串连接误用 错误的写法: ? 正确的写法: ? 问题在第三行,append char比String性能要好,另外就是初始化StringBuffer没有指定size,导致中间append时可能重新调整内部数组大小。 另外一个问题不能一次就将一个xml文件用String保存,这样对内存会造成不必要的浪费,正确的做法用InputStream来边读取边处理。为了解决编码的问题, 最好使用XML解析器来处理。
另外一个问题不能一次就将一个xml文件用String保存,这样对内存会造成不必要的浪费,正确的做法用InputStream来边读取边处理。为了解决编码的问题, 最好使用XML解析器来处理。 为了解决这些问题,一般采用缓存和异步/消息队列处理。 Person p; try { p = (Person) q.getSingleResult(); } catch(Exception e) { p = null; } 这是EJB3的一个查询操作 第二个是日志没有出错原因, 很难跟踪定位问题。 Exception e) { throw new MyRuntimeException("Could not do stuff because: "+ e.getMessage, e); } 作者:java
在实际开发中,两者可以结合使用,以便更好地解决问题 函数式编程之所以突然兴起,是因为它具有以下优点: 易于并行处理: 由于函数式编程中的函数没有副作用,即对同样的输入始终产生相同的输出,因此可以很容易地将一个大问题分解成多个小问题 同时,在Java 8中引入了lambda表达式和Stream API等特性,使得函数式编程在Java中得到了更好的支持。 最佳选择取决于具体情况. 3. 并发和多线程的关系 并发和多线程是两个相关但不同的概念。 多线程是指在一个进程中同时执行多个线程,每个线程都有自己的执行流和栈空间。 在实际开发中,我们通常会使用多线程来实现并发编程 4. 函数式编程如何解决线程安全问题? 函数式编程可以通过使用不可变数据和纯函数来解决线程安全问题。 总之,在函数式编程中使用不可变数据和纯函数可以有效地解决线程安全问题,并且使得程序更加容易被并行执行
本章包括 11 个涉及 Java 函数式编程的问题。我们将从一个问题开始,这个问题旨在提供从 0 到函数式接口的完整过程。 然后,我们将继续研究 GoF 中的一套设计模式,我们将用 Java 函数风格来解释这些模式。 在本章结束时,您应该熟悉函数式编程,并准备好继续处理一组问题,这些问题允许我们深入研究这个主题。 问题 使用以下问题来测试您的函数式编程能力。我强烈建议您在使用解决方案和下载示例程序之前,先尝试一下每个问题: “编写函数式接口”:编写一个程序,通过一组有意义的例子定义从 0 到函数式接口的路径。 /apachecn/apachecn-java-zh/raw/master/docs/java-coding-prob/img/3b1ba54b-775c-46c8-8948-7c4970e96d1c.png /raw/master/docs/java-coding-prob/img/66d6e3a6-9a8e-4fe1-8a4e-e0266d3ec7ce.png)] 首先,我们创建一个名为Cake的接口:
该系列博文会告诉你如何从计算机网络的基础知识入手,一步步地学习Java网络基础,从socket到nio、bio、aio和netty等网络编程知识,并且进行实战,网络编程是每一个Java后端工程师必须要学习和理解的知识点 ,进一步来说,你还需要掌握Linux中的网络编程原理,包括IO模型、网络编程框架netty的进阶原理,才能更完整地了解整个Java网络编程的知识体系,形成自己的知识框架。 此种io方式存在的一个很大的问题:Linux中信号队列是有限制的,如果超过这个数字问题就无法读取数据。 Java网络编程模型 上文讲述了UNIX环境的五种IO模型。 基于这五种模型,在Java中,随着NIO和NIO2.0(AIO)的引入,一般具有以下几种网络编程模型: BIO NIO AIO BIO BIO是一个典型的网络编程模型,是通常我们实现一个服务端程序的过程
本章介绍的基本问题将非常有助于了解日期-时间 API 的整体情况,并将像拼图中需要拼凑起来的部分一样解决涉及日期和时间的复杂挑战。 问题 使用以下问题来测试您的日期和时间编程能力。 或者,可以通过of()方法获得 3 分钟的持续时间,如下所示: Duration fromMinutes = Duration.of(3, ChronoUnit.MINUTES); // PT3M Duration 65 日期时间的加减 这个问题的解决方案依赖于专用于处理日期和时间的 Java API。让我们在下一节中看看它们。 使用Date 对于Date对象,解决方案可能依赖于Calendar实例。 从 JDK8 开始 新的 Java 日期时间 API 为解决这个问题提供了新的工具。 但是,假设问题要求您查找 2019 年 2 月 27 日之后的 21 天,也就是 2019 年 3 月 20 日。对于这个问题,没有预定义的策略,因此需要自定义策略。
mybatis 解决 SQL 注入问题 我们使用 mybatis 编写 SQL 语句时,难免会使用模糊查询的方法,mybatis 提供了两种方式#{}和${}。 能有效解决 SQL 注入问题 ${}表示使用拼接字符串,将接受到参数的内容不加任何修饰符拼接在 SQL 中,使用${}拼接 sql,将引起 SQL 注入问题。 替代了,很好地解决了 SQL 语句的问题,防止了 SQL 注入。查询结果将为空。
3) 右大括号前换行。 4) 右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行。 3) 方法调用的点符号与下文一起换行。 4) 方法调用中的多个参数需要换行时,在逗号后进行。 5) 在括号前不要换行,见反例。 .append("xin")...append ("huang"); // 参数很多的方法调用可能超过 120 个字符,不要在逗号前换行 method(args1, args2, args3, method(args1, args2, args3); 【强制】IDE 的 text file encoding 设置为 UTF-8; IDE 中文件的换行符使用 Unix 格式,不要使用 Windows 正例: int one = 1; long two = 2L; float three = 3F; StringBuffer sb = new StringBuffer(); 说明:增加 sb
使用 preparedStatement package aaa; import java.sql.*; import java.beans.Statement; import java.sql.Connection ; import java.sql.DriverManager; import java.sql.SQLException; public class Main{ public static void
不安全的发布示例: package org.zero.concurrency.demo.example.publish; import lombok.extern.slf4j.Slf4j; import java.util.Arrays instance = memory // 设置instance指向刚分配的内存 在代码逻辑上,看似不会出现线程不安全的问题。 但是在JVM里,这几步可能会被乱序执行,即便是乱序执行,在单线程下也不会有什么问题,但是在多线程下就不一样了。 指向刚分配的内存 2.ctorInstance() // 初始化对象 假设按照这个指令顺序执行的话,那么当线程A执行完1和3时,instance对象还未完成初始化,但已经不再指向null。 ---- 实现单例模式的方式有很多种,除了以上所提到的,我们还可以使用静态内部类来实现单例,这样更简单,不需要判空也不需要加 volatile 关键字去防止指令重排的问题。