《Java300集》基础知识-day5

目录

Java字符串和回调机制

(1)字符串(String)

(2)字符串常用方法

(3)回调机制

(4)组合模式

(5)栈、堆、方法区小总结


Java字符串和回调机制

(1)字符串(String)

public class TestString {
    public static void main(String[] args) {
        String str = "abc";
        String str2 = "abc";
        String str3 = new String("abc");
        String str4 = "18"+10; //不是加法,是字符串连接符
        System.out.println(str4);

        System.out.println(str == str2);  //实际上比较的是地址,地址是相等的
        System.out.println(str == str3);  //str3是新建了一个对象,地址变了

        //通常比较字符串是使用equals,实现字符串值(内容)的比较,而不是地址
        System.out.println(str.equals(str2));
    }
}

运行结果:1810
                   true
                   false
                   true

重点:比较字符串的内容是使用equals,实现字符串值的比较,==是比较地址是否相等。

Java有三种常量池:1.全局字符串常量池。  2.class文件常量池。  3.运行时常量池。

(2)字符串常用方法

《Java300集》基础知识-day5

public class StringTest1 {
    public static void main(String[] args) {
        String s1 = "core Java";
        String s2 = "Core Java";
        System.out.println(s1.charAt(3));  //提取下标为3的字符
        System.out.println(s2.length());  //字符串的长度
        System.out.println(s1.equals(s2));  //比较两个字符串是否相等
        System.out.println(s1.equalsIgnoreCase(s2));  //比较两个字符串(忽略大小写)
        System.out.println(s1.indexOf("Java"));  //字符串s1中是否包含Java
        System.out.println(s1.indexOf("apple"));  //字符串s1中是否包含apple
        String s = s1.replace(' ', '&');  //将s1中的空格替换成&
        System.out.println("result is :" + s);
    }
}

(3)回调机制

回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口,简单点说明就是:A类中调用B类中的C方法,然后B类中的C方法中反过来调用A类中的D方法,那么D这个方法就叫回调方法

举例

背景1- class People1实现接口CallBack
背景2- class People1包含class People2的引用
背景3- class People2有一个参数为CallBack的execute方法
接下来  People1 的对象的askQuestion方法会先调用People2的execute方法
最后      执行完askQuestion方法会调用 People2 的execute方法,并在这之前同样会先调用People1的answer方法。

简单说就是实现了A.1方法调用B.1方法,然后B.1方法调用了A.2方法,最后A.2方法调用了B.2方法。(A,B是类)

public class TestCallBack {
    public static void main(String[] args) {
        People2 p2 = new People2();
        People1 p1 = new People1(p2);
        p1.askQuestion("你会这个问题吗");

    }
}

interface CallBack{
    public void answer(String result);
}

class People1 implements CallBack{
    private People2 people2;
    public People1(People2 people2){  //类A引用类B
        this.people2 = people2;
    }

    public void askQuestion(String question){
        people2.execute(People1.this, question); // 类名.this表示这个类名所代表的类的对象
    }

    @Override
    public void answer(String result) {
        System.out.println("2号告诉1号的答案是:" + result);
    }
}

class People2{
    public void execute(CallBack callBack, String question){
        System.out.println("1号的问题是:"+question);
        try{
            Thread.sleep(1000);  // 模拟2号的思考时间
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        String result = "我知道答案了";
        callBack.answer(result);
    }
}

《Java300集》基础知识-day5

回调机制本质是利用Java的动态绑定技术。

(4)组合模式

组合模式是将对象组合成树形结构以表示“部分-整体”的层次结构。

组合模式使得用户对单个对象和组合对象的使用具有一致性。

class Cpu {
    public void run() {
        System.out.println("quickly.........");
    }
}
class MainBoard {
    public void connect() {
        System.out.println("connect...........");
    }
}
class Memory {
    public void store() {
        System.out.println("store........");
    }
}
public class Computer {
    Cpu cpu;
    Memory memory;
    MainBoard mainBoard;
 
    public void work() {
        cpu.run();
        memory.store();
        mainBoard.connect();
    }
     
    public static void main(String[] args) {
        Computer computer = new Computer();
        computer.cpu = new Cpu();
        computer.mainBoard = new MainBoard();
        computer.memory = new Memory();
        computer.work();
    }
}

运行结果:

《Java300集》基础知识-day5

(5)栈、堆、方法区小总结

栈内存:

1. 每个线程私有,不能实现线程间的共享。  2. 局部变量存放于栈中。  3.栈是由系统自动分配的连续内存空间,速度快。

堆内存:

1.放置新生成的对象、非静态常量等。  2.堆是一个不连续的内存空间,分配灵活但速度慢。

方法区:

1.被所有线程共享。 2.用来存放程序中永远是不变或唯一的内容(类代码信息、静态变量、字符串常量)。

另外补充:非静态类可以访问静态类属性,静态类不可以访问非静态类属性

 

上一篇:2021大厂面试题(一)


下一篇:day5注释