JavaSE-part1

news2024/11/18 9:45:47

文章目录

  • Day01 面向对象特性
    • 1.java继承注意点
    • 2.多态
        • 2.1多态概述
        • 2.2多态中成员的特点:star::star:
        • 2.3多态的转型:star::star:
    • 3.Super
    • 4.方法重写:star::star:
    • 5.Object类:star::star:
  • Day02 面向对象特性
    • 1.代码块:star:(主要是初始化变量,先于构造器)
    • 2.单例设计模式:star::star:
    • 3.Final
    • 4.抽象类:star:
    • 5.接口:star::star:
    • 6.内部类:star::star:
      • 6.1局部内部类
      • 6.2匿名内部类:star::star:
      • 6.3成员内部类
      • 6.4静态内部类
    • 7.类加载顺序:star::star:
  • Day03 枚举类 注解 异常
    • 1.枚举类
      • 1.1自定义枚举类
      • 1.2enum关键字枚举类
    • 2.注解
      • 2.1元注解
    • 3.异常:star::star:
      • 3.1异常描述
      • 3.2异常分类
      • 3.3异常处理(捕获异常,处理异常,使程序能够正常执行下去):star:
        • 3.3.1try - catch-finally
        • 3.3.2throws
        • 3.3.3手动抛出异常
        • 3.3.4用户自定义异常类
  • Day04 常用类
    • 1.常用类:star::star::star:
      • 1.1包装类
      • 1.2String
        • 1.2.1构造器
        • 1.2.2存储位置(区分字符串常量和string对象)
        • 1.2.3常用方法
        • 1.2.4相关转换
      • 1.3StringBuffer类(可变字符串)
        • 1.3.1构造器(缓存区)
        • 1.3.2常用方法
      • 1.4StringBuilder类
        • 1.4.1==区别==
      • 1.5Date
          • 1.5.1java8之前
          • 1.5.2java8:star:
      • 1.6Java比较器:star::star::star:
      • 1.7System类
  • Day05 集合
    • 1.集合:star::star::star:
      • 1.1两大分类(collection和map)
      • 1.2Colltection
        • 1.2.1方法
      • 1.3iterator迭代器
      • 1.4List接口
        • 1.4.1方法
        • 实现类
        • 1.4.2**ArrayList**
        • **1.4.3LinkedList**
        • **1.4.4Vector**
      • 1.5Set接口(无索引)
        • 1.5.1==**HashSet**==
        • 1.5.2==**LinkedHashSet**==(适合遍历,遍历效率高)
        • 1.5.3==**TreeSet**(同一对象,定制排序)==
      • 1.6Map接口
        • 1.6.1概述
        • 1.6.2底层实现原理
        • 1.6.3常用方法
        • 1.6.4HashMap
        • 1.6.5==对理解key以Set存储很重要==
        • 1.6.6重点
        • 1.6.7LinkHashMap
        • 1.6.8TreeMap
        • 1.6.9Properties
      • 1.7Collections工具类(如数组有Arrays工具类)
      • 总结
  • Day06 泛型
    • 1.泛型(只在编译期有效,运行时被擦除)
        • 1.1基础概念
        • 1.2基本使用
        • 1.3自定义泛型类:star::star::star:
        • 1.4特性
        • 1.5泛型类
        • 1.6泛型接口
        • 1.7泛型方法
        • 1.8泛型的继承和通配符:star::star::star:
        • 1.7泛型方法
        • 1.8泛型的继承和通配符:star::star::star:

Day01 面向对象特性

image-20221217163219700

image-20221217163555500

访问级别访问修饰符同类同包子类不同包
公开public
受保护protected
默认
私有private

image-20221217163718303

1.java继承注意点

image-20221217164214942

public class ExtendDemo {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.show();
    }
}
class Fu{
    int num = 10;
    int numFu = 100;
    public void method(){
        System.out.println("父类method");
    }
}

class Zi extends Fu{
    int num = 20;
    int numZi = 200;

    public void method(){
        System.out.println("子类method");
    }

    public void show(){
        int num = 30;
        System.out.println("局部变量num:"+num);// 30
        System.out.println("本类成员变量num:"+this.num);// 20
        System.out.println("父类成员变量num:"+super.num);// 10
        // 访问本类的method方法
        this.method();// 子类method
        // 访问父类的method方法
        super.method();// 父类method
    }
}
//局部变量num:30
//本类成员变量num:20
//父类成员变量num:10
//子类method
//父类method

image-20221217165236346

类在继承时,先创建父类空间,然后再创建子类空间

这张图执行顺序:

 * 先在方法区加载类的信息,方法区为类中的方法分配空间和地址。
 * 然后main方法进栈,然后new对象,先创建父类空间,再创建子类空间,并为其变量分配空间

值得注意的是,父类和子类重名的变量和方法没有被覆盖,而是独自存在。

new子类对象,想访问父类的重名的public变量和方法,通过super.的方式访问

图中未画出给Object类分配的空间


2.多态

2.1多态概述

  • 方法和对象具有多种形态
  • 父类的引用指向子类的对象
  • 父类类型 变量名=new 子类类型();
  • 多态是同一个行为具有多个不同表现形式或形态的能力。
  • 多态就是同一个接口,使用不同的实例而执行不同操作。

2.2多态中成员的特点⭐️⭐️

  1. 多态成员变量:编译运行看左边

    Fu f=new Zi();

    System.out.println(f.num);//f是Fu中的值,只能取到父中的值

  2. 多态成员方法:编译看左边,运行看右边

    这里主要由于方法的动态绑定机制

​ Fu f1=new Zi();

​ 3.属性没有重写之说,属性编译的时候看类型

​ System.out.println(f1.show());//f1的门面类型是Fu,但实际类型是Zi,所以调用的是重写后的方法。

2.3多态的转型⭐️⭐️

  • 向上转型:多态本身就是向上转型过的过程

​ 使用格式:父类类型 变量名=new 子类类型();

​ 适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。

  • **向下转型:**一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用类型转为子类引用各类型

​ 使用格式:子类类型 变量名=(子类类型) 父类类型的变量;

​ 适用场景:当要使用子类特有功能时

  • eg1
package day0524;
 
public class demo04 {
    public static void main(String[] args) {
        People p=new Stu();
        p.eat();
        //调用特有的方法
        Stu s=(Stu)p;
        s.study();
        //((Stu) p).study();
    }
}
class People{
    public void eat(){
        System.out.println("吃饭");
    }
}
class Stu extends People{
    @Override
    public void eat(){
        System.out.println("吃水煮肉片");
    }
    public void study(){
        System.out.println("好好学习");
    }
}
class Teachers extends People{
    @Override
    public void eat(){
        System.out.println("吃樱桃");
    }
    public void teach(){
        System.out.println("认真授课");
    }
}
  • eg2
public class duotai {
    public static void main(String[] args) {
        //因为aa实际上还是BB类型的,现在只是属性和类型限定为AA,运行时还有BB的特征
        AA aa = new BB();
        System.out.println(aa instanceof AA);//true
        System.out.println(aa instanceof BB);//true
    }
}
class AA{
}
class BB extends AA{
}

3.Super

image-20221217213032022

4.方法重写⭐️⭐️

  1. 子类的方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样

  2. 子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类 返回相等或从小原则

  3. 子类方法大于等于父类方法的访问权限

5.Object类⭐️⭐️

==

a 既可以判断基本类型,又可以判断引用类型

b 如果判断基本类型,判断的是值是否相等

c 如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象

	public void test01(){
        int[] a = new int[10];
        int[] b = a;
        System.out.println(a == b);//true
        //String类节省内存的方法
        String c = "abc";
        String d = "abc";
        System.out.println(c == d);//true 常量区的特性
        int[] e = new int[10];
        int[] f = new int[10];
        System.out.println(e == f);//false
    }

equals

a.equals:是Object类中的方法,只能判断引用类型

b.默认判断的是地址是否相等,子类中**往往重写该方法**,用于判断内容是否相等

image-20221217214948775

public void test02(){
        //equals
        String a = "abc";
        String b = "abc";
        String c = "abcd";
        System.out.println(a.equals(b));//true
        System.out.println(a.equals(c));//false
        int e = 10;
        int f = 10;
        //e.equals(f) xxx
    }

hashcode

a.提高具有哈希结构的容器的效率
b.两个引用,如果指向的是同一个对象,则哈希值肯定是一样的
c.两个引用,如果指向的是不同对象,则哈希值是不一样的
d.哈希值主要根据地址号来的,不能完全将哈希值等价子地址
e.后面在集合中hashCode 如果需要的话,也会重写

​ f.两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们**“存放在同一个篮子里”**。

public class HashTest {
	private int i;
 
	public int getI() {
		return i;
	}
 
	public void setI(int i) {
		this.i = i;
	}
 
	public int hashCode() {
		return i % 10;
	}
 
	public final static void main(String[] args) {
		HashTest a = new HashTest();
		HashTest b = new HashTest();
		a.setI(1);
		b.setI(1);
		Set<HashTest> set = new HashSet<HashTest>();
		set.add(a);
		set.add(b);
		System.out.println(a.hashCode() == b.hashCode());//true
		System.out.println(a.equals(b));//flase
		System.out.println(set);//[oopBase.HashTest@1, oopBase.HashTest@1]
	}
}
public void test03(){
        //hashcode
        int a[] = new int[10];
        int b[] = new int[10];
        int c[] = a;
        System.out.println(a);//[I@5e5d171f
        System.out.println(b);//[I@24313fcc
        System.out.println(c);//[I@5e5d171f
        System.out.println(a.hashCode() == b.hashCode());//true
        System.out.println(a.hashCode() == c.hashCode());//false
    }

