jdk7和8的一些新特性介绍

jdk7和8的一些新特性介绍

Java代码  

  1. 本文是我学习了解了jdk7和jdk8的一些新特性的一些资料,有兴趣的大家可以浏览下下面的内容。
  2. 官方文档:http://www.oracle.com/technetwork/java/javase/jdk7-relnotes-418459.html
  3. 在jdk7的新特性方面主要有下面几方面的增强:
  4. 1.jdk7语法上
  5. 1.1二进制变量的表示,支持将整数类型用二进制来表示,用0b开头。
  6. // 所有整数 int, short,long,byte都可以用二进制表示
  7. // An 8-bit ‘byte‘ value:
  8. byte aByte = (byte) 0b00100001;
  9. // A 16-bit ‘short‘ value:
  10. short aShort = (short) 0b1010000101000101;
  11. // Some 32-bit ‘int‘ values:
  12. intanInt1 = 0b10100001010001011010000101000101;
  13. intanInt2 = 0b101;
  14. intanInt3 = 0B101; // The B can be upper or lower case.
  15. // A 64-bit ‘long‘ value. Note the "L" suffix:
  16. long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;
  17. // 二进制在数组等的使用
  18. final int[] phases = { 0b00110001, 0b01100010, 0b11000100, 0b10001001,
  19. 0b00010011, 0b00100110, 0b01001100, 0b10011000 };
  20. 1.2  Switch语句支持string类型
  21. public static String getTypeOfDayWithSwitchStatement(String dayOfWeekArg) {
  22. String typeOfDay;
  23. switch (dayOfWeekArg) {
  24. case "Monday":
  25. typeOfDay = "Start of work week";
  26. break;
  27. case "Tuesday":
  28. case "Wednesday":
  29. case "Thursday":
  30. typeOfDay = "Midweek";
  31. break;
  32. case "Friday":
  33. typeOfDay = "End of work week";
  34. break;
  35. case "Saturday":
  36. case "Sunday":
  37. typeOfDay = "Weekend";
  38. break;
  39. default:
  40. throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeekArg);
  41. }
  42. return typeOfDay;
  43. }
  44. 1.3 Try-with-resource语句
  45. 注意:实现java.lang.AutoCloseable接口的资源都可以放到try中,跟final里面的关闭资源类似; 按照声明逆序关闭资源 ;Try块抛出的异常通过Throwable.getSuppressed获取
  46. try (java.util.zip.ZipFile zf = new java.util.zip.ZipFile(zipFileName);
  47. java.io.BufferedWriter writer = java.nio.file.Files
  48. .newBufferedWriter(outputFilePath, charset)) {
  49. // Enumerate each entry
  50. for (java.util.Enumeration entries = zf.entries(); entries
  51. .hasMoreElements();) {
  52. // Get the entry name and write it to the output file
  53. String newLine = System.getProperty("line.separator");
  54. String zipEntryName = ((java.util.zip.ZipEntry) entries
  55. .nextElement()).getName() + newLine;
  56. writer.write(zipEntryName, 0, zipEntryName.length());
  57. }
  58. }
  59. 1.4 Catch多个异常 说明:Catch异常类型为final; 生成Bytecode 会比多个catch小; Rethrow时保持异常类型
  60. public static void main(String[] args) throws Exception {
  61. try {
  62. testthrows();
  63. } catch (IOException | SQLException ex) {
  64. throw ex;
  65. }
  66. }
  67. public static void testthrows() throws IOException, SQLException {
  68. }
  69. 1.5 数字类型的下划线表示 更友好的表示方式,不过要注意下划线添加的一些标准,可以参考下面的示例
  70. long creditCardNumber = 1234_5678_9012_3456L;
  71. long socialSecurityNumber = 999_99_9999L;
  72. float pi = 3.14_15F;
  73. long hexBytes = 0xFF_EC_DE_5E;
  74. long hexWords = 0xCAFE_BABE;
  75. long maxLong = 0x7fff_ffff_ffff_ffffL;
  76. byte nybbles = 0b0010_0101;
  77. long bytes = 0b11010010_01101001_10010100_10010010;
  78. //float pi1 = 3_.1415F;      // Invalid; cannot put underscores adjacent to a decimal point
  79. //float pi2 = 3._1415F;      // Invalid; cannot put underscores adjacent to a decimal point
  80. //long socialSecurityNumber1= 999_99_9999_L;         // Invalid; cannot put underscores prior to an L suffix
  81. //int x1 = _52;              // This is an identifier, not a numeric literal
  82. int x2 = 5_2;              // OK (decimal literal)
  83. //int x3 = 52_;              // Invalid; cannot put underscores at the end of a literal
  84. int x4 = 5_______2;        // OK (decimal literal)
  85. //int x5 = 0_x52;            // Invalid; cannot put underscores in the 0x radix prefix
  86. //int x6 = 0x_52;            // Invalid; cannot put underscores at the beginning of a number
  87. int x7 = 0x5_2;            // OK (hexadecimal literal)
  88. //int x8 = 0x52_;            // Invalid; cannot put underscores at the end of a number
  89. int x9 = 0_52;             // OK (octal literal)
  90. int x10 = 05_2;            // OK (octal literal)
  91. //int x11 = 052_;            // Invalid; cannot put underscores at the end of a number
  92. 1.6 泛型实例的创建可以通过类型推断来简化 可以去掉后面new部分的泛型类型,只用<>就可以了。
  93. //使用泛型前
  94. List strList = new ArrayList();
  95. List<String> strList4 = new ArrayList<String>();
  96. List<Map<String, List<String>>> strList5 =  new ArrayList<Map<String, List<String>>>();
  97. //编译器使用尖括号 (<>) 推断类型
  98. List<String> strList0 = new ArrayList<String>();
  99. List<Map<String, List<String>>> strList1 =  new ArrayList<Map<String, List<String>>>();
  100. List<String> strList2 = new ArrayList<>();
  101. List<Map<String, List<String>>> strList3 = new ArrayList<>();
  102. List<String> list = new ArrayList<>();
  103. list.add("A");
  104. // The following statement should fail since addAll expects
  105. // Collection<? extends String>
  106. //list.addAll(new ArrayList<>());
  107. 1.7在可变参数方法中传递非具体化参数,改进编译警告和错误
  108. Heap pollution 指一个变量被指向另外一个不是相同类型的变量。例如
  109. List l = new ArrayList<Number>();
  110. List<String> ls = l;       // unchecked warning
  111. l.add(0, new Integer(42)); // another unchecked warning
  112. String s = ls.get(0);      // ClassCastException is thrown
  113. Jdk7:
  114. public static <T> void addToList (List<T> listArg, T... elements) {
  115. for (T x : elements) {
  116. listArg.add(x);
  117. }
  118. }
  119. 你会得到一个warning
  120. warning: [varargs] Possible heap pollution from parameterized vararg type
  121. 要消除警告,可以有三种方式
  122. 1.加 annotation @SafeVarargs
  123. 2.加 annotation @SuppressWarnings({"unchecked", "varargs"})
  124. 3.使用编译器参数 –Xlint:varargs;
  125. 1.8 信息更丰富的回溯追踪 就是上面try中try语句和里面的语句同时抛出异常时,异常栈的信息
  126. java.io.IOException
  127. §?      at Suppress.write(Suppress.java:19)
  128. §?      at Suppress.main(Suppress.java:8)
  129. §?      Suppressed:  java.io.IOException
  130. §?          at Suppress.close(Suppress.java:24)
  131. §?          at Suppress.main(Suppress.java:9)
  132. §?      Suppressed:  java.io.IOException
  133. §?          at  Suppress.close(Suppress.java:24)
  134. §?          at  Suppress.main(Suppress.java:9)
  135. 2. NIO2的一些新特性
  136. 1.java.nio.file 和java.nio.file.attribute包 支持更详细属性,比如权限,所有者
  137. 2.  symbolic and hard links支持
  138. 3. Path访问文件系统,Files支持各种文件操作
  139. 4.高效的访问metadata信息
  140. 5.递归查找文件树,文件扩展搜索
  141. 6.文件系统修改通知机制
  142. 7.File类操作API兼容
  143. 8.文件随机访问增强 mapping a region,locl a region,绝对位置读取
  144. 9. AIO Reactor(基于事件)和Proactor
  145. 下面列一些示例:
  146. 2.1IO and New IO 监听文件系统变化通知
  147. 通过FileSystems.getDefault().newWatchService()获取watchService,然后将需要监听的path目录注册到这个watchservice中,对于这个目录的文件修改,新增,删除等实践可以配置,然后就自动能监听到响应的事件。
  148. private WatchService watcher;
  149. public TestWatcherService(Path path) throws IOException {
  150. watcher = FileSystems.getDefault().newWatchService();
  151. path.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);
  152. }
  153. public void handleEvents() throws InterruptedException {
  154. while (true) {
  155. WatchKey key = watcher.take();
  156. for (WatchEvent<?> event : key.pollEvents()) {
  157. WatchEvent.Kind kind = event.kind();
  158. if (kind == OVERFLOW) {// 事件可能lost or discarded
  159. continue;
  160. }
  161. WatchEvent<Path> e = (WatchEvent<Path>) event;
  162. Path fileName = e.context();
  163. System.out.printf("Event %s has happened,which fileName is %s%n",kind.name(), fileName);
  164. }
  165. if (!key.reset()) {
  166. break;
  167. }
  168. 2.2 IO and New IO遍历文件树 ,通过继承SimpleFileVisitor类,实现事件遍历目录树的操作,然后通过Files.walkFileTree(listDir, opts, Integer.MAX_VALUE, walk);这个API来遍历目录树
  169. private void workFilePath() {
  170. Path listDir = Paths.get("/tmp"); // define the starting file
  171. ListTree walk = new ListTree();
  172. …Files.walkFileTree(listDir, walk);…
  173. // 遍历的时候跟踪链接
  174. EnumSet opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
  175. try {
  176. Files.walkFileTree(listDir, opts, Integer.MAX_VALUE, walk);
  177. } catch (IOException e) {
  178. System.err.println(e);
  179. }
  180. class ListTree extends SimpleFileVisitor<Path> {// NIO2 递归遍历文件目录的接口
  181. @Override
  182. public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
  183. System.out.println("Visited directory: " + dir.toString());
  184. return FileVisitResult.CONTINUE;
  185. }
  186. @Override
  187. public FileVisitResult visitFileFailed(Path file, IOException exc) {
  188. System.out.println(exc);
  189. return FileVisitResult.CONTINUE;
  190. }
  191. }
  192. 2.3 AIO异步IO 文件和网络 异步IO在java
  193. NIO2实现了,都是用AsynchronousFileChannel,AsynchronousSocketChanne等实现,关于同步阻塞IO,同步非阻塞IO,异步阻塞IO和异步非阻塞IO在ppt的这页上下面备注有说明,有兴趣的可以深入了解下。Java NIO2中就实现了操作系统的异步非阻塞IO。
  194. // 使用AsynchronousFileChannel.open(path, withOptions(),
  195. // taskExecutor))这个API对异步文件IO的处理
  196. public static void asyFileChannel2() {
  197. final int THREADS = 5;
  198. ExecutorService taskExecutor = Executors.newFixedThreadPool(THREADS);
  199. String encoding = System.getProperty("file.encoding");
  200. List<Future<ByteBuffer>> list = new ArrayList<>();
  201. int sheeps = 0;
  202. Path path = Paths.get("/tmp",
  203. "store.txt");
  204. try (AsynchronousFileChannel asynchronousFileChannel = AsynchronousFileChannel
  205. .open(path, withOptions(), taskExecutor)) {
  206. for (int i = 0; i < 50; i++) {
  207. Callable<ByteBuffer> worker = new Callable<ByteBuffer>() {
  208. @Override
  209. public ByteBuffer call() throws Exception {
  210. ByteBuffer buffer = ByteBuffer
  211. .allocateDirect(ThreadLocalRandom.current()
  212. .nextInt(100, 200));
  213. asynchronousFileChannel.read(buffer, ThreadLocalRandom
  214. ……
  215. 3. JDBC 4.1
  216. 3.1.可以使用try-with-resources自动关闭Connection, ResultSet, 和 Statement资源对象
  217. 3.2. RowSet 1.1:引入RowSetFactory接口和RowSetProvider类,可以创建JDBC driver支持的各种 row sets,这里的rowset实现其实就是将sql语句上的一些操作转为方法的操作,封装了一些功能。
  218. 3.3. JDBC-ODBC驱动会在jdk8中删除
  219. try (Statement stmt = con.createStatement()) {
  220. RowSetFactory aFactory = RowSetProvider.newFactory();
  221. CachedRowSet crs = aFactory.createCachedRowSet();
  222. RowSetFactory rsf = RowSetProvider.newFactory("com.sun.rowset.RowSetFactoryImpl", null);
  223. WebRowSet wrs = rsf.createWebRowSet();
  224. createCachedRowSet
  225. createFilteredRowSet
  226. createJdbcRowSet
  227. createJoinRowSet
  228. createWebRowSet
  229. 4. 并发工具增强
  230. 4.1.fork-join
  231. 最大的增强,充分利用多核特性,将大问题分解成各个子问题,由多个cpu可以同时解决多个子问题,最后合并结果,继承RecursiveTask,实现compute方法,然后调用fork计算,最后用join合并结果。
  232. class Fibonacci extends RecursiveTask<Integer> {
  233. final int n;
  234. Fibonacci(int n) {
  235. this.n = n;
  236. }
  237. private int compute(int small) {
  238. final int[] results = { 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89 };
  239. return results[small];
  240. }
  241. public Integer compute() {
  242. if (n <= 10) {
  243. return compute(n);
  244. }
  245. Fibonacci f1 = new Fibonacci(n - 1);
  246. Fibonacci f2 = new Fibonacci(n - 2);
  247. System.out.println("fork new thread for " + (n - 1));
  248. f1.fork();
  249. System.out.println("fork new thread for " + (n - 2));
  250. f2.fork();
  251. return f1.join() + f2.join();
  252. }
  253. }
  254. 4.2.ThreadLocalRandon 并发下随机数生成类,保证并发下的随机数生成的线程安全,实际上就是使用threadlocal
  255. final int MAX = 100000;
  256. ThreadLocalRandom threadLocalRandom = ThreadLocalRandom.current();
  257. long start = System.nanoTime();
  258. for (int i = 0; i < MAX; i++) {
  259. threadLocalRandom.nextDouble();
  260. }
  261. long end = System.nanoTime() - start;
  262. System.out.println("use time1 : " + end);
  263. long start2 = System.nanoTime();
  264. for (int i = 0; i < MAX; i++) {
  265. Math.random();
  266. }
  267. long end2 = System.nanoTime() - start2;
  268. System.out.println("use time2 : " + end2);
  269. 4.3. phaser 类似cyclebarrier和countdownlatch,不过可以动态添加资源减少资源
  270. void runTasks(List<Runnable> tasks) {
  271. final Phaser phaser = new Phaser(1); // "1" to register self
  272. // create and start threads
  273. for (final Runnable task : tasks) {
  274. phaser.register();
  275. new Thread() {
  276. public void run() {
  277. phaser.arriveAndAwaitAdvance(); // await all creation
  278. task.run();
  279. }
  280. }.start();
  281. }
  282. // allow threads to start and deregister self
  283. phaser.arriveAndDeregister();
  284. }
  285. 5. Networking增强
  286. 新增URLClassLoader close方法,可以及时关闭资源,后续重新加载class文件时不会导致资源被占用或者无法释放问题
  287. URLClassLoader.newInstance(new URL[]{}).close();
  288. 新增Sockets Direct Protocol
  289. 绕过操作系统的数据拷贝,将数据从一台机器的内存数据通过网络直接传输到另外一台机器的内存中
  290. 6. Multithreaded Custom Class Loaders
  291. 解决并发下加载class可能导致的死锁问题,这个是jdk1.6的一些新版本就解决了,jdk7也做了一些优化。有兴趣可以仔细从官方文档详细了解
  292. jdk7前:
  293. Class Hierarchy:
  294. class A extends B
  295. class C extends D
  296. ClassLoader Delegation Hierarchy:
  297. Custom Classloader CL1:
  298. directly loads class A
  299. delegates to custom ClassLoader CL2 for class B
  300. Custom Classloader CL2:
  301. directly loads class C
  302. delegates to custom ClassLoader CL1 for class D
  303. Thread 1:
  304. Use CL1 to load class A (locks CL1)
  305. defineClass A triggers
  306. loadClass B (try to lock CL2)
  307. Thread 2:
  308. Use CL2 to load class C (locks CL2)
  309. defineClass C triggers
  310. loadClass D (try to lock CL1)
  311. Synchronization in the ClassLoader class wa
  312. jdk7
  313. Thread 1:
  314. Use CL1 to load class A (locks CL1+A)
  315. defineClass A triggers
  316. loadClass B (locks CL2+B)
  317. Thread 2:
  318. Use CL2 to load class C (locks CL2+C)
  319. defineClass C triggers
  320. loadClass D (locks CL1+D)
  321. 7. Security 增强
  322. 7.1.提供几种 ECC-based algorithms (ECDSA/ECDH) Elliptic Curve Cryptography (ECC)
  323. 7.2.禁用CertPath Algorithm Disabling
  324. 7.3. JSSE (SSL/TLS)的一些增强
  325. 8. Internationalization 增强 增加了对一些编码的支持和增加了一些显示方面的编码设置等
  326. 1. New Scripts and Characters from Unicode 6.0.0
  327. 2. Extensible Support for ISO 4217 Currency Codes
  328. Currency类添加:
  329. getAvailableCurrencies
  330. getNumericCode
  331. getDisplayName
  332. getDisplayName(Locale)
  333. 3. Category Locale Support
  334. getDefault(Locale.Category)FORMAT  DISPLAY
  335. 4. Locale Class Supports BCP47 and UTR35
  336. UNICODE_LOCALE_EXTENSION
  337. PRIVATE_USE_EXTENSION
  338. Locale.Builder
  339. getExtensionKeys()
  340. getExtension(char)
  341. getUnicodeLocaleType(String
  342. ……
  343. 5. New NumericShaper Methods
  344. NumericShaper.Range
  345. getShaper(NumericShaper.Range)
  346. getContextualShaper(Set<NumericShaper.Range>)……
  347. 9.jvm方面的一些特性增强,下面这些特性有些在jdk6中已经存在,这里做了一些优化和增强。
  348. 1.Jvm支持非java的语言 invokedynamic 指令
  349. 2. Garbage-First Collector 适合server端,多处理器下大内存,将heap分成大小相等的多个区域,mark阶段检测每个区域的存活对象,compress阶段将存活对象最小的先做回收,这样会腾出很多空闲区域,这样并发回收其他区域就能减少停止时间,提高吞吐量。
  350. 3. HotSpot性能增强
  351. Tiered Compilation  -XX:+UseTieredCompilation 多层编译,对于经常调用的代码会直接编译程本地代码,提高效率
  352. Compressed Oops  压缩对象指针,减少空间使用
  353. Zero-Based Compressed Ordinary Object Pointers (oops) 进一步优化零基压缩对象指针,进一步压缩空间
  354. 4. Escape Analysis  逃逸分析,对于只是在一个方法使用的一些变量,可以直接将对象分配到栈上,方法执行完自动释放内存,而不用通过栈的对象引用引用堆中的对象,那么对于对象的回收可能不是那么及时。
  355. 5. NUMA Collector Enhancements
  356. NUMA(Non Uniform Memory Access),NUMA在多种计算机系统中都得到实现,简而言之,就是将内存分段访问,类似于硬盘的RAID,Oracle中的分簇
  357. 10. Java 2D Enhancements
  358. 1. XRender-Based Rendering Pipeline -Dsun.java2d.xrender=True
  359. 2. Support for OpenType/CFF Fonts GraphicsEnvironment.getAvailableFontFamilyNames
  360. 3. TextLayout Support for Tibetan Script
  361. 4. Support for Linux Fonts
  362. 11. Swing Enhancements
  363. 1.  JLayer
  364. 2.  Nimbus Look & Feel
  365. 3.  Heavyweight and Lightweight Components
  366. 4.  Shaped and Translucent Windows
  367. 5.  Hue-Saturation-Luminance (HSL) Color Selection in JColorChooser Class
  368. 12. Jdk8 lambda表达式 最大的新增的特性,不过在很多动态语言中都已经原生支持。
  369. 原来这么写:
  370. btn.setOnAction(new EventHandler<ActionEvent>() {
  371. @Override
  372. public void handle(ActionEvent event) {
  373. System.out.println("Hello World!");
  374. }
  375. });
  376. jdk8直接可以这么写:
  377. btn.setOnAction(
  378. event -> System.out.println("Hello World!")
  379. );
  380. 更多示例:
  381. public class Utils {
  382. public static int compareByLength(String in, String out){
  383. return in.length() - out.length();
  384. }
  385. }
  386. public class MyClass {
  387. public void doSomething() {
  388. String[] args = new String[] {"microsoft","apple","linux","oracle"}
  389. Arrays.sort(args, Utils::compareByLength);
  390. }
  391. }
  392. 13.jdk8的一些其他特性,当然jdk8的增强功能还有很多,大家可以参考http://openjdk.java.net/projects/jdk8/
  393. 用Metaspace代替PermGen
  394. 动态扩展,可以设置最大值,限制于本地内存的大小
  395. Parallel array sorting 新APIArrays#parallelSort.
  396. New Date & Time API
  397. Clock clock = Clock.systemUTC(); //return the current time based on your system clock and set to UTC.
  398. Clock clock = Clock.systemDefaultZone(); //return time based on system clock zone
  399. long time = clock.millis(); //time in milliseconds from January 1st, 1970
  400. 更多内容可以看看附件ppt,示例代码可以参考:https://github.com/zhwj184/jdk7-8demo
时间: 2024-10-07 05:30:11

jdk7和8的一些新特性介绍的相关文章

ArcGIS 10.2新特性介绍:影像

1.新增栅格类型 新增支持三种新的栅格类型:DMCii.Pleiades 和 SPOT6. 同时,新增提供中国卫星 Raster Type 扩展下载,支持中国卫星影像数据在ArcGIS 中的管理和使用.扩展支持的卫星产品包括: HJ 1A/1B CCD raster type ZY02C HRC raster type ZY02C PMS raster type ZY3 – CRESDA ZY3 – SASMAC 对于支持的国产卫星,正射.融合.镶嵌和匀色等常用处理,通过 ArcGIS 的On-

Hadoop 2.4.0新特性介绍

在2014年4月7日,Apache发布了Hadoop 2.4.0 .相比于hadoop 2.3.0,这个版本有了一定的改进,突出的变化可以总结为下列几点(官方文档说明): 1 支持HDFS访问控制列表(ACL,Access Control Lists) 这个特性解决了在一定情况下,文件权限访问的权限问题.其机制是基于Linux文件访问权限的特征,如果你熟悉Linux的文件访问机制,你就不用再去理解HDFS文件访问的特性了. 有了ACL特性后,对HDFS文件系统就具有了良性的扩展特性.HDFS-4

ArcGIS 10.3 for Desktop新特性介绍

ArcGIS 10.3是一个完整公布的ArcGIS平台,它包含新的产品(ArcGIS Pro),针对10.2版本号产品进行了功能增强和稳定性的改进. ArcGIS 10.3 for Server新特性介绍 http://blog.csdn.net/linghe301/article/details/31358733 ------------------------------------------------------------------ 版权全部,文章同意转载,但必须以链接方式注明源地

php7函数,声明,返回值等新特性介绍

使用 ... 运算符定义变长参数函数 (PHP 5 >= 5.6.0, PHP 7) 现在可以不依赖 func_get_args(), 使用 ... 运算符 来实现 变长参数函数. function f($req, $opt = null, ...$params) { // $params 是一个包含了剩余参数的数组 printf('$req: %d; $opt: %d; number of params: %d'."\n", $req, $opt, count($params)

Java 11 新特性介绍

Java 11 已于 2018 年 9 月 25 日正式发布,之前在Java 10 新特性介绍中介绍过,为了加快的版本迭代.跟进社区反馈,Java 的版本发布周期调整为每六个月一次——即每半年发布一个大版本,每个季度发布一个中间特性版本,并且做出不会跳票的承诺.通过这样的方式,Java 开发团队能够将一些重要特性尽早的合并到 Java Release 版本中,以便快速得到开发者的反馈,避免出现类似 Java 9 发布时的两次延期的情况. 按照官方介绍,新的版本发布周期将会严格按照时间节点,于每年

MyBatis 3.5.2 新特性介绍

1.MyBatis 最新版本 3.5.2 发布 MyBatis最新版本是:3.5.2,发布时间是:2019年7月15日 2.MyBatis 3.5.2 新特征介绍 我们知道,MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.在定制化SQL方面,MyBatis做出了很多的改进和优化.下面我们看看新版本的MyBatis有哪些改进呢? (1)支持LIMIT 在select/update/delete的应用.(2)支持OFFSET在select中的使用.(3)支持FETCH

Android O (8.0) 新特性介绍

Android O 功能和 API (文章内容均来Google开发者官网,有需要可自行FQ查看更多资料) Android O 为用户和开发者引入多种新功能.本文重点介绍面向开发者的新功能.请务必查阅 android O 行为变更以了解平台变更可能影响您的应用的领域. 通知 在 Android O 中,我们已重新设计通知,以便为管理通知行为和设置提供更轻松和更统一的方式.这些变更包括:  通知渠道:Android O 引入了通知渠道,其允许您为要显示的每种通知类型创建用户可自定义的渠道.用户界面将

转:Android新特性介绍,ConstraintLayout完全解析

转:http://blog.csdn.net/guolin_blog/article/details/53122387 本篇文章的主题是ConstraintLayout.其实ConstraintLayout是Android Studio 2.2中主要的新增功能之一,也是Google在去年的I/O大会上重点宣传的一个功能.我们都知道,在传统的android开发当中,界面基本都是靠编写XML代码完成的,虽然Android Studio也支持可视化的方式来编写界面,但是操作起来并不方便,我也一直都不推

java8新特性介绍(三)

5. 新的Java工具 Java 8也带来了一些新的命令行工具.在这节里我们将会介绍它们中最有趣的部分. 5.1 Nashorn引擎: jjs jjs是个基于Nashorn引擎的命令行工具.它接受一些JavaScript源代码为参数,并且执行这些源代码.例如,我们创建一个具有如下内容的func.js文件: function f() {       return 1; }; print( f() + 1 ); 我们可以把这个文件作为参数传递给jjs使得这个文件可以在命令行中执行:jjs func.