文章 39
评论 43
浏览 115081
大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field )

大白话 | Java初学指♂男:“说说初学的误区与死结”( 壹 | 反射与Field )

思考 通常,我们这么给变量赋值: String name = "XiaoMing"; name = "DaMing"; 那么假如,我们不允许直接给name这个变量赋值,但我们提供与该变量名相同的字符串: String name = "XiaoMing"; // variable 中指定了要修改的变量 String variable = "name"; // 将 variable 中指定的变量修改为 value 的值 String value = "DaMing"; // 不允许使用以下方法直接给 name 赋值: // name = value; // name = "DaMing"; // 要求最终, name 的值为 DaMing 题目要求: 根据variable变量中的字符串name,找到和字符串名字相同的变量 将variable字符串中指定变量的值修改为DaMing 必须依靠字符串来修改该变量的值,而不是直接赋值 最终,变量name的值应该是DaMing,而不应该去修改变量variable的值 实例 想好了吗?让我们来看看下方的题解: public class Main....

大白话之Java Stream流:将类数组流化,便捷批量修改,通俗讲解!

大白话之Java Stream流:将类数组流化,便捷批量修改,通俗讲解!

前言 Stream大意概括 将一个列表(List)中的所有类铺平转换成一条流水线,按要求将流水线上的所有类一个一个地处理。像极了SQL语句。 本篇文章将用通俗易懂的语言为你讲解流操作。如果你有一部分卡住看不懂,跳过去就好,再回去看就会了。 -📚-需要先了解的知识-📚- 语言内容链接 JavaList、ArrayList的使用、基本原理及区别null JavaLambda表达式的使用及基本原理null -⭐-评分-⭐- 知识等级实用性罕见性 进阶实用较少见 原理图 其实整个过程跟流水线差不多。让我们看看由灵魂画手A先生绘制的原理图: 没看懂没关系,做完第一个实践再回来看看。 实践 跳过那些复杂的理论,打开你的IDE,新建一个类名为Arr,把下面的代码复制进去,反复分析代码,最后带着你的疑问再继续: import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class ....

大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串

大白话之Java级联调用:一个类,一条语句,同时调用好几个方法,串成一串

