Java

Hello Jvav.

数据类型

常量

类型
整数常量 所有的整数 0,1-99
小数常量 所有的小数 0.0,-1.11
字符常量 单引号引起来,只能写一个字符,必须有内容 ‘a’,’ ‘,’.’,‘中’
字符串常量 双引号引起来,可以写多个字符,也可以不写 “”,“a”,“你好”
布尔常量 只有true和false true, false
空常量 只有null,不能直接打印 null

变量

数据类型 关键字 内存占用 取值范围
字节型 byte 1个字节 -128~127 byte+byte时会被转化为int
短整型 short 2个字节 -32768~32767 同上相加会被转化为int
整型 int(默认) 4个字节 -2^31~2^31-1
长整型 long 8个字节 -2^63~2^ 字符后必须以’l’或’L’结尾,如:long num=300000L
单精度浮点数 float 4个字节 1.4013E-45~3.4028E+38 同上加’f’或’F’
双精度浮点数 double(默认) 8个字节 4.9E-324~1.7977E+308
字符型 char 2个字节 0-65535 同byte,相加会被转化为int
布尔类型 boolean 1个字节 true&false

转换

赋值时用不同的数值类型如果允许使用会自动转换类型,如:double k=0.5F;(将float赋值给double k)

强转:int k=(int)1.5;(把double 1.5强转为int 1然后赋值给int k)

方法(函数)

定义方法public static 返回类型 方法名(传入的值){具体方法}

1
2
3
public static int f1(int a){ //public表示公开,static大概约等于func?
    return a;
}

方法重载

名称相同输入不同的函数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public class Main {
    public static void main(String[] args) {
        int a=0;
        System.out.println(sum(1.0f,4.0f,5.0f));
    }
    public static int sum(int a,int b){
        return a+b;
    }
    public static int sum(int a,int b,int c){
        return a+b+c;
    }
    public static float sum(float a,float b){
        return a+b;
    }
    public static float sum(float a,float b,float c){
        return a+b+c;
    }
}

if,else,swich

与c类似

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
if (){

}else if (){

}else{

}


swich(){
	case 常量1:
	语句1;
	break;
	
	case 常量2:
	语句2;
	break;
	
	default:
	break;
}

循环(for,while,do…while)

与c相同

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
for (;;){

}

while (条件){

}

do{

}while(条件)

for-each

1
2
3
for (int i : arr) {
    System.out.println(arr[i]);
}

等同于

1
2
3
for i:=range arr{
    fmt.println(arr[i])
}

数组

静态数组(指定内容)

定义数组:数据类型[] 数组名 = new 数据类型[] {数据}

或者简写为:数据类型[] 数组名 ={数据}

1
2
int[] arr = new int[]{0,1,2,3,4,5,6,7,8,9};
int[] arr = {0,1,2,3,4,5,6,7,8,9};

动态数组(指定长度)

定义数组:数据类型[] 数组名 = new 数据类型[数组初始长度];

1
int[] arr = new int[10];

其他

假设数组名为arr

功能 写法 描述
长度 arr.length 得到arr的长度
转化为字符串打印 Arrays.toString(arr); 是java.util.Arrays的方法,返回一个字符串
查询 Arrays.asList(arr).contains(val) 同上包,查询数组arr中是否包含val返回boolean
合并 ArrayUtils.addAll(arr1, arr2) 合并数组arr1,arr2返回数组
倒置 ArrayUtils.reverse(intArray) 倒置数组无返回
删除 ArrayUtils.removeElement(intArray, val) 返回删除后数组

String

创建

1
2
3
4
5
6
//直接创建方式
String str1 = "abc";

//提供一个 字符数组 参数来初始化字符串
char[] strarray = {'a','b','c'};
String str2 = new String(strarray);

字符串操作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int len = str.length();//获取长度

str1=str1.concat(str2);//使str1+=str2,当然也可以直接这么写

int idx = str.indexOf(str2);//字符串str2在str中首次出现的位置,从0开始计数,没找到就返回-1

