Java一些零散知识点--3.23更
for循环的结构可以为:for(单/多/空;布尔/空;单/多/空)单:单表达式多:多表达式第二个表达式为空则是死循环在Java里,for(;;)等价于while(true)foreach循环 例:for(int x:array)
1B=8bit 1KB=1024B
bit:比特 位
byte:字节 也就是B
boolean 1位
byte 1字节 8位
char 2字节 16位
short 2字节 16位
int 4字节 32位
float 4字节 32位
long 8字节 64位
double 8字节 64位
默认情况下,如果输入法没有切换到全角,你点击的space键默认输出的是半角空格。
在Java中,可以使用“ ”直接输出空格,也可以通过unicode代码表示空格
1.不间断空格\u00A0,主要用在office中,让一个单词在结尾处不会换行显示,快捷键ctrl+shift+space ;
2.半角空格(英文符号)\u0020,代码中常用的;
3.全角空格(中文符号)\u3000,中文文章中使用;
String转换为char
- 使用String.charAt(index)(返回值为char)可以得到String中某一指定位置的char。
- 使用String.toCharArray()(返回值为char[])可以得到将包含整个String的char数组。
char转换为String
char[ ] charArr={“a”,“b”}
String s = String.valueOf({“a”,“b”}); //效率最高的方法
String s = String.valueOf(charArr); //将一个char数组转换成String
String s = " " + charArr; // 效率最低的方法 // Java中的String Object的值实际上是不可变的,是一个final的变量。 // 所以我们每次对String做出任何改变,都是初始化了一个全新的String Object并将原来的变量指向了这个新String。 // 而Java对使用+运算符处理String相加进行了方法重载。
字符串直接相加连接实际上调用了如下方法: // new
StringBuilder().append("").append(charArr).toString();String s = new String(charArr);
do while循环中,while里面的运算也会对值产生影响(Java是值传递)
float数后面要加f,例如float x=3.6f
switch每个case(包括没有放在最后的default)后面都要加break要不然就会执行完当前case后继续执行本case后面的case直到执行完或者遇到break;default放在哪里都可以,但是只要不放在最后就失去了原本的意义,default意为缺省,即前面的条件都不满足的时候运行default
Java标识符 字母、数字、"_"、"&",数字不能为首位
x%y 算x里面有几个y 然后返回余下的x
派生是在继承了一些东西的基础上增添了新的东西
根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:
整个文档是一个文档节点
每个 HTML 元素是元素节点
HTML 元素内的文本是文本节点
每个 HTML 属性是属性节点
注释是注释节点
windows cmd创建指定大小的文件 (3221225472KB=3G)
fsutil file createnew test.txt 3221225472
继承JpaRepository,传入泛型,第一个参数为要操作的实体类,第二个参数为该实体类的主键类型
例:XXXRepository extends JpaRepository
1.HTTP Request 第一部分是包含的头信息 HttpContent 里面包含的是数据,可以后续有多个 HttpContent 部分
2.LastHttpContent 标记是 HTTP request 的结束,同时可能包含头的尾部信息
3.完整的 HTTPrequest,由1,2,3组成
1.HTTP response 第一部分是包含的头信息 HttpContent 里面包含的是数据,可以后续有多个 HttpContent 部分
2.LastHttpContent 标记是 HTTP response 的结束,同时可能包含头的尾部信息 完整的 HTTP
3.response,由1,2,3组成
三元运算符需要三个操作数。
语法为:条件表达式?表达式1:表达式2。
问号前面的位置是判断的条件,判断结果为bool型,为true时调用表达式1,为false时调用表达式2
length–数组的属性
length()–String的方法
size()–List,Set,Map等集合的方法
dao,dto,vo,po,pojo,bo的区别:
参考小张的博客:un1queyan.github.io
HashMap:
一个key-value构成一个entry
允许key和value值为null
HashMap和HashSet存储自定义类时,需要在key所在的类(自定义类)对hashcode()和equals()进行重写(非自定义类已内置对这两个方法的重写,例如String),避免存储相同值的不同实例时出现重复的情况。Object原生的equals()和hashcode()都是根据实例的地址进行运算,如果不重写的话,存储值相同的不同实例时,因为地址的不同,被认为是不同的值进行存储。
泛型通配符:本质上不同的泛型通配符其实没什么区别,可以随意替换,只不过是约定俗成地用不同的字母或者符号代替不同的含义。
?无界通配符: 表示不确定的 Java 类型
T :代表Type,表示具体的一个Java类型
K和V : 分别代表Java键值中的Key和Value
E :代表Element(元素),常用在集合类中表示集合中的元素
位运算符
& 按位与
|按位或
^按位异或 (相同为0,不同为1)
~取反
<<左移
>>右移
Maven的 XXX标签
compile
默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。适用于所有阶段,会随着项目一起发布
provided
跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。这个scope 只能作用在编译和测试时,同时没有传递性。
runtime
表示dependency不作用在编译时,但会作用在运行和测试时,如JDBC驱动,适用运行和测试阶段。
test
表示dependency作用在测试时,不作用在运行时。 只在测试时使用,用于编译和运行测试代码。不会随项目发布。
system
跟provided 相似,但是在系统中要以外部JAR包的形式提供,maven不会在repository查找它
@ControllerAdvice
在Spring里,我们可以使用@ControllerAdvice来声明一些全局性的东西,最常见的是结合@ExceptionHandler注解用于全局异常的处理。
@ControllerAdvice是在类上声明的注解,其用法主要有三点:
@ExceptionHandler注解标注的方法:用于捕获Controller中抛出的不同类型的异常,从而达到异常全局处理的目的;
@InitBinder注解标注的方法:用于请求中注册自定义参数的解析,从而达到自定义请求参数格式的目的;
@ModelAttribute注解标注的方法:表示此方法会在执行目标Controller方法之前执行
Linux命令 (CentOS 8.2)
sudo su root 切换root用户
命令后加 -y 遇到(y/n) 自动选择yesps -ef|grep XXX 查看XXX进程
clear 清除命令行
vim
:wq保存退出
:q退出
@RequestMapping 默认method是get,post方式都支持
@GetMapping,处理get请求
@PostMapping,处理post请求
@PutMapping,处理put请求
@DeleteMapping,处理delete请求
@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
最常用的post和get
post请求,如果是接收json格式(要求传输参数是json(application/json;charset=utf-8),接收参数要是一个参数或者是一个对象并且参数前加上@RequestBody注解);如果是表单提交(application/x-www-form-urlencoded),接收参数没有要求即可以是对象也可以是多个参数的接收方式
get请求,参数不能是json(application/json;charset=utf-8)格式,只能是表单(application/x-www-form-urlencoded)格式
详细请看这两篇很好的博客https://www.hangge.com/blog/cache/detail_2485.html
以及https://www.hangge.com/blog/cache/detail_2484.html
Json和Gson
JSON: 是javascript对象的一种形态,是一种轻量级的数据交换格式。一般用来在JavaEE后台服务和Android或者IoS、H5之间进行通信的一种数据传递的格式
Gson: 是谷歌推出的一个用于生成和解析JSON数据格式的工具
从一个XXX json字符串生成一个Java对象
例:Gson gson = new Gson();Request req = gson.fromJson(XXX, Request.class); 【方法参数:(Json对象,对应实体类)】
这时候会有问题,需要验证输入的json字符串是否是从当前的Request这个类序列化过去的,这个时候就需要用serialVersionUID来判断了
序列化和反序列化(serial翻译为序列、串行,所以序列化和串行化的的意思是一样的)
Java是面向对象的语言,与其他语言进行交互(比如与前端js进行http通信),需要把对象转化成一种通用的格式比如json(前端显然不认识Java对象),从对象到json字符串的转换,就是序列化的过程,反过来,从json字符串转换成Java对象,就是反序列化的过程
serialVersionUID是什么
serialVersionUID:序列版本用户标识符
UID:user identification用户标识符
Java的序列化机制通过判断类的serialVersionUID来验证版本一致性。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地对应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即InvalidCastException (无效强转异常)
serialVersionUID有两种显示的生成方式:
一是默认的1L,例:private static final long serialVersionUID = 1L;
二是根据类名、接口名、成员方法及属性等来生成一个64位的哈希字段
当一个类实现了java.io.Serializable接口,并且没有显示的定义serialVersionUID的时候,Java序列化机制会根据类信息编译的Class文件自动生成一个serialVersionUID,如果Class文件没有发生变化,就算重复编译,serialVersionUID也不会变。
如果我们不希望通过编译文件来强制划分软件版本,想让实现序列化接口的实体能够兼容先前版本,就需要显式地定义一个类型为long的serialVersionUID变量,变量值相等的序列化实体都可以相互进行序列化和反序列化
System.currentTimeMillis() 获取时间戳
哈希算法又叫散列算法,指的不是某一种算法,是某一类算法,将任意长度的二进制值转换为固定长度的二进制值,常用哈希算法有:MD、SHA、SM3
哈希值:通过哈希运算,从而映射成的二进制的值称为哈希值
无论输入是什么数字格式、文件有多大,输出都是固定长度的比特串。以Sh256算法为例,无论输入是什么数据文件,输出就是256bit,用16进制数字表示的话是64位
例:00740f40257a13bf03b40f54a9fe398c79a664bb21cfa2870ab07888b21aaba8