tostring

a.默认返回:全类名+@+哈希值的十六进制
b.子类往往重写to String方法,用于返回对象的属性信息
c.重写toString方法,打印对象或拼接对象时,都会自动调用该对象的toString形式
d.当直接输出一个对象时,toString 方法会被默认的调用

public void test04(){
        //toString
        String a = "abc";
        int[] b = new int[10];
        System.out.println(a.toString());//abc
        System.out.println(b.toString());//[I@24313fcc
    }

finalize

a.当对象被回收时,系统自动调用该对象的finalize方法。子类可以重写该方法,做一些释放资源的操作
b.什么时候被回收:当**某个对象没有任何引用时,**则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁 该对象前,会先调用finalize方法
c.垃圾回收机制的调用,是由系统来決定(即有自己的GC算法),也可以通过System.gc() 主动触发垃圾回收机制

Day02 面向对象特性

1.代码块⭐️(主要是初始化变量,先于构造器)

image-20221219202546567

image-20221219202634624

image-20221219202941155

image-20221219222219221

2.单例设计模式⭐️⭐️

image-20221219203144980

image-20221219203238941

image-20221219203325714

public class Test {
    public static void main(String[] args) {
        GirlFriend1 girlFriend1 = GirlFriend1.getGirlFriend();
        System.out.println(girlFriend1.getName());
        GirlFriend2 girlFriend2 = GirlFriend2.getInstance();
        System.out.println(girlFriend2.getName());
    }
}
//饿汉式
class GirlFriend1{
    private String name;
    private GirlFriend1(){
        this.name = "小冰";
    }
    public String getName(){
        return this.name;
    }
    public static GirlFriend1 girlFriend1 = new GirlFriend1();
    public static GirlFriend1 getGirlFriend(){return girlFriend1;}
}
//懒汉式
class GirlFriend2{
    private String name;
    private static GirlFriend2 girlFriend2 = null;//
    private GirlFriend2(){
        this.name = "小娜";
    }
    public String getName(){
        return this.name;
    }
    public static GirlFriend2 getInstance(){
        if(girlFriend2 == null){
            return new GirlFriend2();
        }
        return girlFriend2;
    }
}

image-20221219221825789

image-20221219221909857

3.Final

image-20221219204448923

4.抽象类⭐️

image-20221219204700661

public class Test {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.cal();
        b.cal();
    }
}
abstract class Template{
    public abstract void job();
    public void cal(){
        long start = System.currentTimeMillis();
        job();
        long end = System.currentTimeMillis();
        System.out.println("时间" + (end - start));
    }
}
class A extends Template{

    @Override
    public void job() {
        long num = 0;
        for (long i = 0; i < 100000000; i++) {
            num += i;
        }
    }
}
class B extends Template{

    @Override
    public void job() {
        long num = 0;
        for (long i = 0; i < 100000000; i++) {
            num *= i;
        }
    }
}

image-20221219223121008


image-20221219223206108


5.接口⭐️⭐️

image-20221219205550086

image-20221219210002261

image-20221219210030768

//接口也相当于一个类但是不能实例化
//接口比抽象类更能提供一般的方法
public class Test2 {
    public static void main(String[] args) {
        USB[] usbs = new USB[2];//引用数组
        usbs[0] = new Phone();
        usbs[1] = new Camera();
        for (int i = 0; i < usbs.length; i++) {
            usbs[i].work();
            if(usbs[i] instanceof Phone){
                ((Phone)usbs[i]).cal();
            }
        }
    }
}
class Phone implements USB{
    @Override
    public void work() {
        System.out.println("手机使用中");
    }
    public void cal(){
        System.out.println("手机可以打电话");
    }
}
class Camera implements USB{
    @Override
    public void work() {
        System.out.println("相机使用中");
    }
    public void cal(){
        System.out.println("相机可以照相");
    }
}

image-20221219223340849

image-20221219223402218

image-20221219223551382

image-20221219223624057

package com.atguigu.java;

public class StaticProxyTest {

	public static void main(String[] args) {
		Star s = new Proxy(new RealStar());
		s.confer();
		s.signContract();
		s.bookTicket();
		s.sing();
		s.collectMoney();
	}
}

interface Star {
	void confer();// 面谈

	void signContract();// 签合同

	void bookTicket();// 订票

	void sing();// 唱歌

	void collectMoney();// 收钱
}

class RealStar implements Star {

	public void confer() {
	}

	public void signContract() {
	}

	public void bookTicket() {
	}

	public void sing() {
		System.out.println("明星:歌唱~~~");
	}

	public void collectMoney() {
	}
}

class Proxy implements Star {///代理类和被代理类实现同一套接口,帮被代理类去做事情,最后再加上被代理类的/独有的事情
	private Star real;

	public Proxy(Star real) {关键
		this.real = real;
	}

	public void confer() {
		System.out.println("经纪人面谈");
	}

	public void signContract() {
		System.out.println("经纪人签合同");
	}

	public void bookTicket() {
		System.out.println("经纪人订票");
	}

	public void sing() {
		real.sing();
	}

	public void collectMoney() {
		System.out.println("经纪人收钱");
	}
}

image-20221219224217406


image-20221220162348051

public class Test5 {
    public static void main(String[] args) {
        Man man = new Man();
        man.help();
    }
}
interface Filial {// 孝顺的
    default void help() {
        System.out.println("老妈,我来救你了");
    }
}
interface Spoony {// 痴情的
    default void help() {
        System.out.println("媳妇,别怕,我来了");
    }
}
class Man implements Filial, Spoony {
    @Override
    public void help() {
        System.out.println("我该怎么办呢?");
        Filial.super.help();
        Spoony.super.help();
    }
}

image-20221220172532968

6.内部类⭐️⭐️

image-20221220163333299

image-20221220164035398

image-20221219211116826

image-20221219211209428

6.1局部内部类

image-20221220164932448

image-20221219211551379

image-20221219211746444

6.2匿名内部类⭐️⭐️

image-20221220165036829

image-20221219211902197

image-20221219212021131

image-20221219212755731

image-20221220174037128

6.3成员内部类

这个创建内部类的对象时,一定要先创建外部类的对象,这样才能继续创建内部类的对象

image-20221219213202885

QQ图片20221219213712

image-20221219215640365


6.4静态内部类

image-20221219214238606

2


7.类加载顺序⭐️⭐️

image-20221219220258631

package com.atguigu.java1;

class Father {
	static {
		System.out.println("11111111111");
	}
	{
		System.out.println("22222222222");
	}

	public Father() {
		System.out.println("33333333333");

	}

}

public class Son extends Father {
	static {
		System.out.println("44444444444");
	}
	{
		System.out.println("55555555555");
	}
	public Son() {
		System.out.println("66666666666");
	}


	public static void main(String[] args) { // 由父及子 静态先行
		System.out.println("77777777777");
		System.out.println("************************");
		new Son();
		System.out.println("************************");

		new Son();
		System.out.println("************************");
		new Father();
	}
	// 11111111111 //加载类信息的时候执行静态代码块
	// 44444444444
	// 77777777777
	// ************************
	// 22222222222
	// 33333333333
	// 55555555555
	// 66666666666
	// ************************
	// 22222222222
	// 33333333333
	// 55555555555
	// 66666666666
	// ************************
	// 22222222222
	// 33333333333

}

Day03 枚举类 注解 异常

1.枚举类

1.1自定义枚举类

image-20221221144625789

public class Test1 {
    public static void main(String[] args) {
        A spring = A.SPRING;
        System.out.println(spring.getDesc());
        A winter = A.WINTER;
        System.out.println(winter.getDesc());
    }
}
/*
    自定义枚举类
 */
class A{
    private String name;
    private String desc;

    private A(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
    
    //这里SPRING直接属于A类,直接获取对象
    //单例模式饿汉式中也属于A类,但是权限是私有的,只能调用公开的方法获取对象
    public static final A SPRING = new A("春天","春暖花开");
    public static final A WINTER = new A("冬天","寒冷");

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
}

1.2enum关键字枚举类

image-20221221145700644

image-20221221145736213

image-20221221145933209

image-20221221153454849

image-20221221151822691

public class Test2 {
    public static void main(String[] args) {
        //1.Enum类name方法
        Season spring = Season.SPRING;
        System.out.println(spring.name());//SPRING
        //2.Enum类中ordinal方法,看所属的常量排在第几位
        System.out.println(spring.ordinal());//0
        //3.Enum中values静态方法,得到所有的枚举对象的值
        //4.Enum中toString方法已经重写
        Season[] seasons = Season.values();
        for(Season season : seasons){
            System.out.println(season);//SPRING WINTER
        }
        //5.Enum类的静态方法valueOf方法,内部为变量名
        Season spring1 = Season.valueOf("SPRING");
        System.out.println(spring1);//SPRING
        //比较枚举常量,比较的是编号
        System.out.println(spring1.compareTo(spring));//0
    }
}
enum Season{
    SPRING("春天","春暖花开"),WINTER("冬天","寒冷");
    private String name;
    private String desc;

