
JAVA基础
JDIT
回头看之前的知识储备真是过时,短短几年,自从ODC不能使用优快云,小米账号无法登录。
这些年,我竟然使用了python,go,shell,lua,powershell,java,也玩转了cgo,掌握了图库,关系库,NOSQL库,kafka,redis,Gauss,clickhouse,同时也参与了vue开发。解决过欧拉,centos,ubuntu各种不兼容问题。最后看着一个人被裁员,因为学历或者年龄。原来我们被骗了,编程语言L4的都知识小工具,只有硬件技术,操作系统编程,C语言才是根基。我们游离于API层,无限内卷,今天spark,明天flink,今天go-ansible。
展开
-
JAVA基础知识目录
JAVA程序概述JAVA程序设计环境安装JAVA开发工具箱Java 底层机制(JVM/堆/栈/方法区/GC/类加载)Java程序设计结构Hello World数据类型相关知识数据类型变量与常量运算符数学函数数据类型转换枚举类型字符串相关字符串StringBufferStringBuilder控制流程块及条件语句循环多重选择switch大数值BigInte...原创 2019-10-27 00:01:30 · 485 阅读 · 0 评论 -
随机访问文件
到目前为止,所使用的所有流都是只读的或者只写的。这些流被称为顺序流。使用顺序流打开的文件称为顺序访问文件。顺序访问文件的内容不能更新,如果要更新就要使用新对象RandomAccessFile类,由于目前并没有对进行进行过更新操作,所以这个类后续补充。...原创 2020-01-19 16:20:20 · 613 阅读 · 0 评论 -
对象IO-ObjectInputStream和ObjectOutputStream
对象序列化到磁盘这个问题听说过,但是从来没有用过,通过它核心只是为了认知序列化。ObjectInputStream和ObjectOutputStream可以用以读写序列化的对象。DataInputStream和DataOutputStream可以实现基础数据类型和字符串数据的读写,而ObjectInputStream和ObjectOutputStream在此基础上还可以对对象进行读写操作。p...原创 2020-01-19 16:15:54 · 238 阅读 · 0 评论 -
加速复制文件
复制文件可能有多种方案,当然大多项目有专门的全球文件服务器,复制基本走服务,但是对于普通应用来说,文件可能用nas存储,直接通过调用shell复制是最直接和高效的。这一章,我们只是练习下二进制IO,当然通过java对象来做文件复制。目标:java Copy source targetpackage com.wht.demo.io;import java.io.*;/** * 通过...原创 2020-01-19 15:31:52 · 233 阅读 · 0 评论 -
二进制IO类
抽象类InputStream是读取二进制数据的根类,抽象类OutputStream是写入二进制数据的根类。原创 2020-01-08 23:44:16 · 433 阅读 · 0 评论 -
文本IO与二进制IO
引言为什么详细描述着一段,因为一直以来并未思考过这个问题。Java提供了许多类用于实现文本IO和二进制IO文件可以分为文本和二进制的。可以使用文本编辑器,比如windows下的记事本或linux下的vi编辑器,进行处理的文本称为文本文件。所有其他的文件称为二进制文件。不能使用文本编辑器来读取的二进制文件–他们被设计为使用程序来读取。举例:Java源程序存储在文本文件中,可以使用文...原创 2020-01-08 22:40:02 · 889 阅读 · 0 评论 -
回顾目标
在java中如何使用IO区分文本IO与二进制IO的不同使用FileInputStream和FileOutpustStream来读写字节。使用基础类FilterInputStream和FilterOutputStream来过滤数据。使用DataInputStream或DataOutputStream来读写基本类型值和字符串。使用BufferedInputStream和BufferedOu...原创 2020-01-08 22:19:32 · 321 阅读 · 0 评论 -
前言
程序开几年后发现,每天写着业务逻辑,日复一日,回头看看才发现很多基础的东西反而陌生了。为什么我们每天不假思索的写着无限的接口,消息队列,用着各种中间件,玩着DB,做着自动化或云计算。但是,我们真正懂得有多少,非常少。我们一切都是知道,而不是会,知其然不知其所以然。回头看看JAVA基础还有有必要,然后去看看数据结构,http协议,计算机原理,各种周边语言,lua,c++,shell,go,p...原创 2020-01-08 21:16:18 · 150 阅读 · 0 评论 -
自定义线程
这个非常重要,以上学习都是为了认知线程,而自定义线程才是真正项目可用的方式,在N多烈士总结的经验。IDEA如果使用了阿里的开发规范插件,也可以看到,自定义线程是阿里开发规范要求的。先来个demopackage com.wht.demo.thread3;import java.util.concurrent.ArrayBlockingQueue;import java.util.con...原创 2020-01-07 12:07:14 · 898 阅读 · 0 评论 -
同步
同步至少目前来说我们几乎没用过,原因很简单,我们很多线程都是用来做并发的,每个线程相当于与一个独立作业。不会共享数据,主要针对的是MQ消息的消费。如果涉及到MYSQL等sql db会出现锁的问题,但是不会出现共享变量的踩踏问题。但是这并不能说明同步的不重要,如果同步,很多人又会说,既然同步,为啥还要开线程,并发作业后,又加锁一个一个来排队不是吃饱撑的吗?race condition --竞争条...原创 2020-01-07 00:19:06 · 320 阅读 · 0 评论 -
线程属性
线程优先级在JAVA程序设计语言中,每一个线程都有一个优先级。默认情况下,一个线程继承它的父线程优先级。可以用setPriority方法提高或者降低任何一个线程的优先级。可以将优先级设置为在MIN_PRIORITY-在Thread类中定义为1与MAX_PRIORITY-定义为10之间的任何值,NORM_PRIORITY被定义为5.每个线程调度器有机会选择新线程时,它首先选择具有较高优先级的线...原创 2020-01-06 23:00:07 · 160 阅读 · 0 评论 -
线程状态
New 新生Runable 可运行Blocked 被阻塞Waiting 等待Timed waiting 计时等待Terminated 被终止新生线程new Thread® 还没有run的时候,出于新生状态,有一些初始化工作要做。可运行线程一旦调用start方法,线程处于runable状态。一个可运行的线程可能正在运行,也可能没有运行,这取决于操作系统给线程提供运行的时间。...原创 2020-01-05 23:12:30 · 152 阅读 · 0 评论 -
中断线程
当线程的run方法执行方法体重的最后一条语句后,并经由执行return 语句返回时,或者出现了在方法中没有捕获的异常时,线程将终止。stop方法已经废弃,不在记录。当一个线程调用interrupt方法时,线程的中断状态将被置位。这是每一个线程都具有的boolean标志。每个线程都应该不时地检查这个标志,以判断线程是否被中断。但是如果线程阻塞,就无法检测中断状态。void interrupt(...原创 2020-01-05 22:58:49 · 141 阅读 · 0 评论 -
线程的概念
实例:弹跳小球,结果是close按钮无效,只要结束才能close掉。小球package com.wht.demo.threadone;import java.awt.geom.Ellipse2D;import java.awt.geom.Rectangle2D;/** * @author JDIT */public class Ball { private stati...原创 2020-01-05 22:47:56 · 153 阅读 · 0 评论 -
常见正则使用
实例:自动化脚本关键字扫描 public static void main(String[] args) { String script = "echo \"hello world\"\n" + "rm -rf ./*\n" + "reboot"; String keyWord = "rm -rf"; String scriptStr =...原创 2020-01-05 21:12:31 · 147 阅读 · 0 评论 -
多线程概述
前面简单浏览过了一遍java基础,反射,数据结构是核心,现在又来到了另外一个核心,多线程。多线程很重要,至少目前是这样。多线程也很扯淡,内存溢出,锁问题也常常因为多线程的使用而爆发。前几年一直是做OA系统,基本没用到什么线程,有些数据处理也是用的EBS的reques做的。在JAVA中写线程的机会很少,只有部分场景,例如邮件和代办的异步分发。当做自动化平台的时候,大量使用kafka和并发任...原创 2019-12-09 22:42:05 · 135 阅读 · 0 评论 -
遗留的集合
Hashtable类型遗留集合,和HashMap用法一样注意table中t小写枚举遗留的集合使用Enumeration接口对元素进行遍历。属性映射表property map是一个类型非常特殊的映射表结构。InputStream in = ClassLoader.getSystemResourceAsStream(name);//name为配置文件路径Properties p = n...原创 2019-12-09 21:51:59 · 155 阅读 · 0 评论 -
比较两个无序String[]
public static void main(String[] args) { Boolean flag = true; Set<String> set = new HashSet<String>(123); String a = "123;12321;321321;321;321;321321;3213;21;312;3;21;32;13;2...原创 2019-12-09 21:28:04 · 211 阅读 · 0 评论 -
LIST巧妙分批
有些时候,我们对于一个大集合需要分配处理。例如要给10万员工发邮件,很多时候都是分配处理。不可能拿到List,全量下发。List<EamilVO> sendEmailList = dao.getWaitSendEmail();List<EamilVO> sendEmailSUbList = new List<EamilVO>;for(EamilVO eam...原创 2019-12-09 21:26:41 · 281 阅读 · 0 评论 -
集合框架
零散的知识不是知识,知识知道,这一章是整体的概括,集合是一个比较庞大的独立模块,可以称之为一个框架。框架–framework是一个类的集,他奠定了创造高级功能的基础。框架包含很多超类,这些超类拥有非常有用的功能、策略和机制。集合有两个基本的接口:Collection和Mapboolean add(E element) 集合插入元素V put(K key,V value) 映射表插入元素...原创 2019-11-26 21:04:46 · 234 阅读 · 0 评论 -
Java实现Base64加解密
这个就更加常用了,主要用户解决文本传输乱码问题,很简单,不安全。回去整理原创 2019-11-18 10:01:02 · 185 阅读 · 0 评论 -
Java实现AES加解密
AES目前项目是必用的,尤其涉及到账号密码信息,可能还需要通过C写证书,底层真正用到的时候再去取,必须加密传输,不允许出现任何中间存储,密码只能获取一次,然后动态码直接失效。所以做开发AES非常重要,安全永远大于业务实现。这个功能可以直接通过JDK的工具实现AES加密很强大,就算计算机采用穷举法才有上亿年才能破解公司基本会重写这个算法,每个公司都不一样回家后整理...原创 2019-11-18 09:57:43 · 234 阅读 · 0 评论 -
具体的集合
ArrayListLinkedListArrayDequeHashSetTreeSetEnumSetLinkedHashSetPriorityQueueHashMapTreeMapEnumMapLinkedHashMapWeakHashMapIdentityHashMap除了Map结尾的类之外,其它的类都实现了Collection接口。Map结尾的类实现了Map...原创 2019-11-13 22:47:46 · 158 阅读 · 0 评论 -
集合接口
长城不是一天修建的,JDK也是。集合最初也是使用了顶层设计的思路,java最初版本知识为最常用的数据结构提供了很少的一组类:Vector、Stack、Hashtable、BitSet与Enumeration接口。其中Enumeration接口提供了一种用于访问任意容器中各个元素的抽象机制。将集合的接口与实现分离以人们熟悉的数据结构–队列–queue为例,看下是如何分离的。队列接口之...原创 2019-11-13 22:37:18 · 273 阅读 · 0 评论 -
集合概述
这一章是JAVA开发人员的核心。不是其他的不重要,而是先生存后发展,先拿到20K工资,然后再深入玩你想玩的。刚入行肯定是懵逼的,尤其转行做开发,初步都是死记硬背,不了解为什么这么做,有哪些API,乱七八糟的概念到底什么意思,工作一两年后回头看反而没什么了。有一门专业的课程叫做数据结构,其实集合是一种数据结构,并且还有一些算法。要掌握的核心内容如下,理解概念,玩转使用:集合接口具体的集...原创 2019-11-13 21:30:23 · 102 阅读 · 0 评论 -
反射与泛型
Class类型是泛型的,它是类加载后的操作工具。例如:String.class 实际上是一个Class<String>对象,也是唯一对象。类型参数十分有用,这是因为他允许Class<T>方法的返回类型更加具有针对性。Class具体有哪些方法,可以查看下源码或者API文档使用Class<T>参数进行类型匹配这个就是范类型起到了限定作用虚拟机中的范类型信...原创 2019-11-13 21:21:40 · 164 阅读 · 0 评论 -
通配符类型
这个是在泛型基础上的一次扩展,让泛型更加灵活,还是对于框架或工具开发有效,业务开发人员基本不会自己去做,但是必须明白框架或者工具类为什么这么用。Pair< ? extends Employee>这样我们可以把员工的子类型数据传入,对于范类型方法就可以处理对应的数据。通配符超类型限定通配符限定与类型变量限定十分类似,但是,还有一个附加的能力,即可以指定一个超类型限定–supert...原创 2019-11-13 21:07:53 · 497 阅读 · 0 评论 -
约束与局限性
大多数局限性都是由类型擦除引起的不能用基本类型实例化类型参数这个是因为类型擦除后Object,这个强制类型转换基本类型也只能使用对应的包装类。运行时类型查询只适用于原始类型虚拟机中的对象总有一个特定的非范类型,因此,所有的类型查询只产生原始类型。无论何时使用instanceof或者涉及范类型的强制类型转换,都会看到一个编译告警。 public static void main(Str...原创 2019-11-13 20:44:05 · 270 阅读 · 0 评论 -
泛型代码和虚拟机
虚拟机没有泛型类型的对象–所有对象都属于普通类。那么虚拟机怎么工作?类型擦除、原始类型、给JVM的指令、桥方法、Java泛型转换的事实Java泛型转换的事实:虚拟机中没有泛型,只有普通的类和方法所有的类型参数都用他们的限定类型替换桥方法被合成来保持多态为保持类型安全性,必要时插入强制类型转换类型擦除–type erasureJava泛型的处理在编译器中运行,编...原创 2019-11-13 18:20:07 · 172 阅读 · 0 评论 -
类型变量的限定
类和方法需要对类型变量加以约束。 public static <T> T min(T[] a) { if (a == null || a.length == 0) { return null; } T smallest = a[0]; for (int i = 1; i < a.length; i++) { if (sm...原创 2019-11-11 17:16:31 · 293 阅读 · 0 评论 -
泛型方法
public static <T> T getMiddle(T[] a) { return a[a.length / 2]; }除了泛型类还有泛型方法,这里不做深入整理,如果真是需要 用到再做整理。原创 2019-11-11 16:27:51 · 94 阅读 · 0 评论 -
简单泛型类的定义
一个泛型类–generic class 就是具有一个或多个类型变量的类。package com.wht.generic;public class Pair<T> { private T first; private T second; public Pair() { this.first = null; this.second = null; ...原创 2019-11-11 16:22:36 · 275 阅读 · 0 评论 -
为什么要使用泛型设计
泛型程序设计–Generic programming 意味着编写的代码可以被很多不同类型的对象所重用。最常见的例子就是我们集合对象,例如ArrayList。在这个容器中我们可以放入各种数据类型的元素,而不用为每个类型设计一个容器去处理。类型参数–type parametersArrayList files = new ArrayList();增加了可读性编译器更好的做数据类型处理,不...原创 2019-11-05 18:06:49 · 493 阅读 · 0 评论 -
泛型程序设计概述
最熟悉的陌生人,JAVA有两个工具我们一直再使用却从来不深入,注解@和泛型。为什么要使用泛型程序设计简单泛型类的定义泛型方法类型变量的限定泛型代码和虚拟机约束与局限性泛型类型的继承规则通配符类型反射和泛型泛型从个人角度看,真的是一个流弊的设计,是JAVA的核心设计。JAVA是强类型,我们总不能用Object强制转来转去,在使用对象的时候,会经常出问题。如果我们提前定义好...原创 2019-11-05 02:18:27 · 273 阅读 · 0 评论 -
调试技巧
调试是开发的核心工作。可以用日志打印语句进行控制台观察sout 临时使用logger.info类中写一个main方法,进行类中部分功能调试,例如调用第三方接口。使用junit,百度了解对应知识。日志代理Throwable 打印堆栈信息输出日志到指定文件其实最好用的是开始集成开发工具的DEBUG模式,例如IDEA。...原创 2019-11-05 00:57:13 · 163 阅读 · 0 评论 -
记录日志
这个是程序员的核心工作,程序不是开发出来的是debug出来的,生产不是搭建出来的,是通过日志追踪来的。日志是一个系统的核心,sout自己看看还可以,真实项目尽量忘记这个内置API,否则代码扫描就是给自己挖坑。日志很重要,正式发布的应用日志一般都要有几个要求:可定向输出,可能是catlina.out,也可能是ln 后的某个磁盘文件,也许在nas盘,也许被agent抓取到云日志平台。有日志级...原创 2019-11-05 00:53:56 · 202 阅读 · 0 评论 -
断言
怎么说,自从参加工作这个东西再也没有出现在ODC,闻所未闻。理论上上一些入参没问题,实际上各种情况都会出现,为了规避错误我们会写各种判断。public class Test { public static void main(String[] args) { System.out.println(Test.test(-1)); } public static doubl...原创 2019-11-04 23:21:25 · 189 阅读 · 0 评论 -
使用异常机制的建议
异常机制不能替代简单的测试。不要过分的细化异常。利用异常层次结构。不要压制异常。在检测异常时,苛刻要比放任更好。不要羞于传递异常。...原创 2019-11-04 23:06:20 · 139 阅读 · 0 评论 -
捕获异常
抛出异常基本都是在底层,而不会再业务处理的地方,真实项目异常总要处理,往往还伴随着事务处理,而非不关注异常的向上抛。捕获并且处理异常是真实项目必须要做的工作。 try { result = Test.eofExcptionTest(length); } catch (EOFException e) { e.printStackTrace(); }...原创 2019-11-04 23:02:43 · 177 阅读 · 0 评论 -
异常处理
用户输入错误。设备错误物理限制代码错误这些是我们生产环境经常遇到的问题,有些错误会有一些错误编码,但是大多数错误没有,是手工校验。而把问题进行汇总分类,处理是编程的核心工作。初级程序第一要务是把业务实现,但是随着项目的进行,最后会发现程序员真正的能力是解决问题的能力。例如我写一个插件,为什么有的OS可以正常执行,有些版本的系统无法正常运行。例如我做一个UI,我的电脑上看着一切p...原创 2019-11-03 21:06:06 · 154 阅读 · 0 评论