GuangchaoSun's Blog

1.2 Data abstraction

抽象数据类型(ADT)是一种能够对使用者隐蔽数据表示的数据类型。

对象

所有对象都有三大特性:

  • 状态:即数据类型中的值
  • 标识:能够将一个对象区别于另一个对象
  • 行为:数据类型的操作

创建对象:每当用例调用了new,系统就会:

  1. 为新的对象分配存储空间
  2. 调用构造函数初始化对象中的值
  3. 返回该对象的一个引用

方法的每次触发都是和一个对象相关的

实例方法和静态方法:实例方法可以访问并操作实例变量

对比 实例方法 静态方法
举例 heads.increment() Math.sqrt(2.0)
调用方式 对象名 类名
参量 对象的引用和方法的参数 方法的参数
主要作用 访问或改变对象的值 计算返回值

使用对象

  • 声明该类型的变量,以用来引用对象
  • 使用关键字new触发能够创建该类型的对象的一个构造函数
  • 使用变量名在语句或表达式中调用实例方法

将对象作为返回值
Java中的方法只能有一个返回值,如果我们想返回多个值怎么办?返回对象就可以了

对象数组实际上是对象的引用组成的数组

构造函数

构造函数类似于静态方法,但它能够直接访问实例变量并且没有返回值。一般来说,构造函数的作用是初始化实例变量,每个构造函数都将创建一个对象并向调用者返回一个该对象的引用。

作用域:

  • 参数变量的作用域是整个方法
  • 局部变量的作用域是当前代码段中它的定义之后的所有语句
  • 实例变量为该类的对象保存了数据类型的值,作用域是整个类

Java的字符串API

public class String
String() 创建一个空字符串
int length() 字符串长度
int charAt(int i) 第i个字符
int indexOf(String p) p第一次出现的位置,没有则返回-1
int indexOf(String p, int i) p在i个字符后第一次出现的位置
String concat(String t) 将t附在该字符串末尾
String subString(int i, int j) 返回第i到j-1个字符作为字符串
String[] spilt(String delim) 使用delim分隔符切分字符串
int compareTo(String t) 比较字符串
boolean equals(String t) 该字符串的值和t的值是否相等
int hashCode() 散列值

判断字符串是否是一条回文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//判断字符串是否是一条回文
public static boolean isPalindrome(String s){
int N = s.length();
for (int i=0; i < N/2; i++) {
if (s.charAt(i) != s.charAt(N-1-i))
return false;
return true;
}
}
//从一个命令行参数中提取文件名和扩展名
String s = args[0];
int dot = s.indexOf(".");
String base = s.subString(0, dot);
String extension = s.subString(dot+1, s.length());
//打印标准输入中所有含有通过命令行指定的字符串的所有的行
String query = args[0];
while (!StdIn.isEmpty()){
String s = StdIn.readLine();
if (s.contains(query)) StdOut.println(s);
}
//以空白字符为分隔符从StdIn中创建一个字符串数组
String input = StdIn.readAll();
String[] words = input.split("\\s+");

web exercise

6 A string s is a circular rotation of a string t if it matches when the characters are circularly shifted by any number of positions; e.g., ACTGACG is a circular shift of TGACGAC, and vice versa. Detecting this condition is important in the study of genomic sequences. Write a program that checks whether two given strings s and t are circular shifts of one another.
solution:

1
(s.length() == t.length())&&(s.concat(s).indexOf(t) > 0)

7 recursive(递归的)loop:

1
2
3
4
5
6
7
8
public static String mystery(String s)
{
int N = s.length();
if(N <= 1) return s;
String a = substring(0,N/2);
String b = subString(N/2,0);
return b + a;
}//Reverse the string