Java 数组


int[] a = new int[3];
int[] a = new int[]{1, 2, 3};
int[] a = {1,2,3}

冒泡排序算法


for(int i = 0; i < arr.length - 1; i ++) {
    // 每趟确定一个元素的最终位置
    for(int j = 0; j < arr.length - i - 1; j ++) { 
        if(arr[j] > arr[j+1]) {
            tmp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = tmp;
        }
        
    }
}

Java 字符串


String str = "abc";  // 字符串是常量,它们的值不能被创建后改变

// 等价
char str[] = {'a', 'b', 'c'};
String str = new String(str);

Java 多态

1、多态的三个必要条件:继承;重写;向上转型。

2、


public class A {

}

public class B extends A {

}

A a = null;  // 声明一个对象(例如员工对象)
a = new B(参数1, 参数2);  // 向上转型,例如创建一个技术员工对象(子类)

// 参数1, 参数2 直接传入 B 的构造方法

super(参数);  // 在调用父类的构造方法时,传入该参数

super.func();  // 调用父类的构造方法

Java 抽象类和接口

1、万物皆对象,所有的对象都是借助于类来描绘的。但是反过来讲,也不是说所有的类都是用来描绘对象的。如果一个类中并没有包含足够的信息来描绘一个具体的对象,那么这样的类称为抽象类。

2、抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底,则可以提炼出一种更加特殊的“抽象类” —— 接口。

3、抽象类的相关代码实现


public abstract class Animal{
    // Define abstract method
    public abstract void shout();
}

public class Cat extends Animal() {
    @Override
    public void shout() {
        System.out.println("Hello World");
    }
}

public class Test {
    public static void main(Sting[] args) {
        // Abstract classes cannot be instantiated
        // Animal animal = new Animal();
        Animal animal = new Cat();
    }
}

4、抽象类的语法约束

(1)抽象类不能背包实例化,也就是不能用 new 关键字去产生对象。

(2)抽象类中不一定包含抽象方法。

(3)抽象类中的抽象方法只是声明,并不给出方法的具体实现(功能)。

(4)构造方法和用 static 修饰的方法不能声明为抽象方法。

(5)抽象类的子类必须给出抽象类中的抽象方法的具体实现,但是若该子类也是抽象类,则不必如此。

(6)子类继承父类(抽象类)时,必须重写父类的所有抽象方法。

5、接口的代码实现


public interface USB {
    int L = 10;
    int W = 24;
    void service();
}

public class UDisk implements USB {
    pubic void service() {
        System.out.println("Hello World");
    }
}

// 默认
[修饰符] interface 接口名 {
    [public] [static] [final] 数据类型 常量名 = 常量值;
    [public] [abstract] 返回值类型 方法名 ([参数列表]);
    [public] default 返回值类型 方法名 ([参数列表]) {};
    [public] static 返回值类型 方法名 ([参数列表]) {};
}

public interface B {
    public default void c(){};
}

public class A implements B {

} 

// 向上转型
B b = new A();
b.c();

6、接口的语法约束

(1)当类实现接口的时候,类要实现接口中的所有抽象方法。否则,必须把这个声明为抽象类。

(2)允许一个类实现多个接口。

(3)接口中的方法除了包含抽象方法外,还包含默认方法和静态方法,默认方法和静态方法都可以拥有方法体。并且,静态方法可以直接通过 “接口.方法名” 来调用。因为接口同样不能被实例化。

关于默认方法:简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。我们即只需在方法名前面加个 default 关键字即可实现默认方法。

(4)一个类在继承一个类的同时,还可以实现接口。但是,此时 extends 关键字必须位于 implements 关键字之前。

7、为什么 Java 制定了接口?

接口的出现可以很好的解决 Java 不支持多重继承的问题。多重继承指的是一个类可以同时继承多个类,比如A类继承自B类和C类。


public class a implements b,c

8、抽象类和接口的不同

(1)抽象类中可以定义构造方法,接口中不能定义构造方法。

(2)接口中的成员全都是 public。

(3)抽象类中可以定义成员变量,接口中定义的成员变量实际上都是常量(只能被赋值一次,常量多大写)。