前言 之前偶然学习了一下Dart编程语言(不是重点),在学习官方手册时发现一个新的概念:级联调用。这是啥东西? 于是我百度了以后,发现在Java中也有类似的级联调用,那它们的区别又在哪儿呢? -📚-需要先了解的知识-📚- 语言内容链接 Java类、方法、变量null -⭐-评分-⭐- 知识等级实用性罕见性 基础实用少见 上手 级联调用很简单,只要稍微分析下下面的源码,就懂了。 !级联 首先我们不用级联来实现: public class 级联 { public static void main(String[] args) { //实例化Guys Guys guys = new Guys(); //执行方法 guys.boy(); guys.girl(); guys.gentleman(); guys.lady(); } } class Guys { public void girl() { System.out.println("Hey, girl!"); } public void boy() { System.out.println("Oh, boy!"....

大白话之Java多线程join方法:开局一张图,试学一分钟,你就费和我一样,理解介个方法

大白话之Java多线程join方法:开局一张图,试学一分钟,你就费和我一样,理解介个方法

前言 有次偶尔接触到了Thread.join()方法,便到网上去查阅相关资料,但也是看得我一头雾水(天下文章一般抄)。在我很久的理解之后,便想将我理解的join()方法以一张图的方式解释出来。 要学习本篇文章,你需要理解以下知识: 多线程 & Thread (点我学习) 仔细看 开局扔张图: 我绘制的这张图以时间线的形式解释了主线程和各个被实例化的John线程的运行过程。 别着急,多看两遍! 我们可以看到,在主线程调用了join()方法后,指定的线程会被抓回来在后边老老实实地排队。 猜一下 问:请回答未执行join()方法和执行了join()方法的运行结果有什么不同(可能有几种结果、运行的时间、输出的顺序)? 💡—!> 答: 类型可能结果数量运行速度输出顺序时间复杂度(最好) 不使用join()6种快(多线程)乱序O(1) 使用join()1种慢(单线程)顺序O(n) Q&A 看完后,你可能还会有些疑问: Q:为什么不使用join()的可能结果数量是6种?输出顺序为什么是乱序? A:由于多线程的原因,虽然start()顺序执行了线程1/2/3,....

大白话之AutoClosable接口 | try-with-resources:JDK1.7的新特性,提高重复回收效率

大白话之AutoClosable接口 | try-with-resources:JDK1.7的新特性,提高重复回收效率

前言 无论是使用文件IO流,还是网络Socket流,都免不了调用close()将流关闭。如果需要操作的流过多,就会导致混乱。 一旦忘记将关闭方法放到finally中,很有可能出现流未被关闭,占用大量内存空间的问题。 流程简化 对比 try-catch-finally AC ac = null; AC2 ac2 = null; try { ac = new AC(); ac2 = new AC2(); } catch (Exception e) { } finally { ac.close(); ac2.close(); } try-with-resources try (AC ac = new AC(); AC2 ac2 = new AC2()) { } catch (Exception e) { } 可以很明显的看到,try-with-resources会自动调用类中的close()方法,简化了流程,提高了代码的整洁度。 AutoCloseable AutoCloseable是Java的内置接口,继承这个接口并且按要求新建close()方法,该类就能被try-with-res....

大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决?

大白话之必会Java Atomic | 线程一点也不安全(二):Atomic的ABA问题会导致什么情况?如何解决?

前言 第一章还没看过?点我可以穿越 阅读本篇文章,你需要了解以下知识: Atomic是什么?(点此跳转) 单向链表的原理 从上一章的内容,我们可以了解到,Atomic可以基本解决线程同步安全的问题。而本章我们将讨论Atomic的缺点与它的原子性。 ABA问题 什么是ABA问题?首先我们都知道,Atomic的CAS模型,会先读取变量的值,作为预期旧值,然后再基于旧值产生操作生成新值,再确认变量是否为预期旧值,如果是,修改为新值。 我们以单向链表来演示ABA会导致的问题: 解决ABA问题 现在我们知道了,由于Atomic仅判断了旧值,但并没有意识到整个链表已经被修改过一次了。所以我们要引入一个新的概念: 版本 Atomic在修改值时,保存的不仅再是旧值,还有一个版本号。在每次更改后,版本号都会变化,这样就不会再产生ABA问题了。我们看图: AtomicStampedReference Atomic的开发者自然也意识到了这个问题,并后续开发了AtomicStampedReference来修复这个问题。我们用一段简单的代码来实现: import java.util.concurrent....

大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言)

大白话之必会Java Atomic | 线程一点也不安全(一):比自增和synchronized更快速、靠谱的原子操作(调用C语言)

前言 阅读本篇文章,你需要对下方知识有所了解: synchronized关键词的作用 线程池的作用(这里) 不靠谱和慢动作 在多线程环境下: 操作靠谱程度执行速度 i++ 自增运算没戏不赖 synchronized贼棒太废 不靠谱的自增 操作类 假如我们现在有一个变量:num 我们这个变量设置两个方法: 方法返回值作用 plus()void将num自增(+1) getNum()Integer返回num的值 代码如下: class Num { Integer num = 0; public void plus() { num++; } public Integer getNum() { return num; } } 主类 然后在另一个类主方法中新建一个缓存线程池: ExecutorService executorService = Executors.newCachedThreadPool(); 当我们执行executorService.execute(new Runnable() {})时,缓存线程池会将指定的对象以非阻塞的方式提交到队列中。 随后再写....

刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解!

刨根问底 | 大白话:在使用注解后,框架是怎么知道你哪个方法使用了注解的?用@RequestMapping注解举例详解!

前言 阅读本篇文章,你需要理解以下的知识: 重要:反射 (参考) Java enum 接口的使用 了解注解是什么、该什么时候使用 最好接触过Spring(因为用@RequestMapping举例) 先说说注解 如果你熟悉Spring框架,你一定使用过这个注解: @RequestMapping(value = "/admin/index.html", method = RequestMethod.GET) 这条注释的意思是: 用户访问"/admin/index.html"页面,则执行下方方法 限制用户只能使用"GET"方式访问 那么Spring在启动后是如何知道你用了这个注解,并且调用这个注解指定的方法的呢? 让我们先大体猜测一下: 我们可以配置Spring扫描的@Controller所在目录 Spring扫描目录,并逐个扫描@Controller类中的注解 解析所有扫描到的注解,并通过反射,执行指定注释下的方法 实例 打开你的IDE,新建一个类Main.java,并复制下方语句: import java.lang.annotation.ElementType; impor....

大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用?

大白话之fail-fast | fail-safe:为什么会有这个机制?它有什么作用?

前言 阅读本篇文章,你需要了解下列知识: 多线程的实现(看过来) Iterator的使用 ArrayList的使用和如何实现Iterator 为什么会有这个机制? 举个栗子 有一杯水、两个人(黄渤和红雷) 黄渤拿起了水杯,开始喝水 红雷到达案发现场,想抢走水杯喝水 黄渤很生气,并锤了红雷一顿 映射关系 将上面的栗子翻译一下: 有一个ArrayList、两个线程(Thread1和Thread2) Thread1请求并开始使用Iterator遍历ArrayList Thread2随后紧跟请求对ArrayList进行修改 由于Thread1正在遍历ArrayList,ArrayList对Thread2扔出ConcurrentModificationException 继承关系 Tip 如果下面的知识让你难以搞懂,可以直接跳过,在深入学习接口和继承后,再回来看一遍。 看起来有些困难?没关系。 ArrayList继承了Iterable接口,实现了基于Iterator的遍历功能。 ArrayList实现Iterator的部分源码如下: /** * An optimized ver....

大白话 | 课堂实践:使用Iterator对数组进行遍历

大白话 | 课堂实践:使用Iterator对数组进行遍历

前言 阅读本篇文章,你需要对以下知识有所了解: 接口(这儿有) Iterator的使用 Java 匿名内部类 构思 我们都知道,Iterator是一种迭代器,它的接口中有四种方法(JDK 1.8): public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action);while (hasNext()) action.accept(next()); } } 方法返回值作用 hasNext()boolean查找是否还有下一个元素,如果有,返回true,反则返回false next()Object返回下一个元素 remove()void删除当前指向的元素 forEachRe....

大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我!

大白话之Java面向接口编程:最“正经”的中文实例讲解,看不懂来打我!

前言 作为一个正经博主,我会用最纯洁易懂的方式让你理解面向接口编程。 阅读本篇文章,你需要对以下知识有所了解: 面向对象编程基础知识 接口(这儿有) 实例 废话少说。打开你的IDE(没有?去下!),新建一个类,命名为Main,复制下方代码: interface 动作 { void 结婚(); void 生孩子(); } class 如花 implements 动作 { @Override public void 结婚() { System.out.println("为什么?"); } @Override public void 生孩子() { System.out.println("凭什么?"); } } class 美女 implements 动作 { @Override public void 结婚() { System.out.println("就现在!"); } @Override public void 生孩子() { System.out.println("就今晚!"); } } class 帅气的我 { private 动作 小姐姐; public 动作 我女朋友是谁....

大白话之Java反射-初学最迷的概念:能干啥?咋用?

大白话之Java反射-初学最迷的概念:能干啥?咋用?

前言 初学时,反射、网络编程、IO是我最不能理解的三大模块。 当时查资料,给我的感觉是:写文章的都觉得我已经会了。 如今,我用实例尽可能简单地讲述反射这个东西。 能干啥? 人类文明分为三个阶段: 女娲创造人类 人类文明建立,地球产生秩序 人类灭亡 实例化 平常我们实例化一个类,都是用: Main main = new Main(); 那如果要读取这个类中的公共变量,我们需要: public class Main { public String value = "HelloWorld!"; } public class Test { public static void main(String[] args) { Main main = new Main(); System.out.println(main.value); } } 那么我们如果将这个变量设置为私有呢? public class Main { private String value = "HelloWorld!"; } 很明显,我们无法获得该变量的值,因为变量的作用域止步于自己的类中。 那么如果我们使用反射,我....

大白话之Docker(叁):制作一个运行Tomcat服务端的Docker镜像

大白话之Docker(叁):制作一个运行Tomcat服务端的Docker镜像

前言 如没看过上一章,请点我跳转 上一章我们使用Tomcat镜像搭建了一个WEB服务端。 本章,我们将从零开始搭建一个Tomcat服务端。大体需要以下步骤: 在容器中安装一个系统(我使用Ubuntu) 在容器中安装JDK并配置环境变量以运行Tomcat 在容器中拷贝Tomcat 既然目标已经明确,那么我们就开始吧。 初始化项目 下载文件 在项目开始之前,我们需要下载所需的文件: JDK 1.8 Tomcat 9 解压文件 将JDK和Tomcat的压缩包解压,并新建一个文件夹用于存放该镜像所需的文件,把解压后的文件夹拷贝到该文件夹中。 adler@localhost ~/dockerTomcat: tar -zxvf jdk-8u201-linux-x64.tar.gz adler@localhost ~/dockerTomcat: tar -zxvf apache-tomcat-9.0.13.tar.gz adler@localhost ~/dockerTomcat: ls apache-tomcat-9.0.13 jdk1.8.0_201 Dockerfile Dockerfi....

大白话之从零讲解DVWA(贰)-SQL注入(SQL Injection) Medium/High Level

大白话之从零讲解DVWA(贰)-SQL注入(SQL Injection) Medium/High Level

前言 本章我们将进行Medium和High等级的DVWA SQL Injection手工注入。 如没看过第一章,请点我跳转 阅读本篇文章前,你需要了解下面的知识: 转义字符在PHP中的作用 MySQL:LIMIT语句的作用与用法 Medium Level SQL注入 和初级一样,我们输入如下语句: 1' order by 2 # 但得到了如下结果: `You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\' order by 2 #' at line 1` 返回页面,点击右下角的View Source阅读源码,我们会发现: $id = mysql_real_escape_string($id); 出现了一个初级没有的方法: mysql_real_escape_string将字符串中的: \x00 \n \r \ ' " \x1a 进行了转义的处理,而我们使用....

死钻技术 | 绝不抄袭