    Season(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }
}

image-20221221151849490

2.注解

image-20221221154533586

image-20221221154613092

image-20221221154737542

image-20221221154907175

image-20221221155003168

image-20221221152323347

image-20221221152536499

image-20221221152555569

image-20221221152639361

image-20221221152716826

image-20221221152831907

image-20221221152908893

2.1元注解

image-20221221152950898

image-20221221155328732

image-20221221155410950

image-20221221155435959

image-20221221155510577

image-20221221155630912

image-20221221155833136

image-20221221155901118

image-20221221155911827

3.异常⭐️⭐️

3.1异常描述

image-20221221161652866

image-20221221161804584

3.2异常分类

运行时异常,编译期没有错误,异常只有在在运行阶段才体现出体现出来

编译时异常,必须处理,否则程序通不过编译阶段,更谈不上运行

image-20221221162053116

image-20221221163044030

image-20221221163212705

image-20221221163319090

3.3异常处理(捕获异常,处理异常,使程序能够正常执行下去)⭐️

目的

image-20221221163443513

image-20221221163538102

3.3.1try - catch-finally

image-20221221164838714

image-20221221164950458

image-20221221165255695

image-20221221165427729

捕获异常的相关信息⭐️

image-20221221165608532

image-20221221165827942

image-20221221162222248

image-20221221162538472

不捕获异常时的情况⭐️

image-20221221170130067

3.3.2throws

image-20221221175046372

image-20221221171907618

image-20221221174446452

image-20221221174559625

image-20221221174854775

3.3.3手动抛出异常

image-20221221174955530

image-20221221175152894

3.3.4用户自定义异常类

image-20221221180138609

public class MyExpTest {
    public void regist(int num) throws MyException {
        if (num < 0)
            throw new MyException("人数为负值,不合理", 3);
        else
            System.out.println("登记人数" + num);
    }
    public void manager() {
        try {
            regist(100);
        } catch (MyException e) {
            System.out.print("登记失败,出错种类" + e.getId());
        }
        System.out.print("本次登记操作结束");
    }
    public static void main(String args[]) {
        MyExpTest t = new MyExpTest();
        t.manager();
    }
}

class MyException extends Exception {
    static final long serialVersionUID = 13465653435L;//重要
    private int idnumber;
    public MyException(String message, int id) {
        super(message);//将异常信息传给父类,调用父类构造器
        this.idnumber = id;
    }
    public int getId() {
        return idnumber;
    }
}
public class ReturnExceptionDemo {
    static void methodA() {
        try {
            System.out.println("进入方法A");
            throw new RuntimeException("制造异常");
        }finally {
            System.out.println("用A方法的finally");
        }
    }
    static void methodB() {
        try {
            System.out.println("进入方法B");
            return;//return之前也要调用finally方法,finally一定会执行
        } finally {
            System.out.println("调用B方法的finally");
        }
    }
    public static void main(String[] args) {
        try {
            methodA();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        methodB();
    }

//    进入方法A
//    用A方法的finally
//    制造异常
//    进入方法B
//    调用B方法的finally
}

Day04 常用类

1.常用类⭐️⭐️⭐️

1.1包装类

image-20221226144726272

image-20221226144739073

image-20221226144829235

image-20221226144955002

image-20221226145047593

public class Test1 {
    public static void main(String[] args) {
        Integer i1 = new Integer(127);
        Integer i2 = new Integer(127);
        System.out.println(i1 == i2);//false
        System.out.println(i1.equals(i2));//true 比较的是内容
        System.out.println("-----------");

        Integer i3 = new Integer(128);
        Integer i4 = new Integer(128);
        System.out.println(i3 == i4);//false
        System.out.println(i3.equals(i4));//true
        System.out.println("-----------");

        Integer i5 = 128;
        Integer i6 = 128;
        System.out.println(i5 == i6);//false
        System.out.println(i5.equals(i6));//true
        System.out.println("-----------");

        Integer i7 = 127;
        Integer i8 = 127;
        System.out.println(i7 == i8);//true
        System.out.println(i7.equals(i8));//true
//        由于我们要经常使用Integer类,所以他会提前为int型创建-128~127一共256个对象,
//        如果在自动装箱的时候给局部变量的int型值是在上面的范围之中,
//        就会直接将之前创建好的对象的地址值赋给等号左边的局部变量
        //new 对象的时候不存在这一说法
//        在第一条中提到过,如果在自动装箱的时候给局部变量的int型值是在上面的范围之中,
//        就会直接将之前创建好的对象的地址值赋给等号左边的局部变量,
//        但是上述代码中在自动装箱时的int型值不在上述范围内,所以会重新new对象,既然会new,那么就不再指向同一个对象了,
//        所以System.out.println(i5 == i6);执行结果为false;
    }
}

1.2String

image-20221226150235974

1.2.1构造器

  • String对象创建的两种方式⭐️⭐️⭐️

image-20221226150450174

image-20221226150513114

image-20221226150828447

image-20221226151020606

image-20221226151101020

		char[] a = {'a','b','c','d'};
        String s = new String(a,0,2);//传入的必须是一个char型数组,不能直接传字符串
        System.out.println(s);//ab

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qmK8T8Zx-1681915855129)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059947.png)]

image-20221226151836584

1.2.2存储位置(区分字符串常量和string对象)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YbB9XVZO-1681915855130)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059949.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bg2lj1RA-1681915855130)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059950.png)]

image-20221226153712615

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6w5K8qXA-1681915855131)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059952.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bqQ2KvLV-1681915855132)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059953.png)]

image-20221226154312213

public class Test2 {
    String str = new String("good");
    char[] ch = { 't', 'e', 's', 't' };
    public void change(String str, char ch[]) {
        str = "test ok";
        ch[0] = 'b';//传引用数值类型
    }
    public static void main(String[] args) {
            Test2 ex = new Test2();
            ex.change(ex.str, ex.ch);
            System.out.print(ex.str + " and ");//good and best//分清楚局部变量和全局变量
            System.out.println(ex.ch);
    }
}

image-20221226155556459

1.2.3常用方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EaAv8Ktl-1681915855133)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059956.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fuircoto-1681915855133)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059957.png)]

image-20221226160125510

public class MethodTest {
    @Test
    public void test1(){
        //char charAt()
        String a = "abcd";
        System.out.println(a.charAt(0));//a
        //isEmpty();
        System.out.println(a.isEmpty());//false
        //String toUpperCase();
        String a1 = a.toUpperCase(Locale.ROOT);
        System.out.println(a1);//ABCD

        //String trim()
        String a2 = "    abcd   ";
        String trim = a2.trim();
        System.out.println(trim);//abcd
        //boolean equalsIgnoreCase()
        System.out.println(a1.equalsIgnoreCase(trim));//true

        //String concat;
        String a3 = a2.concat(trim);
        System.out.println(a3);//    abcd   abcd

        //compareTo
        String in1 = "456";
        String in2 = "356";
        System.out.println(in1.compareTo(in2));//1表示,大于,4字符的字符值大于3

        //String subString():返回子串
        String substring = in1.substring(1);
        System.out.println(substring);//56
        String substring1 = in1.substring(1, 2);
        System.out.println(substring1);//5
    }
    @Test
    public void test2(){
        //boolean endsWith()
        String s1 = "我爱你中国爱你";
        boolean is = s1.endsWith("中国");
        System.out.println(is);//true
        //boolean startsWith()
        System.out.println(s1.startsWith("你", 2));//true
        System.out.println(s1.startsWith("你", 1));//false
        System.out.println("-----------------------");
        //boolean contains()
        System.out.println(s1.contains("中国"));//true
        System.out.println("-----------------------");

        //int indexOf():索引
        int ind1 = s1.indexOf("爱你");
        System.out.println(ind1);//1
        int ind2 = s1.indexOf("爱你", 2);
        System.out.println(ind2);//5
        int end1 = s1.lastIndexOf("爱你");
        System.out.println(end1);//5
        int end2 = s1.lastIndexOf("爱你",4);
        System.out.println(end2);//1
    }
    @Test
    public void test3(){
        //String replace()
        String s1 = "哈哈哈哈哈哈哈哈你太可爱啦";
        String s2 = s1.replace('哈', '呜');
        System.out.println(s2);//呜呜呜呜呜呜呜呜你太可爱啦
        String s3 = s1.replace("你太可爱", "你太漂亮");
        System.out.println(s3);//哈哈哈哈哈哈哈哈你太漂亮啦
    }
    @Test
    public void test4() throws UnsupportedEncodingException {
        String str = "中";
        System.out.println(str.getBytes("ISO8859-1").length);// -128~127 //1
        System.out.println(str.getBytes("GBK").length);//2
        System.out.println(str.getBytes("UTF-8").length);//3
        System.out.println(new String(str.getBytes("ISO8859-1"),//乱码
                "ISO8859-1"));// 乱码,表示不了中文
        System.out.println(new String(str.getBytes("GBK"), "GBK"));//中
        System.out.println(new String(str.getBytes("UTF-8"), "UTF-8"));//中,编码和解码结合在一块
//        new String(str.getBytes("UTF-8"),"UTF-8");

    }
}

1.2.4相关转换

image-20221226162920159

