java学习Day01,每天积累一点,就离成功近一点。
cmd
基本命令
- 盘符+冒号 (E:)切换磁盘
- dir 查看当前路径下所有内容,包含隐藏文件
- cd 目录 进入单级目录
- cd 目录\目录\ 进入多级目录
- cd .. 回退到上级目录
- cls 清屏
- exit 退出命令窗口
环境变量
引入小例子
用cmd命令在任意目录下打开QQ,你会吗?
要在任意目录下打开某个文件,你就必须将这个文件所在路径定义 到 环境变量的系统变量的PATH下,这样你的计算机就可以找到该文件了!
java
jdk后带有LTS,表示 长期支持版本 java 8 11 17
jdk 目录
- bin 存放各种工具命令 比较重要的有javac和Java
- javac命令编译 javac HelloWord.java --->.class
- java命令 运行 java HelloWord
- conf 存放各种配置文件
- lib 存放jar包
java跨平台
编译型语言
c语言就是编译型语言,直接经过编译器编译为机器语言,可以直接在计算机上执行,但c语言移植到其他平台后,都要重新编译,因为每个操作系统的类库、API等都是不同的。所以编译型语言的移植性差,但效率高。
解释型语言
解释器:直接执行用编程语言编写的程序。
在执行程序时,通过解释器一条一条的进行解释,解释一条执行一条,效率较低,但可移植性好。
java是混合型语言
java源码先经过编译器编译为 字节码 .class 文件,在把 .class文件 放到JVM虚拟机里运行,在JVM里, 字节码文件被逐条解释为机器语言,逐条解释执行。
JRE、JDK
JDK :JVM 、核心类库 、开发工具
JRE : java运行环境,包含JVM 、核心类库、运行工具
#黑马程序员截图
隐式转换
规则:取值范围小的,和取值大的进行运算,取值范围小的数据类型会自动转换为范围大的进行运算。
#byte short char 三种类型的数据在进行运算时,都会直接提升为int
数据类型取值范围大小
byte--< short--< int--< long--< float--< double
Object
java中的顶级父类,只有无参构造。
任意一个类都继承Object类,无参、有参构造都执行了Object的无参构造,super();
tostring
打印对象时,底层会调用对象的tostring方法
浅拷贝与深拷贝
浅拷贝
基本数据类型直接拷贝 变量值
字符串常量池引用 拷贝变量的地址值
其他数据类型,如数组,会直接指向数组,造成两个对象 共同使用一块内存数据
缺点:造成两个对象 共同使用一块内存数据
深拷贝
基本数据类型直接拷贝 变量值
字符串常量池引用 拷贝变量的地址值
其他数据类型,如数组,会新建一个数组,把数据都拷贝到新数组中,各用各的。
BigDecimal
当小数位数超过52时,会造成精度丢失。
常用方法
构造函数 BigDecimal(String val) 使用字符串构造一个BigDecimal对象,不会造成精度丢失。
创建对象后,值不可变更。
正则表达式
不全: 建议到JDK帮助文档,StringAPI找matches()方法,里面有全面的正则规则。
#黑马程序员的截图
单独一个&符号,就只表示&符号
两个&&才表示并集
JDK8时间类
分为四个部分
时间类
ZoneId时区 Instant时间戳(当前时间的数字) ZonedateTime 带时区的时间
日历类
Loacaldate 年月日 LocalTime 时分秒 LocalDateTime 年月日 时分秒
DateTimeFormatter 日期格式化类
用于时间格式化和解析
工具类
ZoneId时区 Instant时间戳(了解)
//一、获取的是标准时间,需要+8个小时
Instant now = Instant.now();
now.plusSeconds(60*60*60);
//二、指定时区
ZoneId zoneId = ZoneId.of("Asia/Shanghai");
ZonedDateTime zonedDateTime = Instant.now().atZone(zoneId);
LocalDateTime(重要)
//获取的是当地时区的时间,不用加8小时了
LocalDateTime.now()
包装类
存在原因:
集合:集合不允许操作基本数据类型
Object(超级父类)只能接收对象类型
数据转换:提供将String型数据变为基本数据类型的方法。Integer.pareInt
Integer.valueof() 特殊
使用 equals 方法来比较两个包装类对象的值。
Integer包装类定义了一个静态内部类,表示缓存区,在这个缓存区里定义了 【-128 +127】之间的int数据,
当使用 valueOf方法时,如果在这个范围内,直接从缓存取,不会新建对象。
所以比较包装类型数据时,建议使用equals()方法
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
try {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
// If the property cannot be parsed into an int, ignore it.
}
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {}
}
Arrays数组工具类
查看JDK文档
Lambda表达式 ()->{}
一个参数,()可删除
一条语句,{}可删除
作用:简化匿名内部类(声名了函数式接口)的书写
函数式接口
有且仅有一个抽象方法的接口叫做函数式接口,@FunctionalInterface注解标注
函数式编程
传统的面向对象:先创建对象,让对象做事情。
函数式编程 强调做什么,关注的是方法体,而不是谁去做,
匿名内部类例子
Integer [] integers = {1,2,3,8,10};
Arrays.sort(integers, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
> 代码解释
{
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
} 表示没有名字的类
Comparator<Integer>表示这个类实现了该接口
原来创建一个对象是这样:new 类名 (); new的是没有名字的类的对象
但这个类没有名字,那我们就以接口作为类名,把 ; 写在无名类的}后
这样就符合格式了
改造lambda
Arrays.sort(integers, ( o1, o2)-> {
return o1-o2;
});
反编译
javap 字节码
regex$1是匿名内部类的名字
D:\IDEACode\SpringMvc\SpringMvc\target\classes\collections\list>javap regex$1.class
Compiled from "regex.java"
final class collections.list.regex$1 implements java.util.Comparator<java.lang.Integer> {
collections.list.regex$1();
public int compare(java.lang.Integer, java.lang.Integer);
public int compare(java.lang.Object, java.lang.Object);
}