Java编程思想扫盲

概述

本篇文章是出于对我的《Android内部分享》系列文章和视频中涉及到的Java知识, 考虑到很多朋友初次接触 Android 可能遇到的最大的困扰是 Java 的语法,面对很多视频和文章中的示例,无法理解语法规则何谈去理解 Android 开发,所以我特意做了这篇文章,希望能带你入坑,毕竟只是一篇文章,入坑后得靠自己去多看书,多练习,多思考。

C 和 Java

为什么说 Java 之前要提到 C 语言呢?我考虑的是很多语言其实都是 类C 语言,也就是说大多数语言的语法基础和 C 语言几乎一致,而且 C 语言是高校必学课程,从这一点入手可以事半功倍。

先来看一段 C 语言代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

void testFunction(int);

int main(int argc, char const *argv[])
{
int a = 1;
testFunction(a);
}

void testFunction(int arg){
printf("test : %d", arg);
}

这是一个很简单的 C 语言代码,里面定义了变量和函数,接下来我们用 Java 实现同样的功能,大家来对比一下:

1
2
3
4
5
6
7
8
9
10
11
12
public class TestJava1 {

public static void main(String[] args){
int a = 1;
TestJava1 testJava1 = new TestJava1();
testJava1.testFunction(a);
}

private void testFunction(int arg){
System.out.println(String.format("test:%d", arg));
}
}

可以发现有很多不一样的地方,但是其中也蕴含着很多一致的地方,我们对比一下来加深语法层面上的理解:

int转byte和位运算问题

前言

在 Java 中 int 占4个字节, short 占2个字节, byte 占1个字节,有时候我们需要将 int 转换为 byte 就需要舍弃一些高位或者低位数据。

转换

比如有两个变量:

1
2
3
4
5
6
7
int i = 5;
int j = 0xff24;
int k = -4;
int m = -400;
System.out.println(Integer.toBinaryString(i));
System.out.println(Integer.toBinaryString(j));
System.out.println(Integer.toBinaryString(k));

二进制补码表示:

1
2
3
4
5
6
7
8
0000 0000 0000 0000 0000 0000 0000 0101 (5的补码)
0000 0000 0000 0000 1111 1111 0010 0100 (0xff24的补码)

0000 0000 0000 0000 0000 0000 0000 0100 (-4 的 绝对值)
1111 1111 1111 1111 1111 1111 1111 1100 (-4 的 补码)

0000 0000 0000 0000 0000 0001 1001 0000 (-400 的 绝对值)
1111 1111 1111 1111 1111 1110 0111 0000 (-400 的 补码)

NIO和ByteBuffer简单使用

前言

最近在做一个串口相关的项目,里面频繁使用了对字节数组的处理,所以需要使用ByteBuffer来处理,于是就对这方面知识做一个简单的梳理和记录。

NIO

Java NIO 是 java 1.4之后出的一套IO接口NIO中的N可以理解为Non-blocking,不单纯是New。

NIO的特性/NIO与IO区别:

  • IO是面向流的,NIO是面向缓冲区的
  • IO流是阻塞的,NIO流是不阻塞的
  • NIO有选择器,而IO没有

Kotlin语言和Gradle构建搭建SpringBoot工程

前言

最近想做一个小项目,遇到了后台开发问题,从Python、Go、Nodejs、Java、Kotlin中我对比选择了一下,最后还是决定使用自己最熟悉的Java开发,后来又想了一下,既然现在Android开发都是用Kotlin了,而且Kotlin语法这么灵活简介,为何不用Kotlin结合Gradle构建来搭建一个SpringBoot工程呢,整个过程也是本人在逐渐摸索,中间可能会遇到很多障碍和问题,但是没关系,俗话说开弓没有回头箭,因为我已经决定开始了。

Spring MVC概念和使用

参考链接:

《Spring MVC 学习指南(第二版)》

Spring MVC 是 Spring 框架中用于Web应用快速开发的一个模块。Spring框架是一个开源框架,源码下载地址:

1
git clone git@github.com:spring-projects/spring-framework.git

控制反转(IOC)

DI和IOC是差不多的概念,一个重要特征是接口依赖,是把对象关系推迟到运行时去确定。Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

JavaWeb开发快速上手篇

参考链接:

《Java Servlet 技术简介》
《SpringMVC架构浅析》
《Spring MVC 学习指南(第二版)》

距上一次接触JavaWeb已经快6年时间了,最近因工作原因需要学习Web开发知识,这里做一个简单的记录。所以本文适合对JavaWeb开发有一定了解和基础的人群,达到快速拾起并上手的目的。

开发工具:IntelliJ IDEA
构建工具:Maven

创建工程

File -> New -> Project -> Java -> Java Web

创建JavaWeb工程

工程目录结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
TestWeb
│ TestWeb.iml

├─.idea
│ │ encodings.xml
│ │ misc.xml
│ │ modules.xml
│ │ workspace.xml
│ │
│ └─artifacts
│ TestWeb_war_exploded.xml

├─out
│ └─artifacts
│ └─TestWeb_war_exploded
│ │ index.jsp
│ │
│ └─WEB-INF
│ web.xml

├─src
└─web
│ index.jsp

└─WEB-INF
│ web.xml

├─classes
└─lib

Java中的软(弱)引用

Java中的强、软、弱、虚引用

在JDK中我们可以看到有一个java.lang.ref的包,这个包中就是Java中实现强、软、弱、虚引用的包,如下:

