社区之星王海庆:速度激情,学习极客     Markdown轻松写博文     微信公众平台开发     天天爱答题 一大波C币袭来     读文章送好书    

jdk7和8的一些新特性介绍

更多ppt内容请查看:http://www.javaarch.net/jiagoushi/927.htm

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

jdk7和8的一些新特性介绍相关推荐

  1. SAP PI 7.3新特性介绍

    PI 7.3新特性介绍 自从SAP TechEd  2010 年在Berlin对PI7.3的新特性作了介绍之后,类似于single Java Stack, central monitoring, ID ...

  2. Xcode9新特性介绍-中文篇

    背景: Xcode 9 新特性介绍: 1.官方原文介绍链接 2.Xcode9 be ta 2 官方下载链接 本文为官方介绍翻译而来,布局排版等都是按照官方布局来的. 与原文相比,排版上基本还是熟悉的配 ...

  3. Angular8 - 稳定版修改概述(Angular 8的新特性介绍)

    Angular 8的新特性介绍 在之前Angular团队发布了8.0.0稳定版.其实早在NgConf 2019大会上,演讲者就已经提及了从工具到差分加载的许多内容以及更多令人敬畏的功能.下面是我对8. ...

  4. 技术前沿资讯-Apache Flink 1.14 新特性介绍

    一.简介 1.14 新版本原本规划有 35 个比较重要的新特性以及优化工作,目前已经有 26 个工作完成:5 个任务不确定是否能准时完成:另外 4 个特性由于时间或者本身设计上的原因,会放到后续版本完 ...

  5. hadoop3.0新特性介绍

    hadoop3.0新特性介绍 1. 基于jdk1.8(最低版本要求) 2. mr采用基于内存的计算,提升性能(快spark 10倍) 3. hdfs 通过最近black块计算,加快数据获取速度(块大小 ...

  6. chrome 63 android分类,Chrome 63 Beta新特性介绍

    原标题:Chrome 63 Beta新特性介绍 除非另外注明,否则,下面介绍的更改均适用于最新 Chrome Beta 渠道版(Android.Chrome 操作系统.Linux.Mac 和 Wind ...

  7. 蚂蚁金服 SOFAArk 0.6.0 新特性介绍 | 模块化开发容器...

    SOFAStack Scalable Open Financial Architecture Stack 是蚂蚁金服自主研发的金融级分布式架构,包含了构建金融级云原生架构所需的各个组件,是在金融场景里 ...

  8. JDK 9-17 新特性介绍

    Java新特性介绍 Java 8是Oracle 公司于 2014 年 3 月 18 日发布的,距离今天已经过了近十年的时间了,但是由于Java 8的稳定和生态完善(目前仍是LTS长期维护版本),依然有 ...

  9. 红旗系统linux2.6.32屏保咋设置,红旗Linux桌面操作系统 V11社区预览版发布,附新特性介绍...

    红旗Linux桌面操作系统 V11(英文名称为RedFlag Linux Desktop 11)社区预览版发布了,根据计划,该版本将开放给用户下载试用.以下将介绍它的新特性:良好的硬件兼容.丰富的外设 ...

最新文章

  1. 理解事件捕获。在限制范围内拖拽div+吸附+事件捕获
  2. Java实体类对象修改日志记录
  3. 【ABAP增强】基于函数的出口CMOD
  4. 前端基础21:正则基础
  5. 延边大学c语言题库,延边大学-SPOC官方网站
  6. 一文聊“图”,从图数据库到知识图谱
  7. 软件测试工程师-HTML
  8. python打开界面-python学习笔记(图形用户界面)
  9. python编程入门指南-Python 入门指南
  10. 产品经理如何搞定程序员
  11. 乌班图/Ubuntu 21.10 安装nvidia 显卡驱动
  12. 华硕笔记本linux触摸板驱动,华硕笔记本触摸板驱动安装教程及打开方法
  13. php中json对象转字符串,JSON对象转字符串的一些方法
  14. SQL——连接字符串常用函数
  15. 软件开发环境SDK安装及注意事项
  16. 培训班H5宣传单怎么做?快进来拿方案~
  17. 不要妄图一夜实现「智能」,这里有AI工业落地几乎必遇的「深坑」
  18. 飞飞cms模板,飞飞cms自适应模板,飞飞cms影视模板
  19. [信息论]信道容量迭代算法程序设计(基于C++Matlab实现)
  20. 【文献管理】Zotero插件QuickLook || 让Zotero具备文献预览功能

热门文章

  1. python新式类和旧式类的区别_浅谈python新式类和旧式类区别
  2. 鸿蒙生态的2021:像犀牛在丛林飞
  3. CODEVS P2833 奇怪的梦境
  4. 微信公众号支付开发 --Java
  5. 金智塔CTO陈超超:构建产学研用价值闭环,持续探索隐私计算技术前沿 | 数据猿专访...
  6. HTML粒子旋涡特效代码
  7. Styles.Rende @Scripts.Render 错误
  8. 石油管道巡线案例:SABER无人机高原2500米轻松作业
  9. #10049. 「一本通 2.3 例 1」Phone List(trie树应用)
  10. Flyback Converter电源基本电路分析