image-20221226162941298

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GwhHtxWp-1681915855135)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059961.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F6vXIxr1-1681915855136)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059962.png)]

		//对字符串中的字符进行排序
        //将字符串变为数组,然后调用Arrays.sort()进行排序
        String a = "654897894545613";
        char[] chars = a.toCharArray();
        Arrays.sort(chars);
        System.out.println(chars);//134445556678899
        a = new String(chars);
        System.out.println(a);//134445556678899

1.3StringBuffer类(可变字符串)

1.3.1构造器(缓存区)

image-20221226192305555[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yGZgHNsQ-1681915855137)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059964.png)]

image-20221226172005779

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mwjfMD9p-1681915855138)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059966.png)]

1.3.2常用方法

  • 增删改查插

image-20221226172312392

image-20221226173508221

@Test
    public void test1(){
        StringBuffer buffer = new StringBuffer("abc");
        //append();增
        buffer.append("123");//可用buffer类接收
        System.out.println(buffer);//abc123
        //delete();删
        buffer.delete(3,6);//[3,6)
        System.out.println(buffer);
        //replace();替换
        buffer.replace(0,3,"def");
        System.out.println(buffer);//def
        //insert();插入
        buffer.insert(3,"abc");
        System.out.println(buffer);//defabc
        //reverse();翻转
        buffer.reverse();
        System.out.println(buffer);//cbafed
    }

    @Test
    public void test2(){
        StringBuffer buffer = new StringBuffer("abc");
        //indexOf()
        int index = buffer.indexOf("bc");
        System.out.println(index);//1
        //subString():返回的是String类型的数据
        String substring = buffer.substring(1, 3);
        System.out.println(substring);//bc
        //charAt()
        //setCharAt()
        buffer.setCharAt(1,'a');
        System.out.println(buffer);//aac
    }

1.4StringBuilder类

1.4.1区别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wPb48TVy-1681915855139)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059969.png)]

image-20221226192457966

public class Test2 {
    public static void main(String[] args) {
        //初始设置
        long startTime = 0L;
        long endTime = 0L;
        String text = "";
        StringBuffer buffer = new StringBuffer("");
        StringBuilder builder = new StringBuilder("");
//开始对比
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 200000; i++) {
            buffer.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuffer的执行时间:" + (endTime - startTime));
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 200000; i++) {
            builder.append(String.valueOf(i));
        }
        endTime = System.currentTimeMillis();
        System.out.println("StringBuilder的执行时间:" + (endTime - startTime));
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 200000; i++) {
            text = text + i;//每次都是创建一个对象
        }
        endTime = System.currentTimeMillis();
        System.out.println("String的执行时间:" + (endTime - startTime));

    }
}
StringBuffer的执行时间:6
StringBuilder的执行时间:0
String的执行时间:3817
  • 经典例子
public class Test3 {
    public static void main(String[] args) {
        String str = null;
        StringBuffer sb = new StringBuffer();
        sb.append(str);
        System.out.println(str);//null
        System.out.println(sb.length());//4
        System.out.println(sb);//null
        StringBuffer sb1 = new StringBuffer(str);
        System.out.println(sb1);//报错
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CExwjgG6-1681915855140)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059971.png)]

image-20221226175611563

image-20221227114611240

1.5Date

1.5.1java8之前

image-20221226193026405

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aIerx1av-1681915855142)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059975.png)]

image-20221226193153694

		Date date = new Date();
        System.out.println(date);//Mon Dec 26 19:33:24 CST 2022
        System.out.println(System.currentTimeMillis());//1672054404487
        System.out.println(date.getTime());//1672054404467
        Date date1 = new Date(date.getTime());
        System.out.println(date1.getTime());//1672054404467
        System.out.println(date1.toString());//Mon Dec 26 19:33:24 CST 2022

image-20221226193602995

public class Format {
    public static void main(String[] args) {
        Date date = new Date(); // 产生一个Date实例
        // 产生一个formater格式化的实例
        SimpleDateFormat formater = new SimpleDateFormat();
        System.out.println(formater.format(date));// 打印输出默认的格式2022/12/26 下午7:41
        SimpleDateFormat formater2 = new SimpleDateFormat("YYYY:MM:dd:HH:mm:ss");
        System.out.println(formater2.format(date));//2022:12:26:19:41:05放入Date类型后,解析成想要输出的格式
        try {
            // 实例化一个指定的格式对象
            Date date2 = formater2.parse("2022:12:26:10:50:20");
            // 将指定的日期解析后格式化按指定的格式输出
            System.out.println(date2.toString());//Sun Dec 26 10:50:20 CST 2021
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-29PpIics-1681915855144)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059978.png)]

public class CalendarTest {
    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
// 从一个 Calendar 对象中获取 Date 对象
        Date date = calendar.getTime();
// 使用给定的 Date 设置此 Calendar 的时间
        date = new Date(234234235235L);
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, 8);
        System.out.println("当前时间日设置为8后,时间是:" + calendar.getTime());//当前时间日设置为8后,时间是:Wed Jun 08 09:03:55 CST 1977
        calendar.add(Calendar.HOUR, 2);
        System.out.println("当前时间加2小时后,时间是:" + calendar.getTime());//当前时间加2小时后,时间是:Wed Jun 08 11:03:55 CST 1977
        calendar.add(Calendar.MONTH, -2);
        System.out.println("当前日期减2个月后,时间是:" + calendar.getTime());//当前日期减2个月后,时间是:Fri Apr 08 11:03:55 CST 1977
    }
}
1.5.2java8⭐️

image-20221226194644193

image-20221226194729412

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpCtQuGm-1681915855146)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059981.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lg7PYm5S-1681915855146)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059982.png)]

image-20221226195019506

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k7iGi0ch-1681915855147)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059984.png)]

image-20221226195311991

image-20221226195404771

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bgf4WMup-1681915855149)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059987.png)]

image-20221226195542828

image-20221226195924412


1.6Java比较器⭐️⭐️⭐️

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L30igIsv-1681915855150)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059990.png)]

image-20221226202119466

image-20221226202744466

public class Goods implements Comparable{
    private String name;
    private double price;

    public Goods() {
    }

    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

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

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Goods{" +
                "name='" + name + '\'' +
                ", price=" + price +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        if(o instanceof Goods){
            Goods other = (Goods) o;
            if(this.price > other.price){
                return 1;
            }else if(this.price < other.price){
                return -1;
            }
            return 0;
        }
        throw  new RuntimeException("输入类型不匹配");
    }
}

public class ComparableTest {
    public static void main(String[] args) {
        Goods[] all = new Goods[4];
        all[0] = new Goods("《红楼梦》", 100);
        all[1] = new Goods("《西游记》", 80);
        all[2] = new Goods("《三国演义》", 140);
        all[3] = new Goods("《水浒传》", 120);
        Arrays.sort(all);
        System.out.println(Arrays.toString(all));//[Goods{name='《西游记》', price=80.0}, Goods{name='《红楼梦》', price=100.0},
        // Goods{name='《水浒传》', price=120.0}, Goods{name='《三国演义》', price=140.0}]
    }
}
  • 定制排序的作用:①对不方便修改源代码的类,而且需要比较的类②灵活性强,针对comparable

image-20221226205532265

public class ComparatorTest {
    public static void main(String[] args) {
        Goods[] all = new Goods[4];
        all[0] = new Goods("War and Peace", 100);
        all[1] = new Goods("Childhood", 80);
        all[2] = new Goods("Scarlet and Black", 140);
        all[3] = new Goods("Notre Dame de Paris", 120);
        Arrays.sort(all, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Goods g1 = (Goods) o1;
                Goods g2 = (Goods) o2;
                //按名字来排序
                return g1.getName().compareTo(g2.getName());
            }
        });
        System.out.println(Arrays.toString(all));
    }
}

image-20221227115014755

image-20221227115034450

1.7System类

image-20221226210204661

image-20221226210225683

public class Test {
    public static void main(String[] args) {
        String javaVersion = System.getProperty("java.version");
        System.out.println("java的version:" + javaVersion);
        String javaHome = System.getProperty("java.home");
        System.out.println("java的home:" + javaHome);
        String osName = System.getProperty("os.name");
        System.out.println("os的name:" + osName);
        String osVersion = System.getProperty("os.version");
        System.out.println("os的version:" + osVersion);
        String userName = System.getProperty("user.name");
        System.out.println("user的name:" + userName);
        String userHome = System.getProperty("user.home");
        System.out.println("user的home:" + userHome);
        String userDir = System.getProperty("user.dir");
        System.out.println("user的dir:" + userDir);

//        java的version:11.0.16
//        java的home:D:\Environment\Java\jdk11
//        os的name:Windows 10
//        os的version:10.0
//        user的name:666
//        user的home:C:\Users\666
//        user的dir:D:\desktop\666\study\Java\javaseReverse
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FyjL8HJw-1681915855154)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059998.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EAwOu195-1681915855155)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059999.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cVVgShPf-1681915855155)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059000.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ggqd8lwE-1681915855156)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059001.png)]

Day05 集合

1.集合⭐️⭐️⭐️

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3K7M2Yxc-1681915855156)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059002.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IISRF7RR-1681915855157)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059003.png)]

1.1两大分类(collection和map)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pkprnucg-1681915855157)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059004.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-os2jPi13-1681915855158)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059006.png)]

