IDEA常用快捷
main方法 ——> psvm
多行注释 ——-> Ctrl+Shift+/
格式化代码 ——> Ctrl +Alt+L
生成左边变量 ——> ctrl+Alt+V
查看类结构 —-> Alt+7
数组
public class Test01 {public static void main(String[] args) {int[] arr1 = new int[2];arr1[0] = 100;arr1[1] = 200;int[] arr2 = arr1;arr2[0] = 1;arr2[1] = 2;System.out.println(arr1); //打印地址System.out.println(arr1[0]);System.out.println(arr2);System.out.println(arr2[0]);int[] arr3 = {1,2};System.out.println(arr3[0]);System.out.println(arr3[1]);}}
方法的重载
- 同一类中
- 方法名相同
- 参数不同(类型或者数量)
- 与返回类型无关
- 根据输入的参数,区分调用的方法
public class Test02 {public static void main(String[] args) {System.out.println(sum(10,20));System.out.println(sum(10.0,20.0));int i = sum(1,2,3);System.out.println(i);}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 double sum(double a,double b){return a+b;}}
方法参数传递
对于基本数据类型的参数,形式参数的改变,不会影响实参的值
public class Test03 {public static void main(String[] args) {int number = 100;change(number);System.out.println(number); //100}private static void change(int number) {number = 200;}}
对于引用数据类型的参数,形式参数的改变,将会影响实参的值
public class Test03 {public static void main(String[] args) {int[] arr={1,2,3};change(arr);System.out.println(arr[0]); //10}private static void change(int[] arr) {arr[0] = 10;}}
输出
System.out.print() 不换行
int[] arr3 = {1,2,3,4,5};for (int i=0;i<arr3.length;i++){System.out.print(arr3[i]+",");}
输入
Scanner sc = new Scanner(System.in);System.out.println("请输入a:");int a = sc.nextInt();System.out.println("输入的a为:"+a);
逢7过
for (int i = 1;i<100;i++){if (i%7==0||i%10==7||i/10==7){System.out.println("过");}else{System.out.print(i+"\0");}}
1 2 3 4 5 6 过
8 9 10 11 12 13 过
15 16 过
18 19 20 过
22 23 24 25 26 过
过
29 30 31 32 33 34 过
36 过
38 39 40 41 过
43 44 45 46 过
48 过
50 51 52 53 54 55 过
过
58 59 60 61 62 过
64 65 66 过
68 69 过
过
过
过
过
过
过
过
过
过
80 81 82 83 过
85 86 过
88 89 90 过
92 93 94 95 96 过
过
99
类调用
成员变量 ——-> 方法之外
class Test02
public class Test02 {public static void main(String[] args) {System.out.println(sum(10,20));System.out.println(sum(10.0,20.0));int i = sum(1,2,3);System.out.println(i);}int age = 18;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 double sum(double a,double b){return a+b;}}
class Test3
public static void main(String[] args) {Test02 t2 = new Test02();System.out.println(t2.sum(2, 3));System.out.println(t2.age);}
指向相同
public static void main(String[] args) {Test02 t2 = new Test02();System.out.println(t2.age); //18Test02 t1 = t2;t1.age = 20;System.out.println(t1.age); //20System.out.println(t2.age); //20}
变量

封装private
以private封装成员变量,提供get/set方法供它类访问变量和修改变量,它类不可直接访问成员变量
class Test02
private int age;
以下访问将报错
Test02 t2 = new Test02();System.out.println(t2.age);
正确访问,调用对应的get方法
Test02 t2 = new Test02();System.out.println(t2.getAge()); //0
构造方法
//无参public Test02() {}//带参public Test02(int age, String name) {this.age = age;this.name = name;}
public class Test03 {public static void main(String[] args) {//无参创建对象,默认0Test02 t2 = new Test02();System.out.println(t2.getAge()); //0Test02 t3 = new Test02(30,"名字");System.out.println(t3.getAge()+","+t3.getName()); //30,名字}}
字符串
public static void main(String[] args) {char[] chr = {'a', 'b', 'c'};String s1 = new String(chr);String s2 = new String(chr);System.out.println(s1 == s2); //比较地址 falseString a = "abc";String b = "abc";System.out.println(a == b); //trueString s3 = new String("abc");String s4 = new String("abc");System.out.println(s3 == s4); //false}
添加和反转
public static void main(String[] args) {StringBuilder sb = new StringBuilder();sb.append("Hello").append(" ").append("world");System.out.println(sb);sb.reverse();System.out.println(sb);}
Hello world
dlrow olleH
反转
public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.print("请输入字符:");String line = sc.nextLine();String s = ToReverse(line);System.out.println(s);}private static String ToReverse(String line) {return new StringBuilder().append(line).reverse().toString();}
ArrayList相关方法
public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("hello");arrayList.add("world");System.out.println(arrayList); //[hello, world]arrayList.add(0,"java"); //指定索引处添加System.out.println(arrayList); //[java, hello, world]}
public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("hello");arrayList.add("world");System.out.println(arrayList);arrayList.add(0,"java"); //指定索引处添加System.out.println(arrayList);int size = arrayList.size();System.out.println(size);/*boolean hello = arrayList.remove("Hello");System.out.println(hello); //falseboolean hello1 = arrayList.remove("hello");System.out.println(hello1); //trueString remove = arrayList.remove(0);System.out.println(remove);*/String set = arrayList.set(0, "修改了0索引的元素");System.out.println("返回被修改的元素"+set);System.out.println(arrayList);System.out.println(arrayList.get(0));}
Arraylist的遍历
结果相同
public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<>();arrayList.add("hello");arrayList.add("world");System.out.println(arrayList);arrayList.add(0,"java"); //指定索引处添加//方式一for (String arrayList1:arrayList){System.out.println(arrayList1);}//方式二for (int i = 0;i<arrayList.size();i++){System.out.println(arrayList.get(i));}}
public static void main(String[] args) {ArrayList<Test02> arrayList = new ArrayList<>();Test02 t1 = new Test02(30,"张三");Test02 t2 = new Test02(26,"李四");Test02 t3 = new Test02(14,"王五");arrayList.add(t1);arrayList.add(t2);arrayList.add(t3);//方式一for (Test02 arrayList1:arrayList){System.out.println(arrayList1.getAge()+","+arrayList1.getName());}//方式二for (int i = 0;i<arrayList.size();i++){System.out.println(arrayList.get(i).getAge());}}
继承
Test02
public class Test02 {private int num = 20;int number = 10;public void t2(){System.out.println("test2");}}
Test03
public class Test03 extends Test02 {public void t3(){System.out.println("Test03");}public static void main(String[] args) {Test03 t3 = new Test03();t3.t3();t3.t2(); //父类中的方法System.out.println(t3.number); //父类中的变量//但是不可直接访问 num变量,因为num被private保护}}
Test03
test2
10
- 使子类可以调用父类中的方法和变量
- 如子类与父类含有相同的方法,优先调用子类的方法
this关键字与super关键字
public class Test01 {int age = 8;public static void main(String[] args) {Test01 test01 = new Test01();test01.show();}public void show(){int age = 10;System.out.println(age); //10System.out.println(this.age); //8}}
public class Test03 extends Test01 {int age = 12;public void t3(){int age = 1;System.out.println("Test03");System.out.println(age); //1System.out.println(this.age); //12System.out.println(super.age); //8}public static void main(String[] args) {Test03 test03 = new Test03();test03.t3();}}
继承中构造方法访问特点
public class Fu {public Fu(){System.out.println("Fu无参构造方法");}public Fu(int age){System.out.println("Fu带参构造方法");}}
public class Zi extends Fu {public Zi(){super(); //默认的访问无参构造方法,可省System.out.println("Zi无参构造方法");}public Zi(int age){super(); //默认的访问无参构造方法,可省System.out.println("Zi带参构造方法");}}
public static void main(String[] args) {Zi zi = new Zi();Zi zi1 = new Zi(18);}
Fu无参构造方法
Zi无参构造方法
Fu无参构造方法
Zi带参构造方法
都将先调用父类的无参构造方法,
原因:子类的构造方法默认将先访问父类的构造方法,因为子类继承父类,可能会使用到父类中的数据,所以子类初始化之前,一定要完成父类数据的初始化.
调用父类中带参构造方法
如果父类中没有 —> 无参构造方法,想让其子类访问带参构造方法
使用 super(1); //访问带参构造方法
public Zi(){super(1); //访问带参构造方法System.out.println("Zi无参构造方法");}public Zi(int age){super(1);System.out.println("Zi带参构造方法");}
Fu带参构造方法
Zi无参构造方法
Fu带参构造方法
Zi带参构造方法
或
在父类中添加无参构造方法(常用)
子类父类方法同名
super.show(); //调用父类中的show方法
public class Fu {public void show(){System.out.println("FuZ中show");}}
public class Zi extends Fu {public void show(){System.out.println("Zi中show");}public void show_FU(){super.show();}}
public class Demo {public static void main(String[] args) {Zi zi = new Zi();zi.show();zi.show_FU();}}
Zi中show
FuZ中show
方法的重写
如果父类中的方法修饰符为 private 或final 修饰的方法,则此方法不可被重写
且子类 方法修饰符范围需大于 父类中的方法修饰符
范围大小 public > 默认的(即不写修饰符) > private
public class Fu {public void show(){System.out.println("FuZ中show");}}
public class Zi extends Fu {@Override //标注方法为父类中重写的方法public void show(){System.out.println("show方法重写");super.show();}}
public class Demo {public static void main(String[] args) {Zi zi = new Zi();zi.show();}}
关键词final
修饰在类或方法或变量上,修饰后将不可被更改
public final class Zi {final int age=10; //修饰在成员变量上,必须给出初始值public final void show(){System.out.println("final关键字");}}
引用类型:
表示地址不能被修改,所以值能能修改成功
public static void main(String[] args) {final Fu fu = new Fu();fu.arrayList.add("hello");System.out.println(fu.arrayList.get(0));fu = new Fu(); //将报错}
去除final正常运行
public static void main(String[] args) {Fu fu = new Fu();fu.arrayList.add("hello");System.out.println(fu.arrayList.get(0));fu = new Fu();int size = fu.arrayList.size();System.out.println(size);}
static关键字
被static修饰的,可直接通过类名访问
被类的所有对象共享
public class Zi {public String name;public static int age;public void show(){System.out.println(name+","+age);}}
public class Demo {public static void main(String[] args) {Zi.age = 100; //通过类名访问Zi zi = new Zi();zi.name = "张三";zi.show();Zi zi1 = new Zi();zi.name = "李四";zi.show();}}
类所有的对象共享,即所有对象的age都为100了
张三,100
李四,100
被static修饰的方法 只能访问静态方法和变量
public class Zi {public String name;public static int age;public void show(){System.out.println(name);System.out.println(age); //调用静态变量show1(); //调用静态方法show(); //调用自己}public static void show1(){System.out.println(name); //报错System.out.println(age); //调用静态变量show1(); //调用静态方法show(); //报错}}
多态
同一对象在不同时刻表现出的不同状态
前提
- 继承/接口
- 方法重写
- 有父类引用指向子类对象
Fu fu = new Zi(); //父类引用指向子类对象
编译看左边,运行看右边
多态的形式:
- 具体类多态
- 抽象类多态
- 接口多态
public class Animal {static int age = 4;public void eat(){System.out.println("动物");}}
public class Cat extends Animal {static int age = 3;public String name = "小猫";@Overridepublic void eat() {System.out.println("猫");}public void playgame(){System.out.println("玩毛线");}}
public class Demo {public static void main(String[] args) {//父类引用指向子类Animal animal = new Cat();System.out.println(animal.age); //输出父类定义的成员变量值--> 4 行为多态,变量不多态//无法调用子类中特有的变量 nameanimal.eat(); //输出重写后方法的内容,即子类的方法--> 猫/*虽然输出的是子类方法中的内容,但是不可调用父类中不存在的方法为什么输出的是子类方法中的内容?因为父类的方法被重写了*/}}
分割线
public class Fu {public void eat(){System.out.println("FU类方法");}}
public class Zi extends Fu {@Overridepublic void eat() {System.out.println("ZI类重写方法");}}
public class Demo {public static void main(String[] args) {Fu fu = new Zi(); //父类引用指向子类对象fu.eat();Fu fu1 = new Fu();fu1.eat();}}
ZI类重写方法
FU类方法
多态的好处
使用父类作形参,使用子类作实参,提高程序扩展性
缺点:不能访问子类所特有的方法
public class Animal {public void eat(){System.out.println("动物");}}
public class AnimalOperator {/*public void userAnimal(Cat c){c.eat();}public void userAnimal(Dog d){d.eat();}*/public void userAnimal(Animal a){//Animal a = new Cat();//Animal a = new Dog();a.eat();}}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫的eat方法");}}
public class Dog extends Animal {@Overridepublic void eat() {System.out.println("狗吃粑粑");}}
public class Demo {public static void main(String[] args) {AnimalOperator animalOperator = new AnimalOperator();Cat cat = new Cat();animalOperator.userAnimal(cat);Dog dog = new Dog();animalOperator.userAnimal(dog);}}
ZI类重写方法
Nu类重写方法
多态中的转型
在ZI类添加方法
public void special(){System.out.println("俺是ZI类特有的方法");}
main方法中添加测试
Fu f = new Zi(); //向上转型 子转父Zi z1 = (Zi)f; //向下转型 父转子z1.special(); //俺是ZI类特有的方法
分割线
public class Animal {public void eat(){System.out.println("动物");}}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫的eat方法");}public void play(){System.out.println("猫玩毛线团");}}
/*多态的转型*/public class Demo {public static void main(String[] args) {Animal animal = new Cat(); //向上转型animal.eat();//访问子类特有的方法//方式一Cat cat1 = new Cat();cat1.play();//方式二//不用创建新的对象Cat cat2 = (Cat)animal; //向下转型cat2.play();animal = new Dog();animal.eat();}}
输出:
猫的eat方法
猫玩毛线团猫玩毛线团
狗吃粑粑
小案例
public class Animal {private String name;private int age;public Animal() {}//需父类创建带参构造方法,子类才可创建带参构造方法public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void eat(){System.out.println("动物吃肉");}}
public class Dog extends Animal {public Dog() {}public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("狗吃粑粑");}}
public class Cat extends Animal {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("猫猫吃鱼");}}
public class Demo {public static void main(String[] args) {Animal a = new Cat(); //无参构造a.setName("加非");a.setAge(9);System.out.println(a.getName()+","+a.getAge());a.eat();a = new Cat("梦琪",12); //带参构造System.out.println(a.getName()+","+a.getAge());a.eat();a = new Dog("旺财",18);System.out.println(a.getName()+","+a.getAge());a.eat();}}
加非,9
猫猫吃鱼
梦琪,12
猫猫吃鱼
旺财,18
狗吃粑粑
abstract关键字
一个方法没有方法体,应该被定义为抽象方法;而含有抽象方法的类,应被定义为抽象类
抽象类可以没有抽象方法,但无意义
- 限定子类必须去 重写 父抽象类中的 抽象方法
- 有构造方法 ,但是不能直接实例化,用于子类数据的初始化
- 抽象方法只能在抽象类中创建,但是抽象类中可以没有抽象方法
- 子类要不重写父类的抽象方法,要不子类也为抽象类
/*抽象类*/public abstract class Animal {public abstract void eat();public void sleep(){System.out.println("动物想睡觉");}}
public class Cat extends Animal {@Overridepublic void eat() {System.out.println("猫猫吃鱼鱼");}/*public void sleep(){System.out.println("猫也要睡觉");}*/}
public class Demo {public static void main(String[] args) {Animal a = new Cat();a.eat();a.sleep();}}
猫猫吃鱼鱼
动物想睡觉
/*抽象类*/public abstract class Animal {private int age = 20;private final String city = "武汉";//构造方法,用于子类访问父类初始化数据public Animal() {}public Animal(int age) {this.age = age;}public void show() {age = 40;System.out.println(age + "," + city);}public abstract void eat();}
小案例
/*抽象类*/public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public abstract void eat();}
public class Dog extends Animal {public Dog() {}public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("狗狗吃粑粑");}}
public class Cat extends Animal {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("猫猫吃鱼鱼");}}
public class Demo {public static void main(String[] args) {Animal a = new Cat("加菲猫",12);System.out.println(a.getName()+","+a.getAge());a.eat();a = new Dog("旺财",10);System.out.println(a.getName()+","+a.getAge());a.eat();}}
加菲猫,12
猫猫吃鱼鱼
旺财,10
狗狗吃粑粑
接口interface
接口默认常量,即默认使用final修饰过,不可再次赋值
主要对行为进行抽象,无构造方法
所有类直接或间接指向父类 Object类,
JDK8和JDK9对接口有新特性
一个类可以实现多个接口
且一个接口可以继承多个接口
- 默认修饰符 public static final
- 没有构造方法
- 默认方法修饰符 public abstract ,无方法体
以下两种相同
public static final int age = 30;int age = 30;
public abstract void eat();void eat();

抽象类是对事物的抽象,接口是对行为的抽象
接口实现类implements
要么重写接口中的所有抽象方法,要么是抽象类
访问特点
/*接口类*/public interface Jumpping{int num = 10;int num2 = 20;void eat();}
/*接口实现类*/public class Cat implements Jumpping {@Overridepublic void eat() {System.out.println("猫吃奶");}}
public class Demo {public static void main(String[] args) {Jumpping j = new Cat();System.out.println(j.num);j.eat();System.out.println(Jumpping.num2); //可直接使用接口名访问,因为默认使用static修饰}}
小案例
public abstract class Animal {private String name;private int age;public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public abstract void eat();}
public interface Jumpping{void jump();}
public class Dog extends Animal implements Jumpping {public Dog() {}public Dog(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("狗吃粑粑");}@Overridepublic void jump() {System.out.println("狗能跳的更高了");}}
/*接口实现 类继承*/public class Cat extends Animal implements Jumpping {public Cat() {}public Cat(String name, int age) {super(name, age);}@Overridepublic void eat() {System.out.println("猫吃奶");}@Overridepublic void jump() {System.out.println("猫学会了跳高");}}
/*测试类*/public class Demo {public static void main(String[] args) {//接口中无法调用get/set方法,所以常用的还是具体类实现Jumpping j = new Cat();j.jump();j = new Dog();j.jump();//常用de,可以调用更多的方法Cat cat = new Cat();cat.eat();cat.jump();System.out.println(cat.getName()+","+cat.getAge());Animal a = new Cat("加菲猫",12);System.out.println(a.getName()+","+a.getAge());a.eat();}}
猫学会了跳高
狗能跳的更高了
猫吃奶
猫学会了跳高
null,0
加菲猫,12
猫吃奶
内部类
访问特点
- 内部类可直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
/*外部类*/public class Outer {private int num = 10;/*成员内部类,注意:使用public修饰不常用,常使用private*/public class Inner{public void show(){System.out.println(num); //内部可直接访问外部私有变量}}public void method(){/*局部内部类,定义在类方法中*/class Inner{public void show(){System.out.println(num);}}Inner i = new Inner();i.show(); //外部访问需创建对象}}
public class Demo {public static void main(String[] args) {Outer.Inner oi = new Outer().new Inner(); //创建内部类对象oi.show();}}
当修饰符变为private时不可直接访问
但外部类对象可访问内部类对象,所以我们可通过外部类对象间接访问内部类
private class Inner{public void show(){System.out.println(num); //内部可直接访问外部私有变量}}
public void method(){Inner i = new Inner();i.show(); //外部访问需创建对象}
Outer o = new Outer();o.method(); //输出num的值
局部内部类
/*外部类*/public class Outer {private int num = 10;/*成员内部类*/private class Inner{public void show(){System.out.println(num); //内部可直接访问外部私有变量}}public void method(){/*局部内部类*/int num2 = 20;class Inner1{public void show(){System.out.println(num2);System.out.println("局部内部类方法");}}Inner i = new Inner();i.show(); //外部访问需创建对象Inner1 i1 = new Inner1();i1.show(); //局部内部类访问}}
public class Demo {public static void main(String[] args) {/*Outer.Inner oi = new Outer().new Inner();oi.show();*/Outer o = new Outer();o.method();}}
10
20
局部内部类方法
匿名内部类

public interface Inter {void show();}
/*外部类*/public class Outer {public void method(){/*匿名内部类本质:一个没有名字的对象*/new Inter(){@Overridepublic void show() {System.out.println("匿名内部类");}};/*既然是对象,可直接在后面调用方法*/new Inter(){@Overridepublic void show() {System.out.println("匿名内部类");}}.show();/*可看做Inter接口的实现类对象*/Inter i = new Inter(){@Overridepublic void show() {System.out.println("匿名内部类");}};i.show();}}
public class Demo {public static void main(String[] args) {/*Outer.Inner oi = new Outer().new Inner();oi.show();*/Outer o = new Outer();o.method();}}
匿名内部类
匿名内部类
使用
public interface Jumpping {void jump();}
public class JumppingOperator {public void method(Jumpping j){j.jump();}}
public class Demo {public static void main(String[] args) {JumppingOperator jo = new JumppingOperator();/*匿名函数作接口的实现类对象,以匿名函数作参数传入method方法*/jo.method(new Jumpping() {@Overridepublic void jump() {System.out.println("匿名函数1号");}});jo.method(new Jumpping() {@Overridepublic void jump() {System.out.println("匿名函数2号");}});}}
Math类函数
public static void main(String[] args) {//取绝对值System.out.println(Math.abs(-88.2));//向上取整,返回类型为floatSystem.out.println(Math.ceil(12.49));System.out.println(Math.ceil(12.56));//向下取整,返回类型为floatSystem.out.println(Math.floor(12.49));System.out.println(Math.floor(12.56));//四舍五入取整,返回int类型System.out.println(Math.round(12.49F));System.out.println(Math.round(12.56F));//返回两数最大最小System.out.println(Math.max(12,43));System.out.println(Math.min(12,43));//返回a的b次方,即2的3次方,类型为float型 8.0System.out.println(Math.pow(2,3));//返回[0,1)之间的随机数System.out.println(Math.random());}
System类
public static void main(String[] args) {System.out.println("开始");System.exit(0); //结束java虚拟机运行,将不会往后执行System.out.println("结束");/*返回1970年1月1日至今(系统时间)的毫秒数*/double l = System.currentTimeMillis()*1.0/1000/60/60/24/365;System.out.println("1970年1月1日至今已有"+l+"年");/*测试循环一万次打印所花费时间*/long start = System.currentTimeMillis();for (int i=0;i<10000;i++){System.out.println(i);}long end = System.currentTimeMillis();System.out.println("循环一万次打印所花费"+(end-start)+"毫秒");}
Object类
public class Student {private String name;private int age;public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}
public class Demo {public static void main(String[] args) {Student s = new Student("张三",18);System.out.println(s);//fit.itheima_03.Student@1b6d3586Student s1 = new Student("张三",18);//都比较的是地址值System.out.println(s==s1); //falseSystem.out.println(s.equals(s1)); //false}}
重写toString方法后
@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +'}';}
Student s = new Student("张三",18);System.out.println(s);//Student{name='张三', age=18}
重写equals方法,Alt+insert, IDEA default
@Overridepublic boolean equals(Object o) {/*this---->so---->s1*///比较地址if (this == o) return true;//判断是否同类if (o == null || getClass() != o.getClass()) return false;//向下转型Student student = (Student) o;//比较ageif (age != student.age) return false;//再比较namereturn name != null ? name.equals(student.name) : student.name == null;}@Overridepublic int hashCode() {int result = name != null ? name.hashCode() : 0;result = 31 * result + age;return result;}
public static void main(String[] args) {Student s = new Student("张三",18);Student s1 = new Student("张三",18);//重写后的equals将比较的是内容System.out.println(s==s1); //falseSystem.out.println(s.equals(s1)); //true}
Arrays类
public static void main(String[] args) {int[] arr = {43,21,43,6,3,67,87,54};System.out.println(arr);// [I@1b6d3586System.out.println(Arrays.toString(arr));// [43, 21, 43, 6, 3, 67, 87, 54]Arrays.sort(arr); //排序System.out.println(Arrays.toString(arr));// [3, 6, 21, 43, 43, 54, 67, 87]}
工具类设计思想
构造方法用private修饰 , 防止外界创建对象
成员方法使用 public static修饰,可直接使用类名访问方法
包装类

Int与String相互转换
public static void main(String[] args) {int num = 100;System.out.println(getType(num)+"---"+num);//class java.lang.Integer---100String s1 = ""+num;System.out.println(getType(s1)+"---"+s1);//class java.lang.String---100String s2 = String.valueOf(num);System.out.println(getType(s2)+"---"+s2);//class java.lang.String---100String s = "100";Integer i = Integer.valueOf(s);System.out.println(getType(i)+"---"+i);//class java.lang.Integer---100int x = i.intValue();System.out.println(getType(x)+"---"+x);//class java.lang.Integer---100int y = Integer.parseInt(s);System.out.println(getType(y)+"---"+y);//class java.lang.Integer---100}private static String getType(Object a) {return a.getClass().toString();}
常用方法
Int ——> String
String s2 = String.valueOf(num);
String——> Int
int y = Integer.parseInt(s);
集合与数组转换
public static void main(String[] args) {String str = "23 98 54 76 12 87";//分割转为String[]数组String[] strarr = str.split(" ");Arrays.sort(strarr);System.out.println(Arrays.toString(strarr));/*//转换为集合ArrayList<Integer> ints = new ArrayList<>();for (String s : strarr) {int y = Integer.parseInt(s);ints.add(y);}System.out.println(ints);//转换为Integer[]数组,排序Integer[] arr = new Integer[strarr.length];ints.toArray(arr);Arrays.sort(arr);System.out.println(Arrays.toString(arr));*///转为字符串StringBuilder sb = new StringBuilder();for (String a:strarr){sb.append(a).append(" ");}System.out.println(sb);}
【强制】使用集合转数组的方法,必须使用集合的
toArray(T[] array),传入的是类型完全一样的数组,大小就是list.size()。
说明: 使用toArray带参方法,入参分配的数组空间不够大时,toArray方法内部将重新分配内存空间,并返回新数组地址;如果数组元素大于实际所需,下标为[ list.size() ]的数组元素将被置为null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。
正例:
反例: 直接使用toArray无参方法存在问题,此方法返回值只能是Object[]类,若强转其它类型数组将出现ClassCastException错误。List<String> list = new ArrayList<String>(2);list.add("guan");list.add("bao");String[] array = new String[list.size()];array = list.toArray(array);
【强制】使用工具类
Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方
法,它的add/remove/clear方法会抛出UnsupportedOperationException异常。
说明:asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。
第一种情况:list.add("c");运行时异常。
第二种情况:str[0] = "gujin";那么 list.get(0)也会随之修改。String[] str = new String[] { "a", "b" };List list = Arrays.asList(str);
装箱与拆箱
//装箱Integer i = Integer.valueOf(100);//自动装箱Integer i1 = 100;//拆箱int in = i1.intValue();//自动拆箱int in1 = i1;
Date
Date date = new Date();System.out.println(date);//Sun Nov 07 18:26:44 CST 2021System.out.println(date.getTime());//返回1970年1月1日到目前的毫秒数//1636280997605long time = System.currentTimeMillis();//返回1970年1月1日到目前的毫秒数System.out.println(time);//1636281155593
SimpleDateFormat
public static void main(String[] args) throws ParseException {//Date转StringDate date = new Date();SimpleDateFormat sdf = new SimpleDateFormat();String s = sdf.format(date);System.out.println(s);//21-11-7 下午7:33SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 ");String s1 = sdf1.format(date);System.out.println(s1);//2021年11月07日 19时33分03秒//String到dateString ss = "2021-11-06 23:13:33";SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date dd = sdf2.parse(ss);System.out.println(dd);//Sat Nov 06 23:13:33 CST 2021}
封装为工具类
public class DateUtils {//私有工具类private DateUtils(){}public static String dateToString(Date date,String format){SimpleDateFormat sdf = new SimpleDateFormat(format);String dateString = sdf.format(date);return dateString;}public static Date stringToDate(String dateString,String format) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat(format);Date date1 = sdf.parse(dateString);return date1;}}
测试
public static void main(String[] args) throws ParseException {Date date = new Date();String s = DateUtils.dateToString(date, "yyyy年MM月dd日 HH时mm分ss秒");System.out.println(s);//2021年11月07日 19时54分30秒String s1 = "2021-11-07 12:12:12";Date date1 = DateUtils.stringToDate(s1,"yyyy-MM-dd HH:mm:ss");System.out.println(date1);//Sun Nov 07 12:12:12 CST 2021}
Calendar
// 获取 日历类对象Calendar c = Calendar.getInstance();//System.out.println(c);int year = c.get(Calendar.YEAR);int month = c.get(Calendar.MONTH)+1;int date = c.get(Calendar.DATE);System.out.println(year+"年"+month+"月"+date+"日");//2021年11月7日c.add(Calendar.YEAR,-1); //一年前int year1 = c.get(Calendar.YEAR);int month1 = c.get(Calendar.MONTH)+1;int date1 = c.get(Calendar.DATE);System.out.println(year1+"年"+month1+"月"+date1+"日");//2020年11月7日
// 获取 日历类对象Calendar c = Calendar.getInstance();//System.out.println(c);//设定 日历,注意月份从0开始c.set(2021,11,8);int year = c.get(Calendar.YEAR);int month = c.get(Calendar.MONTH)+1;int date = c.get(Calendar.DATE);System.out.println(year+"年"+month+"月"+date+"日");//2021年12月8日
异常

异常处理
JVM默认处理方式
1.打印出错信息(原因及出错位置)
2.停止执行
public static void main(String[] args) throws ParseException {System.out.println("开始");method();System.out.println("结束");}public static void method(){try {int[] arr = {1,2,3};System.out.println(arr[3]);}catch (ArrayIndexOutOfBoundsException e){e.printStackTrace(); //输出错误信息到控制台System.out.println("数组索引不存在");}}
开始 数组索引不存在 结束 java.lang.ArrayIndexOutOfBoundsException: 3 at fit.itheima_05.Demo.method(Demo.java:17) at fit.itheima_05.Demo.main(Demo.java:10)
Process finished with exit code 0
e.printStackTrace(); //输出错误信息到控制台System.out.println("数组索引不存在");System.out.println(e.getMessage()); //输出错误原因//3System.out.println(e.toString());//java.lang.ArrayIndexOutOfBoundsException: 3
- 编译时异常—必须显示处理,否则程序不能运行—-父类为Exception
- 运行时异常—无需显示处理,但也可—-父类为RuntimeException
异常处理 — throws 类名
编译时异常,不处理将无法运行
throws 类名 抛出异常 , 谁调用,谁处理
只是抛出,并没有真正处理
public static Date stringToDate(String dateString,String format) throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat(format);Date date1 = sdf.parse(dateString);//parse方法提示,我可能会出错,必须抛出错误.//添加 throws ParseException 抛出异常return date1;}
自定义异常
extends Exception
/*自定义异常类*/public class ScoreException extends Exception {public ScoreException() {}public ScoreException(String message) {super(message);}}
public class Teacher {public void checkScore(int score) throws ScoreException {if (score< 0||score>100){throw new ScoreException("你的分数超出范围");}else{System.out.println("分数正常");}}}
public class Demo {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入:");int score = scanner.nextInt();Teacher teacher = new Teacher();try {teacher.checkScore(score);} catch (ScoreException scoreException) {scoreException.printStackTrace();}}}
请输入: 120 fit.itheima_05.DateUtils: 你的分数超出范围 at fit.itheima_05.Teacher.checkScore(Teacher.java:6) at fit.itheima_05.Demo.main(Demo.java:15)
Process finished with exit code 0
Collection 集合

public static void main(String[] args) {Collection<String> c = new ArrayList<String>();c.add("hello");c.add("java");System.out.println(c);//重写了toString//输出 [hello, java]}

快捷键 ——Alt+7 展示类结构
public static void main(String[] args) {Collection<String> c = new ArrayList<String>();//添加元素c.add("hello");c.add("java");//移除元素System.out.println(c.remove("hello"));//判断元素是否存在System.out.println(c.contains("hello"));//判断集合是否为空System.out.println(c.isEmpty());//获取集合长度System.out.println(c.size());System.out.println(c);}
遍历
public static void main(String[] args) {Collection<String> c = new ArrayList<String>();//添加元素c.add("hello");c.add("java");c.add("你好");//创建迭代对象Iterator<String> it = c.iterator();//判断对象是否存在while (it.hasNext()){//输出System.out.println(it.next());}System.out.println(c);}
List 有序集合 -序列-允许重复
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("hello");list.add("java");list.add("world");System.out.println(list);Iterator<String> it = list.iterator();while (it.hasNext()){System.out.println(it.next());}/*List 特有方法,注意索引越界问题*///指定位置添加元素list.add(1,"JavaEE");System.out.println(list);//删除指定索引元素,并返回被删除的元素System.out.println(list.remove(1));System.out.println(list);//修改指定索引处元素System.out.println(list.set(1,"JavaWeb"));System.out.println(list);//获取指定索引元素System.out.println(list.get(1));//遍历for (int i = 0;i<list.size();i++){System.out.println(list.get(i));}}
并发修改异常
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("hello");list.add("java");list.add("world");Iterator<String> it = list.iterator();while (it.hasNext()){String s = it.next();if (s.equals("world")){list.add("javaEE");}}}
Exception in thread “main” java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at fit.itheima_05.Demo.main(Demo.java:14)
Process finished with exit code 1
迭代器 判断作 预期修改值与实际修改值 不同导致
解决:使用for循环遍历
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("hello");list.add("java");list.add("world");for(int i = 0;i<list.size();i++){String s = list.get(i);if (s.equals("world")){list.add("javaEE");}}System.out.println(list);//[hello, java, world, javaEE]}
列表迭代器
任意方向开始遍历
sli.add(“javaEE”); 使用 listIterator 对象的add方法,将不会报错
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("hello");list.add("java");list.add("world");ListIterator<String> sli = list.listIterator();while (sli.hasNext()){String s = sli.next();if (s.equals("world")){sli.add("javaEE");}}System.out.println(list);}
增强for循环
原理:
底层包装了 迭代器,
所以也会报 并发修改异常
public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("hello");list.add("java");list.add("world");for (String ss:list){if (ss.equals("world")){list.add("javaEE");}}System.out.println(list);}
Exception in thread “main” java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at fit.itheima_05.Demo.main(Demo.java:21)
Process finished with exit code 1
数据结构
- 栈 —- 先进后出
- 队列 —- 先进先出
- 数组—-查询快,增删慢
- 链表 —- 查询慢,增删快(对比数组)
//List 子类集合特点
/
ArrayList 底层为数组
LinkedList 底层为链表
/
public static void main(String[] args) {//List 子类集合特点/*ArrayList 底层为数组LinkedList 底层为链表*/List<String> list = new LinkedList<>();list.add("hello");list.add("java");list.add("world");for (String ss : list) {System.out.println(ss);}System.out.println("-------------");for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}System.out.println("-------------");Iterator<String> it = list.iterator();while (it.hasNext()) {System.out.println(it.next());}System.out.println("-------------");ListIterator<String> lit = list.listIterator();while (lit.hasNext()) {System.out.println(lit.next());}}
hello java
world
hello java
world
hello java
world
hello java world
Process finished with exit code 0
linkedlist
public static void main(String[] args) {//List 子类集合特点/*ArrayList 底层为数组LinkedList 底层为链表*/LinkedList<String> list = new LinkedList<>();list.add("hello");list.add("java");list.add("world");/*LinkedList 特有方法*///在开头添加元素list.addFirst("javaWEB");//在末位添加元素,注意add也是在末位添加元素list.addLast("JavaEE");System.out.println(list);//[javaWEB, hello, java, world, JavaEE]//删除首位元素System.out.println(list.removeFirst());//javaWEB//删除末位元素System.out.println(list.removeLast());//JavaEESystem.out.println(list);//[hello, java, world]}
Set集合
HashSet:对迭代集合的顺序不作保证,可能会乱
/*Set集合:不包含重复元素不带索引*///HashSet:对迭代集合的顺序不作保证,可能会乱public static void main(String[] args) {Set<String> set = new HashSet<>();set.add("hello");set.add("java");set.add("world");System.out.println(set);//[java, world, hello]set.add("world");System.out.println(set);//[java, world, hello]}
哈希值
/*哈希值:是JDK根据对象地址或字符串或数字计算出的int类型的数字hashCode :返回对象的哈希码值*/public static void main(String[] args) {String s = new String("msd");String s1 = new String("aaa");System.out.println(s.hashCode());//108414System.out.println(s1.hashCode());//96321//默认情况下,不同对象的哈希值不同//重写hashCode方法可使不同对象的哈希值相同System.out.println("hello".hashCode());System.out.println("hello".hashCode());System.out.println("java".hashCode());//可能相同System.out.println("重地".hashCode()); //1179395System.out.println("通话".hashCode()); //1179395}


/*数据结构-->哈希表*/public static void main(String[] args) {//对哈希值 进行16取余//先对比哈希值,再对比内容HashSet<Teacher> set = new HashSet<>();Teacher s1 = new Teacher("张三", 12);Teacher s2 = new Teacher("李四", 13);Teacher s3 = new Teacher("王五", 12);Teacher s4 = new Teacher("李四", 13);set.add(s1);set.add(s2);set.add(s3);set.add(s4);System.out.println(set);//[Teacher{name='王五', age=12}, Teacher{name='李四', age=13}, Teacher{name='张三', age=12}, Teacher{name='李四', age=13}]/*发现重复的元素也被添加进来了,是因为没有重写equals方法和hashCode在teacher类中 重写后//[Teacher{name='王五', age=12}, Teacher{name='张三', age=12}, Teacher{name='李四', age=13}]*/}
LinkedHashSet
/*LinkedHashSet-->底层结构:链表和哈希表由链表保证 顺序 有序由哈希表 保证 元素唯一*/public static void main(String[] args) {LinkedHashSet<String> ss = new LinkedHashSet<>();ss.add("hello");ss.add("java");ss.add("world");System.out.println(ss);//[hello, java, world]ss.add("world");System.out.println(ss);//[hello, java, world]}
TreeSet 集合

/*TreeSet -->不重复自然有序*/public static void main(String[] args) {//需使用基本数据类型对应的包装类型TreeSet<Integer> it = new TreeSet<>();it.add(20);it.add(10);it.add(40);it.add(30);it.add(50);System.out.println(it);//[10, 20, 30, 40, 50]it.add(50);System.out.println(it);//[10, 20, 30, 40, 50]}
自然排序 Comparable
public class Teacher implements Comparable<Teacher> {private String name;private int age;public Teacher() {}public Teacher(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Teacher{" +"name='" + name + '\'' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Teacher teacher = (Teacher) o;if (age != teacher.age) return false;return name != null ? name.equals(teacher.name) : teacher.name == null;}@Overridepublic int hashCode() {int result = name != null ? name.hashCode() : 0;result = 31 * result + age;return result;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int compareTo(Teacher o) {int num = this.age - o.age; //age升序//int num = o.age - this.age; //age降序//如年龄相同,比较名字int num2 = num == 0?this.name.compareTo(o.name):num;return num2;}}
/*TreeSet -->不重复自然有序*/public static void main(String[] args) {TreeSet<Teacher> set = new TreeSet<>();Teacher s1 = new Teacher("张三", 40);Teacher s2 = new Teacher("李四", 30);Teacher s3 = new Teacher("王五", 10);Teacher s4 = new Teacher("李四", 20);//Teacher s5 = new Teacher("m四", 20);set.add(s1);set.add(s2);set.add(s3);set.add(s4);//set.add(s5);for (Teacher t:set){System.out.println(t.getName()+","+t.getAge());}/*Exception in thread "main" java.lang.ClassCastException: fit.itheima_05.Teacher cannot be cast to java.lang.Comparableat java.util.TreeMap.compare(TreeMap.java:1294)at java.util.TreeMap.put(TreeMap.java:538)at java.util.TreeSet.add(TreeSet.java:255)at fit.itheima_05.Demo.main(Demo.java:18)Process finished with exit code 1*///teacher类 实现Comparable接口,重写compareTo方法,根据其返回值输出//return 0; --> [Teacher{name='张三', age=40}]//return 1; -->/*张三,40李四,30王五,10李四,20*///return -1; -->/*李四,20王五,10李四,30张三,40*///return (this.age - o.age);/*王五,10李四,20李四,30张三,40*/}

比较器Comparator 排序

public static void main(String[] args) {//创建内部类TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {@Overridepublic int compare(Teacher o1, Teacher o2) {int num = o1.getAge() - o2.getAge();int num2 = num == 0?o1.getName().compareTo(o2.getName()):num;return num;}});Teacher s1 = new Teacher("张三", 40);Teacher s2 = new Teacher("李四", 30);Teacher s3 = new Teacher("王五", 10);Teacher s4 = new Teacher("李四", 20);//Teacher s5 = new Teacher("m四", 20);ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);//set.add(s5);for (Teacher t:ts){System.out.println(t.getName()+","+t.getAge());}
成绩排序输出
泛型

public static void main(String[] args) {//不指定存储类型Collection c = new ArrayList();c.add("hello");c.add("java");c.add("world");c.add(100);Iterator it = c.iterator();while (it.hasNext()) {String s = (String) it.next();System.out.println(s);}/*hellojavaworldException in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Stringat fit.itheima_05.Test.main(Test.java:16)Process finished with exit code 1*/}
使用泛型
1.避免强制类型转换
2.提前到运行时异常
public static void main(String[] args) {//指定String存储类型Collection<String> c = new ArrayList();c.add("hello");c.add("java");c.add("world");//c.add(100);Iterator<String> it = c.iterator();while (it.hasNext()) {System.out.println(it.next());}/*hellojavaworld*/}

/*泛型类*/public class Generic<T> {private T t;public T getT() {return t;}public void setT(T t) {this.t = t;}}
public static void main(String[] args) {Teacher t = new Teacher();t.setAge(30);System.out.println(t.getAge());// t.setAge("string类型"); //报错// System.out.println(t.getAge());Generic<String> sg = new Generic<>();sg.setT("String类型");System.out.println(sg.getT());Generic<Integer> ig = new Generic<>();ig.setT(100);System.out.println(ig.getT());}
/*泛型类*/public class Generic<T> {public void show(T t) {System.out.println(t);}}
public static void main(String[] args) {Generic g = new Generic<>();//调用不同类型的数据g.show("String");g.show(100);g.show(true);g.show(12.56);}
泛型方法
public class Generic {/*泛型方法*/public <T> void show(T t) {System.out.println(t);}}
public static void main(String[] args) {Generic g = new Generic();//调用不同类型的数据g.show("String");g.show(100);g.show(true);g.show(12.56);}
泛型接口
/*泛型接口*/public interface Generic<T> {void show(T t);}
/*泛型接口实现类*/public class GenericImpl<T> implements Generic<T> {@Overridepublic void show(T t) {System.out.println(t);}}
public static void main(String[] args) {Generic g = new GenericImpl();//调用不同类型的数据g.show("String");g.show(100);g.show(true);g.show(12.56);}
类型通配符

/*Object-->Number-->Integer*/public static void main(String[] args) {//? 通配所有类型List<?> list1 = new ArrayList<Object>();List<?> list2 = new ArrayList<Number>();List<?> list3 = new ArrayList<Integer>();//指定上限 : 最高父类只能到 NUmber,不能为ObjectList<? extends Number> list4 = new ArrayList<Object>(); //报错List<? extends Number> list5 = new ArrayList<Number>();List<? extends Number> list6 = new ArrayList<Integer>();//指定下限 : 最低子类为 Number,不能更低,即IntegerList<? super Number> list7 = new ArrayList<Object>();List<? super Number> list8 = new ArrayList<Number>();List<? super Number> list9 = new ArrayList<Integer>(); //报错}
可变参数
定义: public static int sum(int… a)
如 一个方法既包含可变参数,有包含普通参数,
可变参数 必须 放在最后
/*可变参数*/public static void main(String[] args) {System.out.println(sum(1,2));System.out.println(sum(1,2,3));System.out.println(sum(1,2,3,4));}public static int sum(int... a){//a 为一个数组[1, 2, 3, 4]System.out.println(Arrays.toString(a));int sum = 0;for (int i :a){sum+=i;}return sum;}

public static void main(String[] args) {List<String> list = Arrays.asList("hello", "java", "world");//不支持添加和删除// list.add("web");// list.remove("world");//java.lang.UnsupportedOperationException//但是支持修改list.set(1, "WEB");System.out.println(list);}
public static void main(String[] args) {//List.of JDK9新特性,创建的集合不支持增删改List<String> list = List.of("hello", "java", "world");}
public static void main(String[] args) {//Set.of JDK9新特性,创建的集合不支持增删,没有修改方法//创建时不能存入重复元素Set<String> set = Set.of("hello", "java", "world");}
Map 集合

/*Map集合*/public static void main(String[] args) {//创建Map对象Map<String, String> map = new HashMap<>();map.put("张三","34");map.put("李四","35");map.put("王五","36");System.out.println(map);//{李四=35, 张三=34, 王五=36}//当键重复,会覆盖之前的值map.put("王五","99");System.out.println(map);//{李四=35, 张三=34, 王五=99}}
public static void main(String[] args) {//创建Map对象Map<String, String> map = new HashMap<>();map.put("张三","34");map.put("李四","35");map.put("王五","36");System.out.println(map);//{李四=35, 张三=34, 王五=36}System.out.println(map.remove("张三"));////34System.out.println(map.remove("35"));//键不存在 --> nullSystem.out.println(map);//{李四=35, 王五=36}//判断 键是否存在 -->falseSystem.out.println(map.containsKey("张三"));//判断 值是否存在 -->trueSystem.out.println(map.containsValue("35"));//获取map集合长度 --> 2System.out.println(map.size());//清空集合map.clear();//判断集合是否为空 -->trueSystem.out.println(map.isEmpty());}
public static void main(String[] args) {//创建Map对象Map<String, String> map = new HashMap<>();map.put("张三","34");map.put("李四","35");map.put("王五","36");//根据键 获取值System.out.println(map.get("张三")); //34System.out.println(map.get("傻逼")); //null//获取键的集合Set<String> mapKey = map.keySet();System.out.println(mapKey); //[李四, 张三, 王五]//获取值的集合Collection<String> mapValue = map.values();System.out.println(mapValue); //[35, 34, 36]}
遍历
Set
public static void main(String[] args) {//创建Map对象Map<String, String> map = new HashMap<>();map.put("张三","34");map.put("李四","35");map.put("王五","36");//遍历输出for (String s :map.keySet()){System.out.println(s+","+map.get(s));}/*李四,35张三,34王五,36*/System.out.println("--------------");//获取键值对集合Set<Map.Entry<String, String>> entrySet = map.entrySet();for (Map.Entry<String, String> entry : entrySet) {System.out.println(entry);System.out.println(entry.getKey()+","+entry.getValue());}/*李四=35李四,35张三=34张三,34王五=36王五,36*/}
