Java 语言(4)

Java 语言(4)

—— from Java course, Prof. Z, Fudan University

1 数据的存储

Java 的数据类型

  • 基本数据类型:short, int, long, double, float, byte, boolean, char
  • 类:变量、方法
  • 引用
    • Element a = new Element(); a 是创建的类的引用。

Java 的内存管理

方法中声明的基本数据类型、对象的引用一般存在栈中

类的成员变量(基本数据类型、对象的引用)一般存在堆中

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Element{
private int n;
private Element next;
public void setNext(Element nextElement){
next = nextElement;
}
}

void example(){
int i = 20;
float f = 2.0;
Element e;
e = new Element();
Element e2 = new Element();
e.setNext(e2);
}

类的方法的实现(代码)只需要存储一份。

static

static 变量

类的变量一般通过类的实例化来分配空间,有些变量是本类所有对象共用。因此引入类的 static 数据(所有实例化对象共享,只存储一份)。

static 方法

类的方法一般通过类的实例化对象来调用,有些方法和对象的实例化数据没有关系。因此引入类的 static 方法。

static 方法

  • 只处理 static 数据
  • 调用方式:类名.方法名(普通方法为:对象名.方法名)

final

final 修饰的类的变量

有些数据不希望在对象创建后被修改,因此引入 final 变量。

final 变量须在分配内存空间时赋值(不能在除了构造方法之外的方法中赋值)。

final 修饰的引用

final 修饰对象的引用,该引用只能指向一个对象,不能再修改,但是被指向的对象的数据可以修改。

final/static

final static 用于修饰常量,例如

1
final static double PI = 3.1415926535;

因为是 static 的,会在对象创建前分配空间;因为是 final 的,必须在分配空间的时候赋值,因此不可以在构造函数中赋值。

2 String 类

String 类的数据

1
private final char[] value;	//存储字串

String 构造之后,字串不能更改,主要原因有:

  • 实现字符串池,复用空间
  • 拷贝时只需要复制引用
  • 多线程安全
  • Hash 值固定,不用重算
1
2
String a = "12345";
String b = a;

创建内容为 12345 的 String 对象,引用赋值 a

将该引用赋值给 b

1
2
String a = "12345";
a = a.concat("67");

创建内容为 12345 的 String 对象 1, 67 的对象 2

对象 1 的引用赋值 a

创建内容为 1234567 的 String 对象,引用赋值 a

String 类的常用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
char charAt(int dex);	// 取字符

String subString(int beginIndex); // 取子串
String subString(int beginIndex, int endIndex);

int length(); // 获取字符串长度

int indexOf(int ch); // 字符串中定位
int indexOf(int ch, int fromIndex);
int indexOf(String str);
int indexOf(String str, int fromIndex);

String concat(String str); // 连接两个字符串

String toUpperCase(); // 大小写转换
String toLowerCase();

boolean endsWith(String suffix); //判断字符串后缀内容

boolean compareTo(String anotherString); // 字符串比较
boolean compareToIgnoreCase(String str);

boolean equals(Object anObject); //判断字符串对象是否相等
boolean equalsCase(String anotherString);

String 对象的 +

Java 不支持操作符重载,只实现了 String 类的 + 重载

  • 类似于 concat
  • 可以 + 各种基本变量,甚至各种对象(先转成字串)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
String a = "a";
String b = "b";
String c = "a";
String ab1 = a + b;
String ab2 = "ab";
String ab3 = a.concat(b);
String ab4 = a + b;
System.out.println(ab1.hashCode()); // 3105
System.out.println(ab2.hashCode()); // 3105
System.out.println(ab3.hashCode()); // 3105
System.out.println(ab4.hashCode()); // 3105
System.out.println(a == c); // true
System.out.println(ab1 == ab2); // false
System.out.println(ab1 == ab3); // false
System.out.println(ab1 == ab4); // false
System.out.println(ab2 == ab3); // false
System.out.println(ab2 == ab4); // false
System.out.println(ab3 == ab4); // false

StringBuffer 与 StringTokenizer

动态更改内容的字串类