image-20221227201445931

1.2Colltection

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcBwydMo-1681915855159)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059008.png)]

1.2.1方法

image-20221227201724668

public class Test1 {
    public static void main(String[] args) {
        Collection coll = new ArrayList();
        coll.add("AA");
        coll.add("BB");
        coll.add(123);
        coll.add(new Date());
        System.out.println(coll.size());//4
        Collection coll1 = new ArrayList();
        coll1.add(456);
        coll1.add("CC");
        coll.addAll(coll1);
        System.out.println(coll.size());//6
        System.out.println(coll);//[AA, BB, 123, Tue Dec 27 20:52:51 CST 2022, 456, CC]
        coll.clear();
        System.out.println(coll.isEmpty());//true
    }
}

1.3iterator迭代器

image-20221227202255424

image-20221227202335021

image-20221227202424328

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UNYBUbMS-1681915855161)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059013.png)]

//移除字符串中的2元素
public class Test1 {
    public static void main(String[] args) {
        ArrayList<String> arrayList = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            arrayList.add(new String(String.valueOf(i)));
        }
        Iterator<String> iterator = arrayList.iterator();
        while(iterator.hasNext()){
            if(iterator.next().equals("2")){
                iterator.remove();
            }
        }
        for(String s : arrayList){
            System.out.print(s + " ");//0 1 3 4 
        }
    }
}
public class MethodTest {
    @Test
    public void test1() {
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new String("Tom"));
        coll.add(false);
        coll.add(new Person("Jerry", 20));
        boolean contains = coll.contains(123);
        System.out.println(contains);//true
        System.out.println(coll.contains(new String("Tom")));//true
        System.out.println(coll.contains(new Person("Jerry", 20)));//false
        //contains内部还是比较equals方法,String重写了equals方法,所以比较的是内容,而Person比较的是地址
        Collection coll1 = Arrays.asList(123, 456);
        System.out.println(coll.containsAll(coll1));//true
    }

    @Test
    public void test2() {
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry", 20));
        coll.add(new String("Tom"));
        coll.add(false);
        System.out.println(coll);//[123, 456, day05.Colltection.Person@3891771e, Tom, false]
        coll.remove(new Person("Jerry", 20));
        Collection coll1 = Arrays.asList(123, 456);
        coll.removeAll(coll1);
        //remove移除元素判断的还是底层的equals方法
        System.out.println(coll);//[day05.Colltection.Person@3891771e, Tom, false]
    }

    @Test
    public void test3() {
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry", 20));
        coll.add(new String("Tom"));
        coll.add(false);
        Collection coll1 = new ArrayList();
        coll1.add(123);
        coll1.add(456);
        coll1.add(new Person("Jerry", 20));
        coll1.add(new String("Tom"));
        coll1.add(false);
        //coll.equals方法经过重写,还是调用每一个对象的equals方法比较
        System.out.println(coll.equals(coll1));//false
    }

    @Test
    public void test4() {
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry", 20));
        coll.add(new String("Tom"));
        coll.add(false);
        System.out.println(coll.hashCode());
        Object[] arr = coll.toArray();

        for(int i = 0; i < arr.length; ++i) {
            System.out.println(arr[i]);
        }

        List<String> list = Arrays.asList("AA", "BB", "CC");
        System.out.println(list);
        Iterator var4 = list.iterator();

        while(var4.hasNext()) {
            String l = (String)var4.next();
            System.out.println(l);
        }

        List arr1 = Arrays.asList(new int[]{123, 456});
        System.out.println(arr1.size());//1,就一个数组元素
        System.out.println(arr1);
        List arr2 = Arrays.asList(123, 456);
        //接收参数是一个可变形参数组
        //return new ArrayList<>(a);两个元素
        System.out.println(arr2.size());//2
    }
}
class Person{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }
}
@Test
    public void test2() {
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry", 20));
        coll.add(new String("Tom"));
        coll.add(false);
		//这里会出错,因为每次调用iterator都会生成一个新的迭代器,所以会无限循环
        while(coll.iterator().hasNext()) {
            System.out.println(coll.iterator().next());
        }

    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y2Uv9sJX-1681915855161)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059014.png)]

1.4List接口

image-20221227203505586

1.4.1方法

  • 增加了一些有关索引的方法

增:add(Object obj)
删:remove(int index) / remove(Object obj)
改:set(int index, Object ele)
查:get(int index)
插:add(int index, Object ele)
长度:size()
遍历:① Iterator迭代器方式
② 增强for循环
③ 普通的循环

image-20221227203653819

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rFEa1LOC-1681915855163)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059017.png)]

public class Test {
    @org.junit.Test
    public void test3() {
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");
        Iterator iterator = list.iterator();

        while(iterator.hasNext()) {
            System.out.println(iterator.next());
        }
//        123
//        456
//        AA

        System.out.println("**************");
        Iterator var3 = list.iterator();

        while(var3.hasNext()) {
            Object obj = var3.next();
            System.out.println(obj);
        }
        //        123
         //        456
         //        AA

        System.out.println("**************");

        for(int i = 0; i < list.size(); ++i) {
            System.out.println(list.get(i));
        }

    }

    @org.junit.Test
    public void test2() {
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");
        list.add(new Person("Tom", 12));
        list.add(456);
        int index = list.indexOf(456);
        System.out.println(index);//1
        System.out.println(list.lastIndexOf(456));//4
        Object obj = list.remove(0);
        System.out.println(obj);//123
        System.out.println(list);//[456, AA, day05.ListTest.Person@3891771e, 456]
        list.set(1, "CC");
        System.out.println(list);//[456, CC, day05.ListTest.Person@3891771e, 456]
        List subList = list.subList(2, 4);
        System.out.println(subList);//[day05.ListTest.Person@3891771e, 456]
    }

    @org.junit.Test
    public void test1() {
        ArrayList list = new ArrayList();
        list.add(123);
        list.add(456);
        list.add("AA");
        list.add(new Person("Tom", 12));
        list.add(456);
        //可重复
        System.out.println(list);//[123, 456, AA, day05.ListTest.Person@3891771e, 456]
        //添加到1处,"BB"
        list.add(1, "BB");
        System.out.println(list);//[123, BB, 456, AA, day05.ListTest.Person@3891771e, 456]
        List list1 = Arrays.asList(1, 2, 3);
        list.addAll(list1);
        System.out.println(list.size());//9
        System.out.println(list);//[123, BB, 456, AA, day05.ListTest.Person@3891771e, 456, 1, 2, 3]
        System.out.println(list.get(0));//123
    }
}
class Person{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }
}

实现类

1.4.2ArrayList

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hpy8mDJf-1681915855163)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059018.png)]

image-20221228135420889

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hj34hIMp-1681915855164)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059020.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4QsGetJw-1681915855165)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059021.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EmaX4qN-1681915855165)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059022.jpg)]

public class ArrayListTest {
    public static void testListRemove() {
        List list = new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        updateList(list);
        System.out.println(list);//[1, 2]
    }
    private static void updateList(List list) {
        list.remove(2);
    }

    public static void main(String[] args) {
        testListRemove();
    }
}

1.4.3LinkedList

  • 不推荐加入null元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a9VrMTLD-1681915855166)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059023.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VE0sLaYK-1681915855167)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059024.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O4yNnaz9-1681915855168)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059025.png)]


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AkDJefuN-1681915855168)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059026.png)]

1.4.4Vector

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O8dEPDq6-1681915855169)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059027.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9YthTbqq-1681915855170)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059028.png)]

1.5Set接口(无索引)

  1. 存储的数据特点:无序的、不可重复的元素
    具体的:
    以HashSet为例说明:

无序性:不等于随机性。存储的数据在底层数组中并非照数组索引的顺序添加,而是根据数据的哈希值决定的。

不可重复性:保证添加的元素照equals()判断时,不能返回true.即:相同的元素只能添加一个。

所以要添加自定义的对象时,一定要重写hashcode()和equals()方法,添加自定义对象时先判断hashcode如果不一样,那么不判断equals()方法,认为不一样。这样可以提高判断效率。因此要重写hashcode和equals方法

可以理解为hashcode是第一关,第一关通过第二关equals方法再通过,就完全相同。

Object中的hashcode()方法没有属性依据随机随机算得一个数,所以调用的话hashcode值不会一样

总之一定要保证相等的对象有相同的hashcode

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tuW3U3bj-1681915855171)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059029.png)]

2.元素添加过程:(以HashSet为例)

散列函数计算还尽可能保证能均匀存储元素

3.底层结构:散列数组 + 链表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hLHF1Snw-1681915855172)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059030.png)]

4.Set接口中的方法都是Colltecion中的方法,没有修改的方法

5.因为Set接口的值不可重复,Map接口中key不可重复,所以都有Tree结构进行排序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rse5OJis-1681915855172)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059031.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hqCOBtiG-1681915855173)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059032.png)]

1.5.1==HashSet==

  • 集合中的元素可以为null

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pa8hPcDX-1681915855174)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059033.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MTMAkMS3-1681915855175)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059034.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9pWpV2z8-1681915855176)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059035.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5dTCP5n9-1681915855177)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059036.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6O0lYPS5-1681915855177)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059037.png)]

1.5.2==LinkedHashSet==(适合遍历,遍历效率高)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vj3IEACY-1681915855178)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059038.png)]

