Day 2
Java内存分配
- 栈:方法运行时使用的内存,比如main方法运行,进入方法栈中运行
- 堆:存储对象或数组,使用new来创建的,都存储在堆
- 方法区:存储可以运行的class文件
- 本地方法栈:JVM在使用操作系统功能的时候使用,和我们的开发无关
- 寄存器:给CPU使用
方法
方法是程序中最小的执行单元, 是对代码的封装,从而使代码管理更加简易
方法的定义格式如下:
{
//public static 表示这个方法全局有效,被整个程序所共享
public static typename1 method(typename x,...){
语句体;
return variable of typename1;
}
}
- 方法定义中声明的参数叫做形参,在调用时使用的参数是实参;方法被调用时,将实参的值拷贝给形参
方法的重载
在一个类中定义了多个同名的方法,这些方法的参数和返回类型不同,Java虚拟机会通过参数的不同区分不同的方法
{
public static void fn() {
System.out.println("Hello World");
}
public static int fn(int a) {
return a;
}
}
- 代码中方法的名字相同,但是参数和返回值不同,因此构成重载关系
返回数组类型
在Java中可以类比Rust语言的所有权规则,当返回方法体内部创建的数组时,其所有权发生改变,因此在方法结束时,改数组不会被清除
Java中堆上内存如果没有被指向,没有被使用就会被回收
方法的内存
方法调用时,会在栈上开辟一块空间,方法的数据上都存在这块方法帧中,当方法结束时只会释放在栈上的方法帧,如果在方法调用时,申请了一块堆空间,该空间不会被自动释放
对象(class)
JavaBean
- 类名代表含义
- 成员变量用private修饰
- 提供至少两个构造方法
- 无参构造
- 带全部参数的构造方法
- 成员方法
- 提供每一个成员变量对应的set和get
使用new关键字初始化对象
使用new关键字创建的对象实际值都存储在堆内存上, 而在栈上有一个对对象的引用(地址),同时堆内存上还有一个类模版的地址,指向方法区
this的原理
this代表方法调用者的地址值
格式化输出
Java中可以使用 System.out.printf
进行格式化输出,类比c语言即可
//%s为占位符,会被替换为逗号后面的字符串
System.out.printf("Hello %s!", "World");
占位符 | 说明 | 占位符 | 说明 |
---|---|---|---|
%d | 格式化输出整数 | %o | 八进制输出 |
%s | 格式化输出字符串 | %x | 16进制小写输出 |
%f | 格式化输出浮点数 | %X | 16进制大写输出 |
%c | 格式化输出字符 | %e | 带指数的浮点数 |
System.out.printf("%7.2f", 1.13821);
7表示会用空格补全输出为7位,.2表示保留两位小数
字符串类型(String)
在Java中要掌握的字符串类有:String, StringBuilder, StringJoiner
Stirng
- 使用String不需要导包(import)
- String的内容在创建后不能被更改
- 创建String
//直接创建,系统会检查字符串在串池(堆上)有没有这个字符串,若有则复用,否则创新
String s1 = "abc";
//使用new和构建方法创建
String s2 = new String();
String s3 = new String("hello");
//传递字符数组
char[] chs = {'a', 'b'};
String s4 = new String(chs);
- String的比较
String s1 = "hello";
String s2 = "Hello";
//比较s1 and s2是否值相对
if(s1.equals(s2)) {
System.out.println("true");
}
//使用equalsIgnoreCase比较s1 and s2忽略大小写情况下是否值相等
if(s1.equalsIgnoreCase(s2)) {
System.out.println("`true");
}
- String的索引
使用s.charAt(i)
返回一个char类型的值 - 拼接String
使用String类型变量直接与其它类型的值相加,返回一个String类型的值 - String的截取
substring(int begin, int end)
截取[begin, end)索引的字符串,返回类型是字符串 - Stirng的替换
replace(old, new)
传入旧的字符串和替换的字符串,返回类型是字符串 - String转换为字符数组
str.toCharArray
将字符串转换为字符数组,并返回这个数组
StringBuilder
StringBuilder可以看成一个容器,创建只会里面的内容可以变化
- StringBuilder的作用:可以提高字符串的操作效率
- StringBuilder的构造
StringBuilder sb = new StringBuilder("hello");
- StringBuilder常用的方法
- 添加元素:
sb.append("world")
; - 翻转字符串:
sb.reverse
; - 获取长度:
sb.length()
; - 转换为String:
sb.toString()
;
- 添加元素:
- StringBuilder的使用场景
- 翻转字符串
- 字符串的拼接
StringJoiner
StringJoiner也可以看成是一个容器
- StringJoiner的作用:提高字符串的操作效率
- StringJoiner的构造
StringJoiner(", ","[", "]")
传入三个参数,第一个是间隔符号,第二个是开始符号,第三个是结束符号 - StringJoiner的常用方法
- 添加元素(只能添加字符串类型):
sj.add()
; - 获取长度:
sj.length()
; - 转换为String:
sj.toString
;
- 添加元素(只能添加字符串类型):