int idx = str.lastIndexOf(str2);//字符串str2在str中最后一次出现的位置,从0开始计数,没找到就返回-1

char thischar = str.charAt(i);//等于Go中的str[i]

String substr1 = str.substring(i);//同Go中的str[i:]
String substr2 = str.substring(2,4);//同Go中的str[i:j]

String str1 = str.trim();//去首尾空格

String str=str.replace(char oldChar, char newChar)
String str=str.replace(String oldChar, String newChar)//使字符串中的oldChar全部替换为newChar

//判断字符串始末的函数
String str = "abcde";
boolean res = str.startsWith("ab");//res为true
boolean res = str.StartsWith("bc",1);//res为true
boolean res = str.endsWith("de");//res为true

//判断是否相等
String str1 = "abcde";
String str2 = str1;//字符串str1和str2都是一个字符串对象
String str3 = "ABCDE";
boolean isEqualed = str1.equals(str2);//返回true
boolean isEqualed = str1.equals(str3);//返回false
boolean isEqualed = str1.equlasIgnoreCase(str3);//不在意大小写,所以返回true

String str1 = str1.toUpperCase();//转换为大写
String str3 = str2.toLowerCase();//转换为小写

//分割字符串
String[] res = str.split(" ");//res = {"Hello","World","A.B.C"}
String[] res = str.split(" ",2);//res = {"Hello","World A.B.C"}
String[] res = str.split("\\.");//res = {"Hello World A","B","C"}
String[] res = str.split(" |\\.");//res = {"Hello World A","B","C"}

byte[] Str2 = Str1.getBytes();//转换为byte数组

类型转换

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
Stringint型:
//第一种
int i = Integer.parseInt(String str)
//第二种
int i = Integer.valueOf(s).intValue();

Stringlong型:
long l = Long.parseLong(String str);

Stringdouble型:
double d = Double.valueOf(String str).doubleValue();//doubleValue()不要也可
double d = Double.parseDouble(str);

intstring型:
//第一种
String s = String.valueOf(i)
//第二种
String s = Integer.toString(i);
//第三种
String s = "" + i;

StringBuilder

StringBuilder可以理解为可变的string即对它的操作可以可以直接保留不需要用自己去接收

创建StringBuilder sb= new StringBuilder();

StringBuilder sb= new StringBuilder("abc");

添加sb=sb.append("aaa");

sb=sb.append('a');

删除指定位置字符sb.delete(0,1);//sb=sb[1:]

sb.deleteCharAt(0);//删除sb[0]

翻转sb.reverse();

替换sb.replace(0,1,"haha~");//将sb[0:1]替换为haha~

插入sb.insert(1,">.<");

sb.insert(1,'.')

sb.insert(1,2)

当前容量sb.capacity();

长度sb.length();

str.setLength(4);//设置长度为4

转变为Stringsb.toString()

Collection集合

List接口

定义

  • 一个元素存取有序的集合
  • 带有索引(与数组的索引是一个道理)
  • 可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

常用子类

  • ArrayList集合
  • LinkedList集合

常用方法

1.增加元素

  • add(Object e):向集合末尾处,添加指定的元素
  • add(int index, Object e):向集合指定索引处,添加指定的元素,原有元素依次后移

2.删除元素删除

  • remove(Object e):将指定元素对象,从集合中删除,返回值为被删除的元素
  • remove(int index):将指定索引处的元素,从集合中删除,返回值为被删除的元素

3.替换元素方法

  • set(int index, Object e):将指定索引处的元素,替换成指定的元素,返回值为替换前的元素

4.查询元素方法

  • get(int index):获取指定索引处的元素,并返回该元素

实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
List<String> list = new ArrayList<String>();
//1,添加元素。
list.add("小红");
list.add("小梅");
list.add("小强");

//2,插入元素。插入元素前的集合["小红","小梅","小强"]
list.add(1, "老王"); //插入元素后的集合["小红","老王","小梅","小强"]

//3,删除元素。
list.remove(2);// 删除元素后的集合["小红","老王","小强"]