image-20221228112954333

1.5.3==TreeSet(同一对象,定制排序)==

  • 这个里面不再按hashcode和equals方法去比,而是按照重写的comparable接口去比,底层是树形结构,不是数组,不允许有相同的数据出现

    image-20221228153850924

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gZ18XjZ0-1681915855179)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059041.png)]

image-20221228113131650

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TvCMAYXu-1681915855180)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059043.png)]

image-20221228113713669

image-20221228113751578

1.6Map接口

1.6.1概述

1.一般使用HashMap,HashMap的线程不安全性,可由Collections工具类来解决

2.TreeMap排序的时候,考虑key的自然排序和定制排序

3.底层结构⭐️ 数组 + 链表 + 存储元素(entry或node)

4.内部类只能对外部类范围内有效,只能使用外部类中的成员,与别的成员无联系,所以声明为内部类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJpWds6w-1681915855182)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059046.png)]

image-20221229192325806

image-20221229192410377

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ykbPaSLC-1681915855184)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059049.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hcVGZDQu-1681915855184)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059050.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-btnAMYSA-1681915855185)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059051.png)]

image-20221229193812454

1.6.2底层实现原理

image-20221229195952958

image-20221229200131319

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iLpvR8Or-1681915855188)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059055.png)]

image-20221230194911439

image-20221230195052630

image-20221230195125700

image-20221230195154258

以上为jdk7

image-20221230200904951

1.6.3常用方法

总结:常用方法:

  • 添加:put(Object key,Object value)
  • 删除:remove(Object key)
  • 修改:put(Object key,Object value)
  • 查询:get(Object key)
  • 长度:size()
  • 遍历:keySet() / values() / entrySet()
  • 没有插入方法,因为没有顺序何谈插入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JTdEIx8t-1681915855191)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059061.png)]

image-20221230201230878

image-20221230202423145

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2LBwXnyF-1681915855193)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059064.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YXHyyuTB-1681915855193)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059065.png)]

/*
     添加、删除、修改操作:
 Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
 void putAll(Map m):将m中的所有key-value对存放到当前map中
 Object remove(Object key):移除指定key的key-value对,并返回value
 void clear():清空当前map中的所有数据
     */
    @Test
    public void test3(){
        Map map = new HashMap();
        //添加
        map.put("AA",123);
        map.put(45,123);
        map.put("BB",56);
        //修改
        ///
        map.put("AA",87);//重复添加相同的key,会修改value

        System.out.println(map);//{AA=87, BB=56, 45=123}

        Map map1 = new HashMap();
        map1.put("CC",123);
        map1.put("DD",123);

        map.putAll(map1);

        System.out.println(map);

        //remove(Object key)
        Object value = map.remove("CC");
        System.out.println(value);//123,返回要移除的键值对的value
        System.out.println(map);//{AA=87, BB=56, DD=123, 45=123}

        //clear()
        map.clear();//与map = null操作不同
        System.out.println(map.size());//0,map还在,只是将里面存的数据清除
        System.out.println(map);//{}
    }
    /*
 元素查询的操作:
 Object get(Object key):获取指定key对应的value
 boolean containsKey(Object key):是否包含指定的key
 boolean containsValue(Object value):是否包含指定的value
 int size():返回map中key-value对的个数
 boolean isEmpty():判断当前map是否为空
 boolean equals(Object obj):判断当前map和参数对象obj是否相等
     */
    @Test
    public void test4(){
        Map map = new HashMap();
        map.put("AA",123);
        map.put(45,123);
        map.put("BB",56);
        // Object get(Object key)
        System.out.println(map.get(45));//123
        //containsKey(Object key)
        boolean isExist = map.containsKey("BB");
        System.out.println(isExist);

        isExist = map.containsValue(123);
        System.out.println(isExist);

        map.clear();

        System.out.println(map.isEmpty());//true

    }
  • 遍历方法(Map没有实现iterator接口,因此不能用迭代器遍历)
  • 遍历方法:拿到key和value,key是由Set存储,value是由Colltection存储,因此用元视图方法得到然后遍历
  • 目的:从键值对中依次地取数据
@Test
    public void test5(){
        Map map = new HashMap();
        map.put("AA",123);
        map.put(45,1234);
        map.put("BB",56);

        //遍历所有的key集:keySet()
        Set set = map.keySet();
        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        //AA BB 45
        System.out.println();
        //遍历所有的value集:values()
        Collection values = map.values();
        for(Object obj : values){
            System.out.println(obj);
        }
        System.out.println();
        //遍历所有的key-value
        //方式一:entrySet()
        Set entrySet = map.entrySet();
        Iterator iterator1 = entrySet.iterator();
        while (iterator1.hasNext()){
            Object obj = iterator1.next();
            //entrySet集合中的元素都是entry
            Map.Entry entry = (Map.Entry) obj;
            System.out.println(entry.getKey() + "---->" + entry.getValue());

        }
        System.out.println();
        //方式二:
        Set keySet = map.keySet();
        Iterator iterator2 = keySet.iterator();
        while(iterator2.hasNext()){
            Object key = iterator2.next();
            Object value = map.get(key);
            System.out.println(key + "=====" + value);

        }

    }

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DuL6pOvM-1681915855194)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059066.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKvKR9Dt-1681915855194)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059067.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NcBf4LfM-1681915855195)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059068.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zOcz0Jn5-1681915855196)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059069.png)]

1.6.4HashMap

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xjn9vzpR-1681915855196)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059070.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0aQsB3VM-1681915855197)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059071.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wTqPFgNW-1681915855197)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059072.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NseCTWNS-1681915855198)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059073.png)]

1.6.5对理解key以Set存储很重要

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WStRcZDl-1681915855198)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059074.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-71sftptU-1681915855199)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059075.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vDgdd0pq-1681915855199)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059076.png)]

1.6.6重点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ImUYHQLZ-1681915855200)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059077.png)]

1.6.7LinkHashMap

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TbplKZ4R-1681915855200)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059078.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VaAwkfRz-1681915855200)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059079.png)]

1.6.8TreeMap

  • 注意点只能按照key排序,不能按照value排序,因为value是可重复的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MKa1CcIw-1681915855200)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059080.png)]

public class User implements Comparable{
    private String name;
    private int age;

    public User() {
    }

    public User(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;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        System.out.println("User equals()....");
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (age != user.age) return false;
        return name != null ? name.equals(user.name) : user.name == null;
    }

    @Override
    public int hashCode() { //return name.hashCode() + age;
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    //按照姓名从大到小排列,年龄从小到大排列
    @Override
    public int compareTo(Object o) {
        if(o instanceof User){
            User user = (User)o;
//            return -this.name.compareTo(user.name);
            int compare = -this.name.compareTo(user.name);
            if(compare != 0){
                return compare;
            }else{
                return Integer.compare(this.age,user.age);
            }
        }else{
            throw new RuntimeException("输入的类型不匹配");
        }

    }
}

    //向TreeMap中添加key-value,要求key必须是由同一个类创建的对象
    //因为要按照key进行排序:自然排序 、定制排序
    //自然排序
    @Test
    public void test1(){
        TreeMap map = new TreeMap();
        User u1 = new User("Tom",23);
        User u2 = new User("Jerry",32);
        User u3 = new User("Jack",20);
        User u4 = new User("Rose",18);

        map.put(u1,98);
        map.put(u2,89);
        map.put(u3,76);
        map.put(u4,100);

        Set entrySet = map.entrySet();
        Iterator iterator1 = entrySet.iterator();
        while (iterator1.hasNext()){
            Object obj = iterator1.next();
            Map.Entry entry = (Map.Entry) obj;
            System.out.println(entry.getKey() + "---->" + entry.getValue());

        }
//        User{name='Tom', age=23}---->98
//        User{name='Rose', age=18}---->100
//        User{name='Jerry', age=32}---->89
//        User{name='Jack', age=20}---->76
    }
//定制排序
    @Test
    public void test2(){
        TreeMap map = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof User && o2 instanceof User){
                    User u1 = (User)o1;
                    User u2 = (User)o2;
                    return Integer.compare(u1.getAge(),u2.getAge());
                }
                throw new RuntimeException("输入的类型不匹配!");
            }
        });
        User u1 = new User("Tom",23);
        User u2 = new User("Jerry",32);
        User u3 = new User("Jack",20);
        User u4 = new User("Rose",18);

        map.put(u1,98);
        map.put(u2,89);
        map.put(u3,76);
        map.put(u4,100);

        Set entrySet = map.entrySet();
        Iterator iterator1 = entrySet.iterator();
        while (iterator1.hasNext()){
            Object obj = iterator1.next();
            Map.Entry entry = (Map.Entry) obj;
            System.out.println(entry.getKey() + "---->" + entry.getValue());

        }
    }

1.6.9Properties

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8E8qBcQC-1681915855201)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059081.png)]

public class Properties {
    //Properties:常用来处理配置文件。key和value都是String类型
    public static void main(String[] args) {
        FileInputStream fis = null;
        try {
            java.util.Properties pros = new java.util.Properties();

            fis = new FileInputStream("jdbc.properties");
            pros.load(fis);//加载流对应的文件

            String name = pros.getProperty("name");
            String password = pros.getProperty("password");

            System.out.println("name = " + name + ", password = " + password);
            //name = Tom宋红康, password = abc123
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
    }
}

1.7Collections工具类(如数组有Arrays工具类)

