目录
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)字符串常用方法
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);
}
}
回调机制本质是利用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();
}
}
运行结果:
(5)栈、堆、方法区小总结
栈内存:
1. 每个线程私有,不能实现线程间的共享。 2. 局部变量存放于栈中。 3.栈是由系统自动分配的连续内存空间,速度快。
堆内存:
1.放置新生成的对象、非静态常量等。 2.堆是一个不连续的内存空间,分配灵活但速度慢。
方法区:
1.被所有线程共享。 2.用来存放程序中永远是不变或唯一的内容(类代码信息、静态变量、字符串常量)。
另外补充:非静态类可以访问静态类属性,静态类不可以访问非静态类属性。