Java---入门

142 阅读5分钟

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

image.png

当小数位数超过52时,会造成精度丢失。

常用方法

构造函数 BigDecimal(String val) 使用字符串构造一个BigDecimal对象,不会造成精度丢失。
创建对象后,值不可变更。

正则表达式

不全: 建议到JDK帮助文档,StringAPI找matches()方法,里面有全面的正则规则。

#黑马程序员的截图
image.pngimage.png

image.png
单独一个&符号,就只表示&符号
两个&&才表示并集

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注解标注

函数式编程

传统的面向对象:先创建对象,让对象做事情。
函数式编程 强调做什么,关注的是方法体,而不是谁去做,

匿名内部类例子

image.png
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);
}