  • 操作Collection和Map的工具类

  • 排序方法都是针对List接口的 Arrays工具类针对数组排序

  • size()方法表示存了几个元素

  • 将集合转变为同步的方法synchronizedList()

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JlDcWplJ-1681915855202)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059082.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rsLQrNfC-1681915855202)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059083.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LviVSNTz-1681915855203)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059084.png)]

        /*
        reverse(List):反转 List 中元素的顺序
        shuffle(List):对 List 集合元素进行随机排序
        sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序
        sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序
        swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换
    
        Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素
        Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素
        Object min(Collection)
        Object min(Collection,Comparator)
        int frequency(Collection,Object):返回指定集合中指定元素的出现次数
        void copy(List dest,List src):将src中的内容复制到dest中
        boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值
    
         */
        @Test
        public void test2(){
            List list = new ArrayList();
            list.add(123);
            list.add(43);
            list.add(765);
            list.add(-97);
            list.add(0);
    
            //报异常:IndexOutOfBoundsException("Source does not fit in dest")
    //        List dest = new ArrayList();//这里如果指定长度,那么指定的是底层数组造了几个,而不是实际存的元素
    //        Collections.copy(dest,list);
            //正确的:
            List dest = Arrays.asList(new Object[list.size()]);
            System.out.println(dest.size());//list.size(); //5
            Collections.copy(dest,list);
    
            System.out.println(dest);//[123, 43, 765, -97, 0]
    
    
            /*
            Collections 类中提供了多个 synchronizedXxx() 方法,
            该方法可使将指定集合包装成线程同步的集合,从而可以解决
            多线程并发访问集合时的线程安全问题
    
             */
            //返回的list1即为线程安全的List
            List list1 = Collections.synchronizedList(list);
    
    
        }
    
        @Test
        public void test1(){
            List list = new ArrayList();
            list.add(123);
            list.add(43);
            list.add(765);
            list.add(765);
            list.add(765);
            list.add(-97);
            list.add(0);
    
            System.out.println(list);//[123, 43, 765, 765, 765, -97, 0]
    
    //        Collections.reverse(list);
    //        Collections.shuffle(list);
    //        Collections.sort(list);
    //        Collections.swap(list,1,2);
            int frequency = Collections.frequency(list, 123);
    
            System.out.println(list);//[123, 43, 765, 765, 765, -97, 0]
            System.out.println(frequency);//1
    
        }
    

总结

image-20221230220958071

Day06 泛型

1.泛型(只在编译期有效,运行时被擦除)

1.1基础概念

  • 泛型可通俗理解为占位符
  • 泛型解决了强制类型转换的问题
  • Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生 ClassCastException异常。同时,代码更加简洁、健壮。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X7JR8lK8-1681915855203)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059086.png)]

image-20221231144826468

image-20221231160051394

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rxcxJqFq-1681915855205)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059089.png)]

image-20221231165602244

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2PdWwTBu-1681915855206)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059092.png)]

1.2基本使用

ArrayList<Integer> list = new ArrayList<>();//类型推断
list.add(78);
list.add(88);
list.add(77);
list.add(66);
//遍历方式一:
//for(Integer i : list){
//不需要强转
//System.out.println(i);
//}
//遍历方式二:
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}

Map<String,Integer> map = new HashMap<String,Integer>();
map.put("Tom1",34);
map.put("Tom2",44);
map.put("Tom3",33);
map.put("Tom4",32);
//添加失败
//map.put(33, "Tom");
Set<Entry<String,Integer>> entrySet = map.entrySet();
Iterator<Entry<String,Integer>> iterator = entrySet.iterator();
while(iterator.hasNext()){
Entry<String,Integer> entry = iterator.next();
System.out.println(entry.getKey() + "--->" + entry.getValue());
}

1.3自定义泛型类⭐️⭐️⭐️

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ok8zBIC-1681915855206)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059093.png)]

image-20221231152717924

image-20221231152752338

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HUqOUDTr-1681915855208)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059096.png)]

1.4特性

  • 泛型只在编译阶段有效。
  • 泛型类型在逻辑上看以看成是多个不同的类型,实际上都是相同的基本类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pUkUKceW-1681915855208)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059097.png)]

1.5泛型类

class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{
  private 泛型标识 /*(成员变量类型)*/ var; 
  .....

  }
}

//此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型
//在实例化泛型类时,必须指定T的具体类型,否则T为Object类型
public class Generic<T>{ 
    //key这个成员变量的类型为T,T的类型由外部指定  
    private T key;

    public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定
        this.key = key;
    }

    public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定
        return key;
    }
}

image-20221231154946767

image-20221231155152141

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gfWFlwib-1681915855210)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059100.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sAk6wlSj-1681915855210)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059101.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bBMBliBZ-1681915855211)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059102.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l2WgOY0W-1681915855211)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059103.png)]

1.6泛型接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1GjUuKwO-1681915855212)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059104.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E5MMNyRR-1681915855212)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059105.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zltiDc03-1681915855213)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059106.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lgEftlur-1681915855213)(https://weifengqin-image.oss-cn-nanjing.aliyuncs.com/img/202304180059107.png)]

image-20221231180031779

image-20221231180155527

1.7泛型方法

  • 特点:调用的时候自动类型推断,不用<>指明类型

image-20221231205316157

image-20221231205550923

image-20221231205714475

image-20221231193143119

image-20221231190801880

image-20221231191413193

image-20221231191950908

image-20221231210531990
  • 可以说泛型类中的T什么的,都是在编译类的时候确定,而static方法在类加载就要确定T类型,因此不生效
  • 而泛型方法影响的只是参数,static方法在类加载的时候可以不先关注参数,因此成立

1.8泛型的继承和通配符⭐️⭐️⭐️

  • 1.

image-20221231204150473

image-20221231204954154

image-20221231204938545

  • 同一个类型不同泛型之间没关系,但是不同类型,同一种泛型之间有子父类关系

  • image-20221231215255237

    image-20221231213257236

image-20221231214257288

  • 第二种方式

image-20221231215056013

image-20221231215149668

  • 通配符

  • 通配符是泛型<>的通用父类

  • image-20221231215924384

    image-20221231215647224

image-20221231215844032

  • 通配符:写入

  • image-20221231220350284

  • 通配符:读取

  • image-20221231220512674

  • 有限制条件的通配符

  • ?(-…,+…) extends <= super >=

  • image-20221231220733979

/*
    3.有限制条件的通配符的使用。
        ? extends A:
                G<? extends A> 可以作为G<A>和G<B>的父类,其中B是A的子类

        ? super A:
                G<? super A> 可以作为G<A>和G<B>的父类,其中B是A的父类

     */
    @Test
    public void test4(){

        List<? extends Person> list1 = null;
        List<? super Person> list2 = null;

        List<Student> list3 = new ArrayList<Student>();
        List<Person> list4 = new ArrayList<Person>();
        List<Object> list5 = new ArrayList<Object>();

        list1 = list3;
        list1 = list4;
//        list1 = list5;

//        list2 = list3;
        list2 = list4;
        list2 = list5;

        //读取数据:
        list1 = list3;
        Person p = list1.get(0);//可以用Person,Object,因为小于等于Person
        //编译不通过
        //Student s = list1.get(0);//因为不确定是不是Student/重要///

        list2 = list4;
        Object obj = list2.get(0);//这里只能是Object,因为大于等于Person,Object能确定
        编译不通过
//        Person obj = list2.get(0);

        //写入数据:
        //编译不通过
//        list1.add(new Student());
        
        //编译通过
        list2.add(new Person());//这里就可以往小的写,因为最小是Person,你只要往里传Person子类就可以
        list2.add(new Student());

    }

image-20221231222101659
图片转存中…(img-3iLUjsKg-1681915855214)]

[外链图片转存中…(img-W1ZQ5wOT-1681915855214)]

1.7泛型方法

  • 特点:调用的时候自动类型推断,不用<>指明类型

[外链图片转存中…(img-2Z4u4gBE-1681915855215)]

[外链图片转存中…(img-0xd0Fz00-1681915855216)]

[外链图片转存中…(img-0EnPPJqC-1681915855216)]

[外链图片转存中…(img-hhsRUXYs-1681915855216)]

[外链图片转存中…(img-MkcMESUz-1681915855217)]

[外链图片转存中…(img-mH32zGXw-1681915855217)]

[外链图片转存中…(img-nmBwaz0n-1681915855218)]

image-20221231210531990
  • 可以说泛型类中的T什么的,都是在编译类的时候确定,而static方法在类加载就要确定T类型,因此不生效
  • 而泛型方法影响的只是参数,static方法在类加载的时候可以不先关注参数,因此成立

1.8泛型的继承和通配符⭐️⭐️⭐️

  • 1.

[外链图片转存中…(img-mRiEz0tI-1681915855218)]

[外链图片转存中…(img-0IoNK78Z-1681915855218)]

[外链图片转存中…(img-0zT9udOA-1681915855219)]

  • 同一个类型不同泛型之间没关系,但是不同类型,同一种泛型之间有子父类关系

  • [外链图片转存中…(img-fP8fz3gU-1681915855220)]

    [外链图片转存中…(img-E49HOR7b-1681915855220)]