//4,修改元素。
list.set(1, "隔壁老王");// 修改元素后的集合["小红","隔壁老王","小强"]

Iterator<String> it = list.iterator();
for (int i = 0; i < list.size(); i++) {
    String str = list.get(i);
    System.out.println(str);
}

ListIterator迭代器

ListIterator是一种访问list的方法,另一个常用的迭代器是Iterator,因为Iterator在list的迭代中可能会出错所以用ListIterator。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 引入 ArrayList 和 Iterator 类
import java.util.ArrayList;
import java.util.Iterator;

public class RunoobTest {
    public static void main(String[] args) {

        // 创建集合
        ArrayList<String> sites = new ArrayList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Zhihu");

        // 获取迭代器
        Iterator<String> it = sites.iterator();

        // 输出集合中的所有元素
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

ArrayList

定义ArrayList<Integer> arr=new ArrayList<>(); ArrayList<String> arr2=new ArrayList<>();

添加arr.add(1);//在末尾添加一个'1’,有一个bool类型的返回值表示是否添加成功,可以省略

arr.add(0,2);//在arr[0]处添加添加'2’,后移arr[1]之后的数,有一个bool类型的返回值,比如越界了就会返回false

访问srr.get(2)//返回arr[2]

修改arr.set(2,99)//将arr[2]替换为99返回arr[2]替换前的值

删除arr.remove(1)//移除arr[1],返回删除前的arr[1],如果越界了会编译失败

长度arr.size()//len(arr)

*ArrayList可以被for-each遍历

LinkedList(链表)

创建LinkedList<String> sites = new LinkedList<String>();//创建一个名为sites的string类型的链表

添加

  • sites.add("Google");//在尾部添加"Google"
  • sites.add(1,"wiki");//在add[1]的位置添加"wiki"
  • sites.addFirst("Wiki");//在头部添加"wiki"
  • sites.addLast("Wiki");//在尾部添加"wiki"

set接口

定义:

  • 不允许存储重复的元素
  • 没有索引,没有带索引的方法,也不能使用普通的for循环遍历

HashSet

定义

  • 不允许存储重复的元素
  • 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
  • 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
  • 底层是一个哈希表结构(查询的速度非常快)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public static void main(String[] args) {
//创建
        Set<Integer> set = new HashSet<>();
    
//使用add方法往集合中添加元素
        set.add(1);
        set.add(3);
        set.add(2);
        set.add(1);
    
//使用迭代器遍历Set集合
        Iterator<Integer> it = set.iterator();
        while(it.hasNext()){
            Integer n = it.next();
            System.out.println(n);//1,2,3 无序且不重复
        }
    }

做到不重复的方法:Set集合在调用add方法的时候,add方法会调用元素hashCode方法和equals方法,判断元素是否重复

Map接口

Map<key,value>

创建

Map<String,int> map = new HashMap<String,String>();创建一个名为map,索引为string,值为int的Map

添加

map.put("a", 1);//当给Map中添加元素,会返回key对应的原来的value值,若key没有对应的值,返回null

获取

int en = map.get("a");//根据指定的key获取对应的value

删除

int value = map.remove("a");//根据key删除元素,会返回key对应的value值

遍历键找值

1
2
3
4
5
6
7
8
Iterator<String> it =keySet.iterator();
		while(it.hasNext()){
			//得到每一个key
			String key = it.next();
			//通过key获取对应的value
			int value = map.get(key);
			System.out.println(key+"="+value);
		}

Entry键值对

Entry是Map接口中提供的一个静态内部嵌套接口,在Map类设计时,提供了一个嵌套接口:Entry。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

方法

  • getKey()方法:获取Entry对象中的键
  • getValue()方法:获取Entry对象中的值
  • entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//键值对的创建与遍历
public class MapDemo {
	public static void main(String[] args) {
		//创建Map对象
		Map<String, String> map = new HashMap<String,String>();
		//给map中添加元素
		map.put("邓超", "孙俪");
		map.put("李晨", "范冰冰");
map.put("刘德华", "柳岩");
		//获取Map中的所有key与value的对应关系
		Set<Map.Entry<String,String>> entrySet = map.entrySet();
		//遍历Set集合
		Iterator<Map.Entry<String,String>> it =entrySet.iterator();
		while(it.hasNext()){
			//得到每一对对应关系
			Map.Entry<String,String> entry = it.next();
			//通过每一对对应关系获取对应的key
			String key = entry.getKey();
			//通过每一对对应关系获取对应的value
			String value = entry.getValue();
			System.out.println(key+"="+value);
		}
	}
}

发牌模拟(map、arrlist实现)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

/*
 * 斗地主洗牌发牌排序
 */
public class Main {

    public static void main(String[] args) {

        //准备花色
        ArrayList<String> color = new ArrayList<String>();
        color.add("♠");
        color.add("♥");
        color.add("♦");
        color.add("♣");

        //准备数字
        ArrayList<String> number = new ArrayList<String>();
        Collections.addAll(number,"3","4","5","6","7","8","9","10","J","Q","K","A","2");

        //定义一个map集合:用来将数字与每一张牌进行对应
        HashMap<Integer, String> map = new HashMap<Integer, String>();

        int index = 0;
        for (String thisNumber : number) {
            for (String thisColor : color) {
                map.put(index++, thisColor+thisNumber);
            }
        }

        //加入大小王
        map.put(index++, "小☺");
        map.put(index++, "大☻");

        //一副54张的牌 ArrayList里边为0-53的数的新牌
        ArrayList<Integer> cards = new ArrayList<Integer>();

        for (int i = 0; i <= 53; i++) {
            cards.add(i);
        }

        //洗牌
        Collections.shuffle(cards);

        //创建三个玩家和底牌
        ArrayList<Integer> iPlayer = new ArrayList<Integer>();
        ArrayList<Integer> iPlayer2 = new ArrayList<Integer>();
        ArrayList<Integer> iPlayer3 = new ArrayList<Integer>();
        ArrayList<Integer> iCards = new ArrayList<Integer>();

        //遍历这副洗好的牌,遍历过程中,将牌发到三个玩家和底牌中
        for (int i = 0; i < cards.size(); i++) {
            if(i>=51) {
                iCards.add(cards.get(i));
            } else {
                if(i%3==0) {
                    iPlayer.add(cards.get(i));
                }else if(i%3==1) {
                    iPlayer2.add(cards.get(i));
                }else {
                    iPlayer3.add(cards.get(i));
                }
            }
        }

        //对每个人手中的牌排序
        Collections.sort(iPlayer);
        Collections.sort(iPlayer2);
        Collections.sort(iPlayer3);

        //对应数字形式的每个人手中的牌,定义字符串形式的牌
        ArrayList<String> sPlayer = new ArrayList<String>();
        ArrayList<String> sPlayer2 = new ArrayList<String>();
        ArrayList<String> sPlayer3 = new ArrayList<String>();
        ArrayList<String> sCards = new ArrayList<String>();

        for (Integer key : iPlayer) {
            sPlayer.add(map.get(key));
        }
        for (Integer key : iPlayer2) {
            sPlayer2.add(map.get(key));
        }
        for (Integer key : iPlayer3) {
            sPlayer3.add(map.get(key));
        }
        for (Integer key : iCards) {
            sCards.add(map.get(key));
        }

        //看牌
        System.out.println(sPlayer);
        System.out.println(sPlayer2);
        System.out.println(sPlayer3);
        System.out.println(sCards);
    }
}

类(class)

定义一个学生类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public class stu {
    String name;
    private int age;//private关键字使其不能被直接访问

    //干饭方法
    public void eat(){
        System.out.println("干饭");
    }
    
	//睡觉方法
    public void sleep(){
        System.out.println("呼呼呼");
    }
}

类的使用:

1
2
3
4
public static void main(String[] args) {
        stu b =new stu();	//申请空间
        b.eat();			//调用方法
    }

特别的调用类的方法时会调用类定义时的地址。

this

应对在传入值和类中变量名相同的情况。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class Person{
	String name;
    public void sayhello(String name){
        System.out.println(name + "你好,我的名字叫" + this.name);
    }
}

//
    Person p =new Person();
    p.name="p1";
    p.sayhello(p2);//打印结果为“p2你好,我的名字叫p1”

instanceof(判断)

判断该变量是否是(属于)某个类

1
2
3
4
5
6
7
public class Main {
    public static void main(String[] args) {
        zi zi =new zi();
        boolean ok = zi instanceof fu;
        System.out.println(ok);
    }
}

匿名对象

不把定义出来的变量赋值给一个特定的符号,基本上算是一次性的变量。

比如new zi(18).show();

内部类

即定义在类内部的类,其中的sun,就是内部类。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class zi{
    int age=20;
    zi(){}
    zi (int a){
        age=a;
    }
    public void show(){
        System.out.println(age);
    }
    
    //内部类
    class sun {
        public void yeye(){
            System.out.println("爷爷");
        }
    }
}

调用内部类zi.sun sun = new zi().new sun();

继承

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
//父类
public class fu {
    int age=40;
    public void show(){
        System.out.println(age);
    }
}

//子类
public class zi extends fu{			  	//extends表示继承于fu
    int age=20;
    public void show(){				  	//函数show()重写
        int age=10;
        System.out.println(age);
        System.out.println(this.age);
        System.out.println(super.age);	//super使用父类的age
        super.show();					//super使用父类的show
    }
}

多态

同种类型在不同继承下的多种形态

1
2
3
4
5
6
7
8
9
//fu、zi的定义同上题
public class Main {
    public static void main(String[] args) {
        fu f = new fu();				//定义为fu使用了fu的类
        fu z = new zi();				//定义为fu使用了zi的类
        f.show();
        z.show();
    }
}

在多种继承下,多态的体现就会更加明显(没卵用)

抽象类

父类知道子类具有某个函数,但不知道其具体内容时,就可以使用抽象类来定义

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
abstract class Developer {
	public abstract void work();//抽象函数。
}

//JavaEE工程师
class JavaEE extends Developer{
	public void work() {
		System.out.println("正在研发淘宝网站");
	}
}

//Android工程师
class Android extends Developer {
	public void work() {
		System.out.println("正在研发淘宝手机客户端软件");
	}
}

接口(interface)

不同go中接口主要用作万能类型,java中的接口为对其子类中函数的实现声明。

implements表示继承于接口,一个子类可以继承多个接口

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
interface fu{
    public void show();
    public void old();
    public int sum(int a,int b);
}

public class zi implements fu{
    int age=20;
    public void show(){
        int age=10;
        System.out.println(age);
        System.out.println(this.age);
    }
    public void old(){
        System.out.println(age);
    }
    public int sum(int a,int b){
        return a+b;
    }
}

------------------------------一个子类继承多个接口示例--------------------------------
interface Fu1
{
	void show1();
}
interface Fu2
{
	void show2();
}
class Zi implements Fu1,Fu2// 多实现。同时实现多个接口。
{
	public void show1(){}
	public void show2(){}
}

构造方法

在函数定义时执行的函数,写法为类名(),可以有多个。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
public class zi{
    int age=20;
    zi(){}						//空构造函数
    zi (int a){
        age=a;
    }
    public void show(){
        System.out.println(age);
    }

}

修饰符

权限修饰符

访问控制修饰符:只有public,protected,default,private

作用: 用于控制被修饰变量、方法、类的可见范围. public 的访问级别是最高的,其次是 protected、默认和 private. 成员变量和成员方法可以处于4个访问级别中的一个:公开、受保护、默认或私有. 存在继承关系时,父类不可以是 private,因为子类无法继承 顶层类可以处于公开或默认级别,顶层类不能被 protected 和 private 修饰. 局部变量不能被访问控制修饰符修饰

img

状态修饰符

final 类

提示常量,被final修饰后无法再做改变

static

表示静态变量,即该变量被所有该类型的变量共享

abstract 修饰符

提示抽象类(详见"类-抽象类")

代码块

{}表示,控制变量作用范围。

局部代码块:出了{},里面的变量就要重新定义。

构造代码块:优先于构造方法,主要用于赋初始值,每创建一个一个对象就会运行一次,一般用于初始化赋值

静态代码块:优先于类的主方法、构造方法运行,只运行一次,一般用于静态变量的初始化赋值

异常

Java代码在运行时期发生的问题称作异常。

异常发生的原因有很多,通常包含以下三类:

  • 用户输入了非法数据。
  • 要打开的文件不存在。
  • 网络通信时连接中断,或者JVM内存溢出。

这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-

要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:

  • **检查性异常:**最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
  • 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
  • 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。

异常体系:

img

Error:不应该试图捕获的严重问题,大多数这样的错误都是异常条件,它们在Java程序处理的范畴之外。

RuntimeException:是编译期间未经检查的异常,在正常运行中可以抛出的超类,该类异常出现时会结束程序,输出错误信息、位置

try…catch…finally

格式:

1
2
3
4
5
6
7
8
try{
	可能出现的异常的代码;
}catch(异常变量类名 变量名){
	异常的处理办法;
}
finally {
	一定会被执行的语句。
}

程序在try中执行时如果遇到异常,会自动生成一个异常类对象,当java运行时系统接收到异常对象时,会去catch里找匹配的异常类,找到后就会进行异常处理,处理完毕后程序还会继续运行。

实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int[] arr = {1,2,3};
        try {
            System.out.println(arr[3]);
        }catch (ArrayIndexOutOfBoundsException e){//尝试捕捉到索引越界错误
            System.out.println("索引越界");
            e.printStackTrace();				//同RuntimeException输出错误信息,但不停止运行
        }

//如果无论如何都有释放内存,则在catch后面加上finally
        finally {
            arr=NULL;
        }

**try:**该代码块中编写可能产生异常的代码。

**catch:**用来进行某种异常的捕获,实现对捕获到的异常进行处理。

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到。而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的。

Throwable类

成员方法:

1
2
3
4
5
6
7
public String getMessage();//返回此 throwable 的详细消息字符串

public String toString();//获取异常类名和异常信息。

public void printStackTrace();//获取异常类名和异常信息,以及异常出现在程序中的位置。

public void printStackTrace(PrintStream s);//通常用该方法将异常内容保存在日志文件中,以便查阅。

IO

File类

File实际上就是对String类型的路径的封装,在调用它的方法之后才会真正的操作文件。

File类的构造函数:

1
2
3
File(String filePath)						//用输入的路径名来创建一个新的File变量
File(String parentPath,String childPath)	//拼接输入的两个路径,使其成为一个string的类型
File(File parentFile,String childPath)		//拼接一个File和一个输入的路径

实例:

1
2
3
4
5
6
7
String pathname = "E:\\java课\\杰哥不要.txt";
File p= new File("E:\\java课");

File f1 = new File(pathname);
File f2 = new File("E:\\java课","杰哥不要.txt");
File f3 = new File(p,"杰哥不要.txt");
//f1,f2,f3的值都是"E:\java课\杰哥不要.txt"

File中的方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
//创建文件对象
File file = new File("Test22.java");

//获取文件的绝对路径,即全路径
String absPath = file.getAbsolutePath();

//File中封装的路径是什么获取到的就是什么。
String path = file.getPath();

//获取文件名称
String filename = file.getName();

//获取文件大小
long size = file.length();

File对文件的操作

File file = new File("E:\\java课\\杰哥不要");

File dir = new File("E:\\有一个人前来买瓜");

File dir2 = new File("E:\\有一个人前来买瓜\\生异性吗\\你们哥俩");

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//创建文件,如果文件存在,则返回false,如果路径错误则抛出异常IOException
boolean b1 = file.createNewFile();

//删除文件(不是丢回收站,而是直接删除),删除成功返回true,文件不存在返回false
boolean b2 = file.delete();

//判断文件是否存在,存在返回true,不存在false
boolean b3 = file.exists();

//创建单个目录,已存在则返回false
boolean b4 = dir.mkdir();

//创建多级目录,已存在则返回false
boolean b5 = dir.mkdirs();

//删除目录时,如果目录中有内容,无法直接删除。
boolean b6 = dir.delete();

//判断是否为文件,若不存在也会返回false
boolean b7 = file.isFile();

//判断是否为文件夹,若不存在也会返回false
boolean b8 = dir.isDirectory();

listFiles()方法

list()

String[] arr = dir.list();返回一个String数组,记录目录dir下所有文件名

listFiles()

File[] arr2 = dir.listFiles();返回一个File数组,得到目录dir下所有文件

文件过滤器

字节流

多线程

注解

注解,可以看作是对 一个 类/方法 的一个扩展的模版,每个 类/方法 按照注解类中的规则,来为 类/方法 注解不同的参数,在用到的地方可以得到不同的 类/方法 中注解的各种参数与值

基本注解

java提供了5个基本的注解,分别是

1.@Override

限定父类重写方法:当子类重写父类方法时,子类可以加上这个注解,那这有什么什么用?这可以确保子类确实重写了父类的方法,避免出现低级错误

2.@Deprecated

标示已过时:这个注解用于表示某个程序元素类,方法等已过时,当其他程序使用已过时的类,方法时编译器会给出删除线,但不影响使用

3.@SuppressWarnings

抑制编译器警告:被该注解修饰的元素以及该元素的所有子元素取消显示编译器警告

4.@SafeVarargs

“堆污染"警告:堆污染就是把不带泛型的对象赋给一个带泛型的对象,因为不带泛型的话,默认会给泛型设定为object,意思就是什么类型都可以往里面塞,那你一个不带泛型的怎么可能给一个带泛型塞呢

5.@FunctionalInterface

函数式接口:什么是函数式?如果接口中只有一个抽象方法(可以包含多个默认方法或多个static方法)

接口体内只能声明常量字段和抽象方法,并且被隐式声明为public,static,final

接口里面不能有私有的方法或变量

这个注解有什么用?这个注解保证这个接口只有一个抽象方法,注意这个只能修饰接口

元注解

@Retention

这个注解是用来修饰注解定义的,作用是被修饰的注解可以保存多久,这个注解需要使用参数。

这个参数的类型是RetentionPolicy,所以使用这个注解就要对value赋值。

value的值有且仅有三个:

->RetenionPolicy.CLASS(默认) 编译器把该注解记录在class文件中,当运行java程序时,JVM不可获取注解信息

->RetenionPolicy.RUNTIME 编译器把该注解记录在class文件中,当运行java程序时,JVM可获取注解信息,程序可以通过反射获取该注解信息

->RetenionPolicy.SOURCE 该注解只保存在源代码中,编译器直接丢弃该注解

例如:@Retention(value=RetenionPolicy.SOURCE) 可简写为@Retention(RetenionPolicy.SOURCE)

2.@Target

@Target也只能修饰一个注解定义,作用是指定被修饰的注解能用于修饰什么东西,@Target也包含了一个value值,他的值只能是下面的:

取值 注解使用范围
ElementType.METHOD 可用于方法上
ElementType.TYPE 可用于类或者接口上
ElementType.ANNOTATION_TYPE 可用于注解类型上(被@interface修饰的类型)
ElementType.CONSTRUCTOR 可用于构造方法上
ElementType.FIELD 可用于域上
ElementType.LOCAL_VARIABLE 可用于局部变量上
ElementType.PACKAGE 用于记录java文件的package信息
ElementType.PARAMETER 可用于参数上

例如:

@Target(ElementType.METHOD) (这是简写)

@Target里面可以写多个值 因为它的源码是一个数组,如@Target({ElementType.METHOD,ElementType.TYPE})

public @interface Action()

上面就是他的用法,不过有个比较容易混淆的地方就是@interface和interface不是同一个东西:

@interface 不是interface,是注解类 是jdk1.5之后加入的,java没有给它新的关键字,所以就用@interface 这么个东西表示了 这个注解类,就是定义一个可用的注解,包括这个注解用于什么地方,是类,还是方法,还是property,还是方法入参等等,还有这个注解是否编译后进入class 比如我们知道的用于javadoc的注解,是不进入class文件的

然后在后面你就可以用这个注解写代码了。总的来说,这就是一个生成javadoc时用到的注释类

3.@Documented

这个注解用于指定被修饰的注解类将被javadoc工具提取成文档,如果定义注解类时使用了这个注解修饰,则所有使用该注解修饰的程序员苏API文档将会包含该注解说明

例如:@Documentedpublic @interface Testable{}

4.@Inherited

这个注解指定被他修饰的注解将具有继承性——如果某个类使用了@Xxx,则其子类将自动被@Xxx修饰

常用API

基本类型包装类

8种基本类型对应的包装类

基本类型 包装类

byte Byte

short Short

int Integer

log Long

float Float

double Double

char Character

boolean Boolean

自动装箱、自动拆箱

自动装箱:基本数值转成对象(int à Integer)

自动拆箱:对象转成基本数值(Integer à int)

常用方法

public int parseInt(String str):把字符串转成基本类型int

public static String toString(int x):把基本类型int转成字符串

public static Integer valueOf(int x):把基本类型i字符串转成Integer对象

public int intValue():以 int类型返回该包装类对象的值

System类: 系统属性信息工具类

public static long currentTimeMillis():获取当前系统时间与1970年01月01日00:00点之间的毫秒差值

public static void exit(int status):用来结束正在运行的Java程序。参数传入一个数字即可。通常传入0记为正常状态,其他为异常状态

public static void gc():用来运行JVM中的垃圾回收器,完成内存中垃圾的清除。

public static String getProperties():用来获取指系统属性信息

Arrays类:数组操作工具类

public static void sort方法,用来对指定数组中的元素进行排序(元素值从小到大进行排序)

public static String toString方法,用来返回指定数组元素内容的字符串形式

public static void binarySearch方法,在指定数组中,查找给定元素值出现的位置。若没有查询到,返回位置为-插入点-1。要求该数组必须是个有序的数组

Math类:数学运算工具类

abs方法,结果都为正数

ceil方法,结果为比参数值大的最小整数的double值

floor方法,结果为比参数值小的最大整数的double值

max方法,返回两个参数值中较大的值

min方法,返回两个参数值中较小的值

pow方法,返回第一个参数的第二个参数次幂的值

round方法,返回参数值四舍五入的结果

random方法,产生一个大于等于0.0且小于1.0的double小数

Idea常用快捷键

快捷键 功能
Alt+Enter 导入包,自动修正代码
Ctrl+Y 删除光标所在行
Alt+/ 补全代码提示
Ctrl+D 复制光标所在行的内容,插入光标位置下面
Ctrl+Alt+L 格式化代码
Ctrl+/ 单行注释
Ctrl+Shift+/ 选中代码注释,多行注释,再按取消注释
Alt+Ins 自动生成代码,toString,get,set等方法
Alt+Shift+上下箭头 移动当前代码行
Ctrl+i+Alt+u 画出当前类的祖宗十八代

JShell(脚本)

JDK9后的新方法,一个临时的逐行编译的编译器。

**使用:**在任意位置打开cmd窗口,输入JShell,即可运行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
C:\Users\86187>JShell
jshell> System.out.println("Hello World");//返回Hello World

jshell> int a =10;
a ==> 10

jshell> int b=a*10;
b ==> 100

jshell> System.out.println(b);//返回100

AJAX和JSON

AJAX

AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。

AJAX 不是新的编程语言,而是一种使用现有标准的新方法。

AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。

AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。

updatedupdated2023-09-282023-09-28