廖雪峰Java

Java特点:
1.跨平台语言,一次编写,到处运行。
2.内置垃圾回收机制,不用考虑内存管理。

Java SE(Standard Edition):标准版,jvm和标准库。
Java EE(Enterprise Edition):企业版,jvm和标准库及其大量API和库。
Java ME(Micro Edition):微小版。微小版jvm和微小版库。

JDK(Java Development Kit):java开发工具。
JRE(Java Runtime Environment):java运行环境。

javac:编译器,将java文件编译成class文件。
java:将class文件在虚拟机执行。

计算机内存的最小单位是字节,一个字节就是8位二进制数。

最高位的二进制数表示符号位,比如byte,1111 1111表示127;0111 1111 表示-127。

整数之间相除和取余结果一定是整数。
浮点数之间相除结果一定是小数。

short与int进行运算时,类型自动转化为范围大的数,即int。
double与int进行运算时,同理自动转化为double。

整数运算在除数为0时会报错,而浮点数运算在除数为0时,不会报错。

字符串不可变

public class Main {
    public static void main(String[] args) {
        String s = "hello";
        String t = s;
        s = "world";
        // t是"hello"还是"world"?
        // t是hello因为t的指向是hello,t的指向没有变化。
        System.out.println(t);
    }
}
public class Main {
    public static void main(String[] args) {
        String[] names = {"ABC", "XYZ", "zoo"};
        String s = names[1];
        names[1] = "cat";
        // s是"XYZ"还是"cat"?
        // s是XYZ因为s的指向是XYZ,s的指向没有变化。
        System.out.println(s);
    }
}

数组初始化后类型和大小都不可变

public class Demo {
    public static void main(String[] args) {
        int[] ns = { 68, 79, 91, 85, 62 };
        // Arrays.toString是输出数组的方法
        System.out.println(Arrays.toString(ns));
    }
}

switch要注意break才会退出匹配

public class Main {
    public static void main(String[] args) {
        int option = 2;
        switch (option) {
        case 1:
            System.out.println("Selected 1");
        case 2:
            System.out.println("Selected 2");
        case 3:
            System.out.println("Selected 3");
        default:
            System.out.println("Selected other");
        // 输出:Selected 2 Selected 3 Selected other
        // 原因:没有break会执行后续语句
        }
    }
}

while循环与do-while循环区别是do-while就算不符合条件也会执行一次循环。

for循环与foreach循环区别是for循环通过下标访问元素,也可以获取下标;foreach循环直接访问元素,无法获取下标。

break是跳出最近的一层循环;continue是跳过最近的一次循环。

正序倒序循环数组

public class Demo {
    public static void main(String[] args) {
        int[] ns = {1, 4, 9, 16, 25};
        // 倒序打印数组元素:
        for (int i = ns.length - 1; i >= 0; i--) {
            System.out.print(ns[i] + ",");
        }
        System.out.println();
        // 正序打印数组元素:0~(n-1)
        for (int i = 0; i < ns.length; i++) {
            System.out.print(ns[i] + ",");
        }
        System.out.println();
        for (int i = 0; i <= ns.length - 1; i++) {
            System.out.print(ns[i] + ",");
        }
    }
}

引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方(因为指向同一个对象嘛)。

// 引用类型参数绑定
public class Main {
    public static void main(String[] args) {
        Person p = new Person();
        String[] fullname = new String[] { "Homer", "Simpson" };
        p.setName(fullname); // 传入fullname数组
        System.out.println(p.getName()); // "Homer Simpson"
        fullname[0] = "Bart"; // fullname数组的第一个元素修改为"Bart"
        System.out.println(p.getName()); // "Homer Simpson"还是"Bart Simpson"?
    }
}

class Person {
    private String[] name;

    public String getName() {
        return this.name[0] + " " + this.name[1];
    }

    public void setName(String[] name) {
        this.name = name;
    }
}

子类的构造函数第一行自动调用父类的无参构造函数。

子类类型转型为父类类型,即向上转型。
父类类型强制转型为子类类型,即向下转型。类型不一致会报错,可以通过instanceof判断对象类型。

继承是is关系,组合是has关系。

@Override注解是重写检查的作用,错误会编译报错。

多态的特性就是,运行期才能动态决定调用的子类方法。

final类不能继承,属性不能修改,方法不能重写。

接口是比抽象类还抽象,所以只定义方法名,没有属性没有实现,由子类实现接口方法。

private:同一类下
default:同一包下
protected:不同包子类
public:所有类

编码
ASCII:占用一个字节,最高位始终为0,编码范围是0-127。
GB2312:占用两个字节,汉字。
Shift_JIS:日文。
EUC-KR:汉语。
Unicode:两个或者更多字节表示,全球统一编码。
UTF-8:变长字节编码,容错性高。

StringBuilder线程不安全,StringBuffer线程安全。

StringBuilder连接分隔符结尾带分隔符,StringJoiner连接分隔符结尾不带分隔符且支持添加首尾字符。

创建新对象时,优先选用静态工厂方法而不是new操作符,即包装类型.valueOf()方法。

enum类属于单例,所以可以用==进行比较。

BigInteger表示任意大小的整数。
BigDecimal表示任意大小且精度准确的浮点数。

BigDecimal加法、减法、乘法精度不会丢失,除法可能会丢失精度,所以必须要保留n位小数。

BigDecimal的equals方法是比较大小和精度相等,compareTo是比较大小忽略精度。

函数式编程,又称Lambda计算

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量。

Lambda表达式

输入->输出

(s1, s2) -> s1.compareTo(s2);
@FunctionalInterface

注解单方法的接口,如Comparator接口的compare抽象方法、Callable接口的call抽象方法。

方法引用

如果某个方法签名和接口恰好一致,就可以直接传入方法引用。

String::compare相当于compareTo(String this, String o),所以一个参数也可以匹配。

Stream流

惰性求值

Function
@FunctionalInterface
public interface Function<T, R> {
    // 将T类型转换为R:
    R apply(T t);
}
Predicate
@FunctionalInterface
public interface Predicate<T> {
    // 判断元素t是否符合条件:
    boolean test(T t);
}
BinaryOperator
@FunctionalInterface
public interface BinaryOperator<T> {
    // Bi操作:两个输入,一个输出
    T apply(T t, T u);
}
常用操作

转换操作:map()filter()sorted()distinct()

合并操作:concat()flatMap()

并行处理:parallel()

聚合操作:reduce()collect()count()max()min()sum()average()

其他操作:allMatch(), anyMatch(), forEach()

Web开发主要基于Servlet开发

HttpServletRequest和HttpServletResponse封装http请求和响应。

浏览器发起请求过程

1.与服务器建立tcp连接。
2.发送http请求。
3.响应http请求,浏览器页面显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值