java常识
包的作用
-
1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
-
2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
-
3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
package和package的附属关系用”.”来连接
如果类别不使用package名称,那在用到相同名称的不同类时, 就会产生极大的困扰。所以package这种方式让极大降低了类之间的命名冲突、
protected
实体只能由定义在如下范围内的代码访问
1. 定义实体的类
2.相同包中和定义类一样的类
3.定义类的子类,不管子类在那个包中定义
instanceof
严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例
throw
ExceptionInstance;当 Java 运行时接收到开发者自行抛出的异常时,会中止当前的执行流,跳到该异常对应的 catch 块来处理该异常。即不管是系统自动抛出的异常还是程序员手动抛出的异常,Java 运行时环境对异常的处理没有任何差异。
finally
作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。
private的作用
限制类中的变量被不合理地赋值或者访问。一般的private的值都会带上set和get方法(这里边肯定不会设置为private了),并且设置一些调用变量的条件,这样在外部调用时,如果不对就会返回一些报错了。
git
是版本管理工具,可以方便多人共享项目,发布最新版本的代码。目前我能用到的就是用git clone把代码从gitlab上下载下来。maven是项目构建工具,Mavan为Java项目提供了统一的管理方式,已成为业界标准
maven特性
- 项目设置遵循统一的规则,保证不同开发环境的兼容性
- 强大的依赖管理,项目依赖组件自动下载、自动更新
- 可扩展的插件机制,使用简单,功能丰富
this
引用本类中的变量,预防与其他类中的变量重名的问题。this是在方法里面写的,不能在方法外直接写。所有是谁调用的方法,就是谁的this
API
jdk 1.6 可以够初学者用,是中文版的,再往后的版本就没有中文了
java.lang是包路径,string是类名,需要看构造方法一两个和成员方法
api大概分类:键盘 随机数 数组相关
导包
在java中java.lang不需要导包,其他的没有import是不能用的
快速输入
alt+\ ,输出语句是syso,main语句是直接输入main
匿名对象
类名称 对象名=new 类名称;在这里面匿名对象就是没有左边那一串。匿名对象只能使用一次,也就是说在一条语句里要把该用的东西赋值清楚,存在一个特定的变量里,否则到下一条值就没有了
注解
的属性也叫做成员变量。注解只有成员变量,没有方法。在注解中定义属性时它的类型必须是 8 种基本数据类型外加 类、接口、注解及它们的数组。注解针对紧跟着它的那句话
java预置的注解:
- @Override - 检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报编译错误。
- @Deprecated - 标记过时方法。如果使用该方法,会报编译警告。
- @SuppressWarnings - 指示编译器去忽略注解中声明的警告。
作用在其他注解的注解(或者说 元注解)是:
- @Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。
- @Documented - 标记这些注解是否包含在用户文档中。
- @Target - 标记这个注解应该是哪种 Java 成员。
- @Inherited - 标记这个注解是继承于哪个注解类(默认 注解并没有继承于任何子类)
从 Java 7 开始,额外添加了 3 个注解:
- @SafeVarargs - Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
- @FunctionalInterface - Java 8 开始支持,标识一个匿名函数或函数式接口。
- @Repeatable - Java 8 开始支持,标识某注解可以在同一个声明上使用多次。
Lombok
项目是一个Java库,它会自动插入编辑器和构建工具中,Lombok提供了一组有用的注释,用来消除Java类中的大量样板代码。仅五个字符(@Data)就可以替换数百行代码从而产生干净,简洁且易于维护的Java类。
关闭占用端口号的方法
在windows用命令行查看端口号
https://blog.csdn.net/zhouky1993/article/details/103976320
F12看get和post请求
数组
数组新建数组语句。注意区分取的是每个元素的地址值还是量。数组是不能改变长度的。
person【】 array=new person(3)
对于arraylist,加上尖括号<>代表泛型,也就是全部都是一个类型,但是注意不能写类型,要写包装类,一般就是首字母大写
接口
是一种公共的规范标准,对于java7 只能写常量和abstract方法。以后的java版本可以写其他方法
一旦使用final关键字“变量”不可改变,称为常量。
接口中固定的 public static final 修饰变量,可以省略不写,不写也还是这样
static不使用对象, 直接用接口名称.来调用
public enum Color {
RED, GREEN, BLANK, YELLOW
}
定义枚举 里面都是常量,枚举相当于switch函数
在普通的class后面写上implement (名称没有要求) 就称为接口的实现类
实现类必须覆盖接口的所有抽象方法
abstract修饰方法以后,实现接口时abstract会被自动调用
@RestController注解相当于@ResponseBody + @Controller合在一起的作用
@Controller只是定义了一个控制器类
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
@Slf4j是用作日志输出的
要配置 Web 请求的映射,就需要你用上 @RequestMapping 注解。@RestController @RequestMapping("/home") 这就是惯用的用法
- @Api()用于类;
表示标识这个类是swagger的资源
swagger是什么?1、是一款让你更好的书写API文档的规范且完整框架。
@Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
以上这些是一组的
@ApiOperation(value = “接口说明”, httpMethod = “接口请求方式”, response = “接口返回参数类型”, notes = “接口发布说明”)
MyBatis :
我个人最早用 MyBatis 时,先是完全手写,然后用上了 MyBatis 代码生成器(简称为 MBG),在使用 MBG 过程中,发现一个很麻烦的问题,如果数据库字段变化很频繁,就需要反复重新生成代码,并且由于 MBG 覆盖生成代码和追加方式生成 XML,导致每次重新生成都需要大量的比对修改。除了这个问题外,还有一个问题,仅仅基础的增删改查等方法,就已经产生了大量的 XML 内容,还没有添加一个自己手写的方法,代码可能就已经几百行了,内容多,看着比较碍事。
因为很多人都在使用 MBG,MBG 中定义了很多常用的单表方法,为了解决前面提到的问题,也为了兼容 MBG 的方法避免项目重构太多,在 MBG 的基础上结合了部分 JPA 注解产生了通用 Mapper。通用 Mapper 可以很简单的让你获取基础的单表方法,也很方便扩展通用方法。使用通用 Mapper 可以极大的提高你的工作效率。
@ds切换数据源(数据库)这是基于spring的mybatis特有的用法,具体在官网上有
为什么要把DAO作为接口 再用impl类来实现?
这样做是为了后期的维护。当软件全部编好了,测试好了,然后给用户装好了,但是过一段时间,用户用着不爽,他又让做软件的人改变一些功能,这样软件开发人员只需要改实现类里面的代码,也就是只用改一个包下代码,不用这个包改一下,那个包里的代码还要改。因为项目大了,代码就是成万上亿行。用了接口的话,就起了这个作用,我举个生活中的例子:就好比你家突然停电了,经过你的一番检查,发现是一处电线断了,这时候你只需要把电线里面的铜丝或者铝丝接上,就好了,而不用把电线外面的绝缘皮剥了,然后再接铜丝或者铝丝。可能说的意思不太对,但是就是这个意思。
另外,不用接口的话,假如修改了dao中的代码,因为service引用了dao中的类,那么也要改变service里面的代码,改完之后要重新编译运行,当项目比较大的时候,编译和运行很浪费时间的,而且会产生一些意外(我听老师说的,我还没遇见过),本来只要编译dao中的代码,现在不光要编译dao中的代码,还要编译service。因为你不用接口,间接着action里的代码也要改,因为action中引用了service中的类,到最后,就变成了,牵一发而动全身。本来在各个层之间用了接口只需要改一处代码的,这下可好,全要改,再举个不太恰当的例子:好比,我摔了一跤,小腿摔断了,小腿断了,因为没用接口,间接着,大腿也断了,接着,屁股开花了,接着,上身也感染了。最后gg了。可能不太恰当,但是有助于你理解。
@Cacheable
可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,这个稍后会进行说明。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。@Cacheable可以指定三个属性,value、key和condition。
参数 解释 example
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 例如:
@Cacheable(value=”mycache”)
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 @Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 @Cacheable(value=”testcache”,condition=”#userName.length()>2”)
项目配置了swagger自动生成接口文档
get和post的区别
@override可以检查是不是已经覆盖重写,没成功会报错
子类的构造方法调用时会自动调用一次父类的构造方法
普通子类方法不能引用父类的构造方法
super()语句表示引用父类构造方法,而且必须写在第一句
supper相当于父类的类名。
子类的构造方法中默认包含了一个父类的无参数构造方法,写不写都一样
@test
配置junit,使用注解后不写main就能运行。但是main运行时不会自动运行它
implements Serializable
持久化/序列化:把数据写入磁盘称为持久化,如在程序运行的过程中输出txt文本,将数据写入数据库等
IO读写就是序列化及反序列化的过程
凡是涉及持久化的,必须要做implements Serializable操作,否则程序就会报错
@Select
Mybatisplus 自定义sql 使用条件构造器作为参数 两种方式
只需添加 ${ew.customSqlSegment}和@Param(Constants.WRAPPER)即可
@Select("select * from mysql_data ${ew.customSqlSegment}")
List<MysqlData> getAll(@Param(Constants.WRAPPER) Wrapper wrapper);
debug
调试过程中会从下往上,再从上往下地执行所有线程,这是压栈的过程。它的排列顺序和xml中的排列顺序也是有关系。
鼠标在行号前面单击设置断点,在这一行上面右键debug as。如果执行到这行,颜色会标绿。
视图切换
eclipse默认是JAVA EE视图 点击右上角切换
debug开始前要记得点击红色方框结束上一轮调试
id代表内存地址
stepover stepinto
main()
{
run();
wait();
start();
}
run()
{
carrun();
}
如果当前箭头在main(),
stepover 就是 只看当前这bai一层调用函数名du。
run(),wait(),start(),一步一步看这一层都调zhi用了哪些函数
stepinto 进入下一层,就是每碰到一个函数,都会进去看这个函数,直到最深层代码执行完毕返回,
run(),carrun(),wait(),start(),会将整个代码全部看一遍
stepout 就是返回上一层,当前箭头如果在carrun()上,你点一下stepout,箭头就会到wait()
使用断点调试的问题就在于注解的地方没办法设置断点
包装类
原始类型/封装类型(引用类型)。包装类主要是为了方便调用一些自带的方法。都是在lang中,不用导包。
装箱的概念:把基本类变成包装类,反之叫做拆箱。
integer。valueof是装箱
intvalue是拆箱
自动装箱和拆箱的含义:
定义数据类型为Integer的数或数组,再对它进行加减时,它实际上先自动转换成int,计算完成后系统又转换成了integer,这是非常方便的。
使用包装类后调用parseintger函数可以快速地实现字符串和其他类型之间的转换
异常
异常是一个类。throwable error exception就是在java中定义了的。
@DS
(value = "数据源名称"),如master/slave等。如果没有类似配置没必要用这个注解
eclipse的X有时点了保存也不会自动更新,要点一下运行才会找到真正编译出错的地方。
划线的地方和画叉的地方不一定是真正错的地方,要往等号两边上下看
添加和取消注释
-
选中需要注释的一行或者多行
-
按下快捷键 ctrl + / 即可同时在每一个选中行前面添加双斜杠
另外 ctrl + shift + / 则是对选中的行添加多行注释
cron
corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
https://www.cnblogs.com/yanghj010/p/10875151.html详细语法参考文档
抽象方法和抽象类
只有方法名称,没有方法实现花括号的就是抽象方法。抽象方法是为了方便指向下面一大批同类的方法。包含抽象方法的类必须被定义为抽象类。
使用instance of来使用抽象类下面的不同实现方法
if(boolean
result = obj
instanceof
Class
)
idea全文搜索
edit-find-find in path
maven依赖手动安装
maven能够帮你下载配置文件中的很多东西,但是有一些是没有的,比如oracle收费相关的,需要自己手动下载。
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging=jar -Dfile=F:\oracle\ojdbc14-10.2.0.4.0.jar。黑体的是按照pom文件改的,地址是下载的jar包所在的文件地址。
to的地址就是maven仓库的地址,完成后在仓库的文件夹里面能找到这个jar文件就可以了
tostring
object类是所有类默认的父类,tostring是object类自带的方法。默认情况下该方法会打印出对象的地址值。因此写tostring时系统会有override注解
print函数其实是调用了类的tostring方法,因此写的时候带不带tostring效果是一样的‘’;
date类 util包
有三个比较有用的函数
获取当前系统时间
时间转换为毫秒值(转换后方便进行加减乘除计算)
毫秒值重新转换为时间
如果没有以上需求,很多时候时间还是用string来表示时间更方便
dateformat类 text包
主要作用:
日期转换为字符串,或字符串转换为日期
方法 format 、parse
parse会需要写在try catch或throw中,可由IDEA系统自动生成
固定表示法:年 月 日 分 秒 y M d H s
用法,1、new在构造方法中传入你自己想要的格式
2、调用format函数
calendar类
自带set、get等方法,方便写入年 月 日 分 秒等数据,写入后变成静态数据
system类常用方法
currenttimemillis 获取当前系统时间
arraycopy数组复制,与数组直接复制不相同的是它可以半截半截地复制
stringbuiler类
比string要节省内存空间,尤其适合用来做多个string的拼接,最常用的方法是append,这个方法可以串在一起使用
和string要做转换时直接使用方法,方法的名字就叫做tostring
intellij自动缩进排版
ctrl+alt+i
存储结构
arraylist数组查询快增删慢,在后台所有元素的变更都是通过复制原数组实现的
linklist链表增删快查询慢,可方便地改变结构,但是所有查询都需要从头遍历才能找到
vector也是数组,用的不多
java.util.set不允许存储重复的元素(不知道这个特性有什么用,估计做大数据的永远都用不到)
hashset()是一个无序集合,存取顺序会改变,但是速度非常快。
使用itetator遍历
Iterator<integer> s = HashsetDemo.iterator(); 新建iterator对象并将它指向HashsetDemo的头部
while (s.hashnext()){ 不知道这两个next函数为什么不一样,可能这个s只是指向地址
Ingeger n = s.next; 新建一个对象并指向它的内容
system.out.println(n);
}
增强for
//以前我们这样写:
void someFunction ()
{
int[] array = {1,2,5,8,9};
int total = 0;
for (int i = 0; i < array.length; i++)
{
total += array[i];
}
System.out.println(total);
}
//现在我们只需这样写(和以上写法是等价的):
void someFunction ()
{
int[] array = {1,2,5,8,9};
int total = 0;
for (int n : array)//n代表每个元素的值(不是地址),这个n可以自由命名。如果类型是一个entity,就可以这样写
for(WeeklyReportAdasCarNumStatistic s:list){}
{
total += n;
}
System.out.println(total);
}
list
list是arraylist的父类,一般都是用list<类型>=new ArrayList<>这种多态的写法,我也不知道为什么
list包含ArrayList和linklist,(vector也是一个list的子类,但是比较少用,是一个可变长度的数组)
arraylist本质上是一个数组,只不过从数组写成了一个接口
linklist本质上是一个链表
set
list和set都是collection下面的接口,但是set是不包含重复元素 的,它由key和value组成,
hashset的元素存放和取出顺序是不一致的,它的读取速度非常快
注意,hashset如果用来写自定义@data,它的eqauls函数需要重写,否则它没办法识别重复的元素。
linkedhashset也是有序的,它是数组+链表结合的结构()
retainall方法:保留两个列表的中都有的元素
ArrayList 1: [Google, Runoob, Taobao]
ArrayList 2: [Wiki, Runoob, Google]
保留的元素: [Google, Runoob]
POI提供了HSSF、XSSF以及SXSSF三种方式操作Excel。
HSSF:Excel97-2003版本,扩展名为.xls。一个sheet最大行数65536,最大列数256。
XSSF:Excel2007版本开始,扩展名为.xlsx。一个sheet最大行数1048576,最大列数16384。
SXSSF:是在XSSF基础上,POI3.8版本开始提供的支持低内存占用的操作方式,扩展名为.xlsx。
链接:https://www.jianshu.com/p/c8766986b95b)
tomcat servelet
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/ java.servlet相关的类都在以上API里说明
endswith("suffix") 用于判断字符串中某段字符串是否以指定字符或子字符串结尾。
—> bool 返回值为布尔类型(True,False)
可变长度传参:
在参数列表中写(int...a)
则生成可变长度的数组a,你传入参数的长度是多少,数组的长度就自动变成多少,不传参时长度是0
https://blog.csdn.net/dalei9243/article/details/106574074
一句话获取8天前的日期并转换成字符串
String date = DateUtil.dateStrYYYY_MM_DD(DateUtil.getDateBefore(8));