提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
记录java的知识点
java基础知识的知识点
JDK和JRE的区别:
JDK:提供了 Java 的开发环境和运行环境。
JRE:提供了java的运行环境。
八大基本数据类型:
byte、boolean、char、short、int、float、long、double
【小知识:String属于引用类型】
内存分配
堆:是所有线程共享的区域,用于存放实例化的对象,即new产生的数据
方法区:是所有线程共享的区域,用于存放类信息、常量、静态变量等
常量池:用于存放程序的全部常量
JVM:
在java堆的内存中,根据垃圾回收的机制不同分为新生代和老年代比例为 1 :2
新生代:新时代又划分为Eden 、To、From其比例为8 :1 :1 ,其中垃圾回收采用分代复制算法
当有一个对象被创建了,对象太大了,就会直接从Eden到老年代内存,会将Eden移动到To再移动
到From达到15次后就会进入老年代内存
老年代:
老年代的比新生代的cg效率要慢
【小知识:还有一个元空间,使用的是本地内存】
== 和equals的区别:
1、== 可以判断基础类型是否相等
2、equals 可以判断内置的引用类型的值是否相等(不能用于判断自己创建两个对象,可以重写equals和
hashCode或者使用instanceof关键字来)
【小知识:hashCode相同不一定equals就相同如同4+5=9 6+3=9 一样的道理】
final关键字的使用:
被final修饰类,该类不能被继承
被final修饰的方法,该方法不能被重写
被final修饰常量,该常量必须初始化,初始化后的值不能被修改
Math. round()的注意事项(是一个为伪随机):
正数的且大于等于0.5向上取整
负数的0.5舍去
String、StringBuffer、StringBuilder三者的区别:
String是不可变的(用字符串拼接的形式,在编译出来的class文件中是以StringBuilder来拼接字符串的)
StringBuffer和StringBuilder的区别,前者是线程安全的后者是线程不安全的
new String() 和 "" 的区别:
前者放在堆内存里面、后者放在常量池里面
关于字符串的反转:
StringBuilder或者StringBuffer的reverse()方法可以将字符串反转
String类是常用方法:
indexOf() 返回指定的字符串索引
charAt() 返回指点索引的字符串
replace() 字符串替换
trim() 去除字符串两端的空白
split() 字符串切割
length() 返回字符串长度
toLowerCase() 英文大写转小写
toUpperCase() 英文小写转大写
substring() 字符串截取
equals() 字符串比较
普通类和抽象类和接口:
1、普通类不能有抽象方法;抽象类可以包含抽象方法
2、抽象类不能直接实例化;普通类可以直接实例化
3、抽象类不能被final修饰
4、继承抽象类用extends;继承接口用implement
5、抽象类可以有构造函数;接口不可以
6、继承接口可以继承多个接口;继承抽象类只能继承一个
7、接口里的方法的修饰符默认是public;抽象类里的方法可以是任意访问修饰符、
8、接口里的常量必然是public static final
【小知识:抽象类里面不一定包含抽象方法,抽象方法一定在抽象类里面】
IO流:
功能上区分:输入流(input)和输出流(output)
按类型区分:有字节流和字符流
(BIO)为阻塞IO、(NIO not block io)为非阻塞IO、(NIO new io)为多路复用IO,多路复用IO用户需要主动
读取数据、(AIO)为异步非阻塞IO,AIO内核会帮用户读取数据;
Files的常用方法
exists() 检测文件路径是否存在
createFile() 创建文件
createDirectory() 创建文件夹
delete() 删除一个文件或文件夹
copy() 复制文件
move() 移动文件
size() 查看文件个数
read() 读取文件
write() 写入文件
容器Collection和Map
Collection
List
ArrayList:是有序的,采用数组的数据结构
LinkedList:
Vector:
Stack:
Set
HashSet:
LinkedHashSet:
TreeSet:
Map
HashMap:是无序的,采用一个单项向链表和数组
LinkedHashMap:是有序的,采用一个双向链表用于保持迭代顺序,继承HashMap和Map
TreeMap:是一个有序的key集合,它是通过红黑树实现的,可序列化
ConcurrentHashMap:是无序的,是才用链表上加锁来实现同步,且判断如果节点数量是大于8,就将链表
转化成红黑树(在性能高)
ConcurrentSkipListMap:是有序,通过跳表实现的,对于高并发程序在数据量一定的情况下,并发的
线程越多越能体现出它的优势
Hashtable:是无序的,是通过在每个方法上加Synchronized来实现同步的所以线程是安全的
Stream
这个流是指集合的操作流,可以将List转换为Map,也可将Map转换为List集合的一个工具类,这个也是java8
中新添加的一个特性,这里就不详细的描述了,但是提供几个常用的方法:
Map<Long, UserEntity> userServiceMap = userService.list().stream().collect(Collectors.toMap(UserEntity::getSysUserId, x -> x));
List<Long> ids = areaService.list().stream().map(AreaEntity::getAreaId).toList();
---------------------------------------2023-03-09 17:36:10-------------------------------------------------------------------------------
Date
时间类,这个时间类已经被废弃了许多方法了,就介绍简单又好用的方法吧*/
/** 返回当前时间*/
Date nowDate = new Date();
/** 返回当前时间的字符串且时间格式为 2023-03-09 17:36:54 */
String nowDateString = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
Calendar
日历类,也是关于时间的,介绍几个食用方式【这样我们解决日期的++ -- 的问题】
/** 返回当前时间*/
Calendar startTime = Calendar.getInstance();
/** 返回当前时间的前8天数据【就是按当前时间过去推8天】*/
startTime.set(Calendar.DATE, startTime.get(Calendar.DATE) - 8);
/** 返回当前时间的前8天数据【就是按当前时间未来推8天】*/
startTime.set(Calendar.DATE, startTime.get(Calendar.DATE) + 8);
/**
* Calendar.DATE 日 Calendar.MONTH 月 Calendar.YEAR 年
* 如:用Calendar.MONTH 往过去推8个月【剩下的就不举栗子了】
* startTime.set(Calendar.DATE, startTime.get(Calendar.MONTH) + 8);
*/
---------------------------------------2023-03-013 09:36:10-------------------------------------------------------------------------------
Optional
java8中的新特性,一个判空的工具类,简单的介绍一下食用方法
非Optional时写法:
if(user!=null){
xxxx
}
Optinoal时写法:
Optional.ofNullable(user).ifPresent(x->{});
总结
立个小目标【菜鸟教程】:每天加一点