[外链图片转存中…(img-b097q7su-1681915855221)]

  • 第二种方式

[外链图片转存中…(img-ENU0qh1h-1681915855221)]

[外链图片转存中…(img-ZgCugI5A-1681915855222)]

  • 通配符

  • 通配符是泛型<>的通用父类

  • [外链图片转存中…(img-C4TDkXXp-1681915855222)]

    [外链图片转存中…(img-Uzmz0AYz-1681915855223)]

[外链图片转存中…(img-S6oFZWYg-1681915855223)]

  • 通配符:写入

  • [外链图片转存中…(img-30GNC9NC-1681915855224)]

  • 通配符:读取

  • [外链图片转存中…(img-2qx26DO7-1681915855224)]

  • 有限制条件的通配符

  • ?(-…,+…) extends <= super >=

  • [外链图片转存中…(img-fROlq9MX-1681915855225)]

/*
    3.有限制条件的通配符的使用。
        ? extends A:
                G<? extends A> 可以作为G<A>和G<B>的父类,其中B是A的子类

        ? super A:
                G<? super A> 可以作为G<A>和G<B>的父类,其中B是A的父类

     */
    @Test
    public void test4(){

        List<? extends Person> list1 = null;
        List<? super Person> list2 = null;

        List<Student> list3 = new ArrayList<Student>();
        List<Person> list4 = new ArrayList<Person>();
        List<Object> list5 = new ArrayList<Object>();

        list1 = list3;
        list1 = list4;
//        list1 = list5;

//        list2 = list3;
        list2 = list4;
        list2 = list5;

        //读取数据:
        list1 = list3;
        Person p = list1.get(0);//可以用Person,Object,因为小于等于Person
        //编译不通过
        //Student s = list1.get(0);//因为不确定是不是Student/重要///

        list2 = list4;
        Object obj = list2.get(0);//这里只能是Object,因为大于等于Person,Object能确定
        编译不通过
//        Person obj = list2.get(0);

        //写入数据:
        //编译不通过
//        list1.add(new Student());
        
        //编译通过
        list2.add(new Person());//这里就可以往小的写,因为最小是Person,你只要往里传Person子类就可以
        list2.add(new Student());

    }

[外链图片转存中…(img-szU59kNK-1681915855225)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/437949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务器初始化

Linux基础系类 提示&#xff1a;个人学习总结&#xff0c;仅供参考。 一、Linux系统部署 二、服务器初始化 提示&#xff1a;文档陆续更新整理 服务器初始化 Linux基础系类简介一、配置IP地址二、配置YUM源&#xff08;yum本地源和yum网络源&#xff09;1.简介2.准备工作3.配置…

数据结构与算法——深度寻路算法

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段&#xff0c;因为最近参加新星计划算法赛道(白佬)&#xff0c;所以加快了脚步&#xff0c;果然急迫感会增加动力>——…

SQL Server的行级安全性

行级安全性 一、前言二、描述三、权限四、安全说明&#xff1a;侧信道攻击五、跨功能兼容性六、示例 一、前言 行级别安全性使您能够使用组成员身份或执行上下文来控制对数据库表中行的访问。 行级别安全性 &#xff08;RLS&#xff09; 简化了应用程序中的安全性设计和编码。…

MyBatis(一)

一、简介 1.1 什么是MyBatis MyBatis是一个持久层框架&#xff0c;既然和持久层有关那就可以简单理解成和数据库有关&#xff0c;既然是框架那么就肯定是为了简化数据库有关的操作。由于传统的JDBC代码处理数据库有关的代码太复杂&#xff0c;所以出现了MyBatis来快速处理数据…

RK3588调试CAN驱动记录

背景 汽车芯片公司&#xff0c;IP领导随机分配&#xff0c;主要任务是各种IP的硅前验证&#xff0c;包括uboot命令行和Linux kernel验证。工作两年半没什么外设经验也没做过CAN总线(前两年在一家芯片公司做各种加解密IP的开发)&#xff0c;一个人的摸索过程可以说是充满了坎坷…

花有约,春不迟|弘博创新2023塘朗山到梅林水库穿越活动

花有约,春不迟|弘博创新2023塘朗山到梅林水库穿越活动 花开有约&#xff0c;春日不迟 4月16日&#xff0c;正值春暖花开的季节&#xff0c;周末闲暇无事&#xff0c;弘博创新的朋友们相聚一起&#xff0c;从塘朗山龙珠门到梅林水库&#xff0c;体验一场感受大自然&#xff0c;开…

dsl语法

查询 1.查询所有&#xff08;默认有分页查询&#xff09; #查询所有 GET /hotel/_search {"query": {"match_all": {}} } 2.match查询&#xff08;条件查询&#xff09;-----包含四川和外滩的信息&#xff0c;信息匹配度越高越靠前&#xff0c;两者存在一…

知识库管理系统对于企业有哪些作用及优势?

知识库管理系统是一种通过集成多种技术手段&#xff0c;将企业内部知识进行收集、整理、存储、分析和共享的信息管理系统。知识库管理系统可以帮助企业管理和利用企业内部的知识&#xff0c;提高企业的创新能力和竞争力。 知识库管理系统的作用 1、促进企业内部知识的流通和共…

AutoGPT 安装指南,使用避坑要点

最近&#xff0c; AIGC 中最火的可能就当属于 AutoGPT 了吧&#xff0c;首先简单介绍一下AutoGPT 背景 AutoGPT 是基于 ChatGPT API 接口开发&#xff0c;项目首推 GPT-4 模型&#xff0c;但 OpenAI 账号 API 只有 gpt-3.5-turo 权限同样也可以使用。 项目在 github 上获取的…

Java多线程初阶(二)(图片+源码+超详细)

在这之前可以参照&#xff1a;Java多线程初阶&#xff08;一&#xff09;这篇文章&#x1f43b; 目录 1. 线程的状态 2. 线程安全问题 2.1 引出线程安全问题 2.2 线程安全问题出现的原因 2.3 解决线程安全问题的方法 2.4 synchronized关键字详解 2.5 volatile关键字详解…

【LeetCode】145.二叉树的后续遍历

1.问题 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序 遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;roo…

Linux搭建我的世界MC服务器 - MCSM面板 【外网远程联机教程】

文章目录 1. 安装JAVA2. MCSManager安装3.局域网访问MCSM4.创建我的世界服务器5.局域网联机测试6.安装cpolar内网穿透7. 配置公网访问地址8.远程联机测试9. 配置固定远程联机端口地址9.1 保留一个固定tcp地址9.2 配置固定公网TCP地址9.3 使用固定公网地址远程联机 Linux使用MCS…

程序地址空间(上)

目录 &#xff1a; 1.C/C程序地址空间回顾&#xff08;C语言&#xff09; 2.通过一段代码&#xff08;引出进程虚拟地址空间&#xff09; 3.进程虚拟地址空间是什么 ------------------------------------------------------------------------------------------------------…

项目制作4

今天对文件录入,进行了测试,结构体录入还是非常的好用的 对地图也有了新的制作,但是地图上的鼠标操作遇到了问题 难以解决,一搞就是内存问题给我下坏了 哎我选择认了,用控制台来显示公告算了 for (int j 1;j < f->Points;j) fread(&f->drops[j], sizeof(drop…

微服务---Docker的基本使用

Docker 1.初识Docker 1.1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&#xff0c;环境不…

虹科分享 | 基于流的流量分类的工作原理 | 网络流量监控

许多ntop产品&#xff0c;如ntopng、nProbe和PF_RING FT等都是基于网络流的。然而&#xff0c;并不是所有的用户都详细知道什么是网络流&#xff0c;以及它在实践中是如何工作的。这篇博客文章描述了它们是什么以及它们在实践中是如何工作的。 什么是网络流量 网络流是一组具…

C++11新特性(下)

文章目录 1. 可变参数模板1.1 empalce相关接口函数 2. lambda表达式2.1 C98中的一个例子2.2 lambda表达式语法2.3 函数对象与lambda表达式 3. 包装器3.1 function包装器3.2 bind 1. 可变参数模板 C11的新特性可变参数模板能够让您创建可以接受可变参数的函数模板和类模板。相比…

Matlab与ROS---Action与Gazebo(六)

0. 简介 对于ROS1而言&#xff0c;其在Matlab当中相较于ROS2还有一些比较高级的用法&#xff0c;比如说我们接下来要说的Action和Gazebo仿真。 1. ROS Action ROS的Action行为模式当中也存在有一个客户端到服务器的通信关系。Action行为模式使用ROS主题将目标消息从客户机发…

【技巧】飞书多维表格零代码连接飞书多维表格,实现表单自动同步

飞书多维表格用户使用场景&#xff1a; 在公司日常工作中&#xff0c;各个部门使用飞书多维表格记录签订合同、文件审核、归档等事务&#xff0c;常需要行政人员辅助处理&#xff0c;将这些子表单的数据汇总到一个总表单中。但每个部门对应的事务较为复杂&#xff0c;子表单数量…

OpenCV例程赏析

OpenCV例程赏析 ①SITF特征检测匹配(目标查找)例程&#xff1a;…\opencv\sources\samples\python2\find_obj.py(asift.py) #!/usr/bin/env python ‘’’ Feature-based image matching sample. Note, that you will need the https://github.com/opencv/opencv_contrib r…