(4)一个类只能继承一个抽象类,一个类可以实现多个接口。

9、内存分布

Java 常用 API

1、API:Application Programming Interface.

2、使用 String 对象存储字符串


String s = new String("amber");

s.length();  // 获取字符串的长度

s.equals("ambow");  // 比较存储在两个字符串对象中的内容是否一致

s.concat(str)  // 将一个字符串连接到另一个字符串后

s.toUpperCase()  // 将字符串中的所有字符全部转换成大写

s.toLowerCase()  // 将字符串中的所有字符全部转换成小写

s.trim()  // 去除字符串中首尾的空格

s.substring(0,1); s.substring(1);  // 提取字符串

s.replace("source", "target");  // 替换字符串

s.indexOf("select");  // 用于返回字符串中在指定字符中首次出现的索引位置,若能找到,则返回索引值,否则返回 -1

// StringBuffer 是线程安全的
StringBuffer str = new StringBuffer("HelloWorld");
StringBuffer str = new StringBuffer();
Scanner input = new Scanner(System.in);
str.append(input.next());

StringBuilder str = new StringBuilder("HelloWorld");
StringBuilder str = new StringBuilder();
str.toString();  // 转换为 String 类型
str.append();  // 追加字符串
str.insert(0,"str");  // 插入字符串

equal() 方法和 == 的差别?

在引用数据类型中, == 的作用用于比较其内存地址,而 equal() 方法用于比较其内容。


String str1 = "mendax";  // 引用,指针指向同一个地址
String str2 = "mendax";
String str3 = new String("mendax");
String str4 = new String("mendax");

// 结果
str1 == str2
str1 != str3
str3 != str4


Date date = new Date();
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
String time = dateFormat.format(date);

String str = Integer.toString(x);  // 整型转换成字符串
Striing str = x + "";  // 整型转换成字符串
int x = Integer.parseInt(str);  // 字符串转化成整型
double x = Double.parseDouble(str);  // 字符串转化成double类型

// 自动拆箱
Integer x = new Integer(1024);
int y = x;

// 自动装箱
int x = 1024;
Integer y = x;

集合框架快速入门

1、Java 集合类型有 Collection 和 Map。Collection 有 List(ArrayList、LinkedList) 和 Set(HashSet、TreeSet)。Map 有HashMap和TreeMap。

2、List 接口存储一组不唯一、有序的对象。Set 接口存储一组唯一、无序的对象。例如向 Set 集合中添加两个相同的元素,而后添加的元素会覆盖前面添加的元素,即在 Set 集合中不会出现相同的元素。

3、ArrayList 实现了长度可变的数组,在内存中分配连续的空间。LinkList采用链表存储方式。

4、HashSet 是按照 Hash 算法来存取集合中的元素,因此具有很好的存取和查找性能。除此之外,不保证元素的排列顺序,现排列顺序可能与添加顺序不同,现排列顺序也有可能会发生变化。HashSet 是不同步的,如果多个线程同时访问或修改一个 HashSet,则必须通过代码来保证其同步。

5、Map 是一种键值集合,用于保存具有映射关系的数据。HashMap 同样不保证顺序。键不允许重复,但是值可以重复。若存入了两个相同的键,则保存最后一个存入的键值对。

6、泛型本质上是提供类型的“类型参数”,也就是参数化类型。泛型集合可以约束集合内的元素类型。


T代表这是一个类型 Type
E代表这是一个元素 Element
K代表这是一个键 Key
V代表这是一个值 Value

Java 文件流


// 图片拷贝

import java.io.*

File srcPath = new File("srcPath");
File destPath = new File("destPath");
FileInputStream fis = new FileInputStream(srcPath);
FileOutputStram fos = new FileOutputStream(destPath);
Byte[] bt = new Byte[1024];
while(fis.read(bt) != -1) {
    fos.writer(fos);
}
fos.close;
fis.close;

// 文件写入

import java.io.*

File f = new File("Path");
FileOutputStream fop = new FileOutputStream(f);
OutputStreamWriter writer = new OutputStreamWriter(fop);
writer.append("Hello WOrld.");
writer.close();
fop.close();