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请求,浏览器页面显示。