Java中的软引、弱、虚引用

Java中的多线程

进程和线程

操作系统有两个容易混淆的概念,进程和线程

进程:一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。
线程:表示程序的执行流程,是CPU调度执行的基本单位;线程有自己的程序计数器、寄存器、堆栈和帧。同一进程中的线程共用相同的地址空间,同时共享进进程锁拥有的内存和其他资源。

进程是操作系统资源分配的最小单位(CPU时间, 内存空间),线程就是共享虚拟内存映射的进程,多个线程属于一个进程。

Java标准库提供了进程和线程相关的API,进程主要包括表示进程的java.lang.Process类和创建进程的java.lang.ProcessBuilder类

表示线程的是java.lang.Thread类,在虚拟机启动之后,通常只有Java类的main方法这个普通线程运行,运行时可以创建和启动新的线程;还有一类守护线程(damon thread),守护线程在后台运行,提供程序运行时所需的服务。当虚拟机中运行的所有线程都是守护线程时,虚拟机终止运行。

3D Adapter Ajax Android AndroidStudio Animation Anroid Studio AppBarLayout AsyncTask Babel Banner Buffer Bulma ByteBuffer C++ C11 C89 C99 CDN CMYK CSS Camera Raw Canvas Chrome Class ContentProvider CoordinatorLayout C语言 DML DOM Dagger Dagger2 Darktable Demo Document DownloadManage ES2015 ESLint Element Elements Error Exception Extensions File FileProvider FileSave Flow Fresco GCC Git Git flow GitHub GitLab Github flow Gitlab flow Glide Gradle GrideView Groovy HTML HTML5 Handler HandlerThread Hexo Hilo Hybrid I/O IDEA IO ImageMagick ImageView IntelliJ Intellij Intent Interpolator JCenter JNI JS Java JavaScript JsBridge Kotlin Lab Lambda Lifecycle Lint Linux ListView Looper MQTT MVC MVP Maven MessageQueue Modbus Momentum MySQL NDK NIO Next Nodejs ObjectAnimator Okhttp Oracle VM Permission PhotoShop Physics Process Python RGB RS-232 RTU RecyclerView Remote-SSH Retrofit Runnable RxAndroid RxJava SE0 SQLite SSH SharePreference Spring SpringBoot Statubar Style Task Theme Thread Tkinter UI UIKit UML VM virtualBox VS Code VUE ValueAnimator ViewPropertyAnimator Vue Vue CLI Vue.js Web WebGL Web前端 Workbench Zdog api apk axios background blur bookmark by关键字 cli compileOnly component computed css css3 c语言 databases demo flex flexbox flow gradient hexo hotfix html iOS icarus icarus主题 implementation init jQuery javascript launchModel linear logo merge methods mvp offset photos pug query radial rxjava2 scss servlet shell slot slot-scope svg tkinter tomcat transition unicode utf-8 v-slot vector virtual box vscode watch webpack 七牛 下载 中介者模式 串口 临潼石榴 主题 书签 书籍 事件 享元模式 亮度 仓库 代理模式 位运算 依赖注入 修改,tables 光和色 入坑 内存 内核 内部分享 函数 函数式编程 分支 分析 列表 创建 删除 动画 单例模式 发布 可空性 合并 同向性 后期 启动模式 命令 命令模式 响应式 响应式编程 图层 图床 图形图像 图片压缩 图片处理 图片轮播 地球 域名 基础 增加 备忘录模式 外观模式 多线程 大爆炸 天气APP 太白山 头文件 奇点 字符串 字符集 存储引擎 宇宙 宏定义 实践 对比度 属性 属性动画 岐山擀面皮 岐山肉臊子 岐山香醋 工作流 工具 工厂模式 年终总结 开发技巧 开发流程 异常 弱引用 思想 恒星 打包 扫盲 技巧 指令 指针 接口 插件 插值 插槽 摄影 操作系统 攻略 故事 数据存储 数据库 数据类型 数组 文件 新功能 旅行 旋转木马 时序图 时空 时间简史 曲线 最佳实践 杂谈 权限 枚举 架构 查询 标准库 标签选择器 样式 核心 框架 案例 桥接模式 检测工具 模块化 模板 模板引擎 模板方法模式 油泼辣子 泛型 洛川苹果 浅色状态栏 混合模式 渐变 渲染 游戏 源码 源码分析 滤镜 瀑布流 灰度 热修复 版本 版本回退 版本控制 状态栏 状态模式 生活 界面 留言板 直方图 相册 相对论 眉县猕猴桃 知识点 码云 磁盘 科学 笔记 策略模式 类图 系统概述 系统,发行版, GNU 索引 组件 组合模式 绑定 结构 结构体 编码 编程 网易云信 网格布局 网站广播 网站通知 网络 美化 联合 背景 背景混合 脚手架 膨胀的宇宙 自定义 自定义View 自定义插件 色调 蒙版 虚拟 虚拟机 补码 补齐 表单 表达式 装饰模式 西安 观察者模式 规范 视图 视频 解耦器模式 设计 设计原则 设计模式 访问者模式 语法 责任链模式 贪吃蛇 走马灯 转换 软件工程 软引用 过滤器 运算符 进程 迭代子模式 适配器 适配器模式 选择器 通信 通道 配置 链表 锐化 错误 键盘 闭包 降噪 陕西地方特产 面向对象 项目优化 项目构建 饱和度 高斯模糊 黑洞
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×