java数据结构学习总结--1
第一章知识总结:
一、概述
1.数据结构:即数据在计算机中的储存结构,即如何来储存这些数据。最常见的储存方式如采用:数组,链表,栈,堆,树,图等。
2.算法:即对这些结构中的数据进行各种处理;即如何来处理这些数据。
3.数据结构和算法能够用来解决什么问题呢?可以用来对现实世界数据进行储存,程序员的工具,用于建模。
所谓的现实世界的数据:即那些描述于计算机外部的物理实体数据。
程序员的工具:即并不是所有的储存结构都用来储存现实世界的数据,如栈,队列等结构可以当做工具来简化一些操作。
建模:即现实世界的情况构造模型,最常用的就是图,图可以用来表示城市之间的航线,电路中的连接等任务之间的安排关系。
二、算法概述:
1.对于大多数的数据结构来说,都需要掌握对数据的CRD操作;另外就是重点掌握排序;然后就是递归操作。这些都是算法的核心。
2.一些常用到的定义:
1)数据库:数据储存的库,数据库中的每一条数据都被认为是同样的格式;此外文件术语也代表同样的意思。
2)记录:数据库中的每一条数据或则一个单元就是记录,为储存信息提供了一个结构格式。
3)字段:一条记录经常被划分为几个字段,一个字段中保存某一种特定的数据。
在java语言中,类对应于表,一个类的实例化对象对应找一个记录,而对象中定义的各个成员变量对应于字段。
4)关键字:在数据库中查找一条记录,需要指定记录的某一个字段为关键字,通过这个特定的关键字来查找。
三、面向过程编程与面向对象编程
1.面向对象的编程的产生,是因为面向过程的编程存在两个问题:
1)程序与现实世界缺乏对应关系,意思是指在面向过程的编程中数据和方法是分开储存的,两则没有什么必然的关联关系,很难去模拟现实世界的数据,如人,人可以有吃饭,跑步等行为,另外还有身高,体重等属性,采用面向过程的编程很难将其抽象到一起来,而唯一的概念就是储存在程序员脑海中,但是当有多个这样的对象的时候,那么程序员就会产生混乱。
2)程序内部结构出现的问题:即在面向过程的编程中,是将程序划分为一个一个的方法,即注重的是方法,而没有重视数据,没法做到使数据对存取它的方法可用,而对其它方法而隐藏,数据呈现的状态要么是全局的变量,要么是局部变量。
正因为上面的问题,而产生了面向对象的编程:
1)对象:对象中包含了数据和方法,即实现了整合,更好的去实现了和现实世界数据的对应关系。
2)类:类是对象的模板,因为同一个类型的对象是可以有多个的,所以对象是类的实例。
3)创建对象:在java中创建一个对象,必须使用关键字new,在创建对象的同时,需要将一个引用储存到一个具有合适的类型的变量中。另外,创建对象也称作为实例化对象,因此常把对象叫做类的实例。
4)访问对象的方法:在java中通过点(.)运算符可以访问对象中的某个方法和成员变量。
四、面向对象的程序:
package cn.mdj.data.number_one;
public class Demo01 {
public static void main(String[] args) {
//开辟账户
BankAccount ba1 = new BankAccount(100.0);
System.out.println("before transaction:");
System.out.println(ba1.display());
//存款
ba1.deposit(75.55);
//取款
ba1.withdraw(21.2);
System.out.println("after transaction");
System.out.println(ba1.display());
}
}
class BankAccount {
private double account;
//构造方法,开辟一个新的账户
public BankAccount(double account){
this.account = account;
}
//存款
public void deposit(double amount){
this.account += amount;
}
//取存
public void withdraw(double amount){
this.account -= amount;
}
//查看账户
public double display(){
return this.account;
}
//set get 方法
public double getAccount() {
return account;
}
public void setAccount(double account) {
this.account = account;
}
}
总结:
一个类中的数据字段(成员变量)经常被设置为私有的,而方法经常是公有的,这样可以保护数据,防止被其它类中的方法所修改。所有外界的实体要想访问一个类中的数据,必须使用哪个类自己的方法。这便是面向对象编程的重要特性之一:封装的特性。
五、继承和多态
在面向对象的编程中,还有两个重要的特征即:继承和多态。
继承:继承是指由基类扩展或派生形成一个新类,在这个扩展的新类中拥有基类的所有成员。在java语言中,继承又称为子类化,基类被称为父类,扩展类被称为子类。
继承的最大好处在于提高代码的重用性。
多态:比如java中的重载和覆写都是多态的体现,在如对象的多态向上转型和向下转型都体现了多态。即同一方法处理不同的对象,或则说同一方法被不同的对象调用,不同类的对象执行不同的方法都体现了多态。多态的好处在于体现了代码的灵活性。
六、C++和java的不同之处:
1.Java和C++的最大不同之处在于:java中没有指针。而本质上是在java中只是显示的摆脱了指针,但实质是指针仍旧以储存地址的形式埋藏在程序的深处。
1)引用:在java中虽然没有指针但是有引用,引用中储存的是一个对象的地址,而对象真正储存在内存空间中的某个地方,引用并不是对象本身。要注意在java中对基本数据类型和对象的处理是不同的。
2)赋值:如:bc1 为某个对象的引用,bc2=bc1; 那么在C++中,即代表将一个名为bc1的对象的所有数据拷贝到了另一个名为bc2的对象中。这样在程序中就存在了两个含有相同数据的对象。然而在java中,这条赋值语句只是代表向bc2中拷贝了bc1指向的储存地址,即现在bc1和bc2实际上指向的是同一个对象,它们都这个对象的引用,在程序中只有一个对象存在。
3)new操作符:在java中任何对象的创建都必须要使用到new关键字,但new关键字在java中返回的是一个引用,而不像C++中返回的是一个指针。
用new关键字申请空间以后如何去释放不再使用的空间,在C++中采用delete。在java中,则因为垃圾回收机制的存在,会自动每隔一段时间就会去查看是否存在垃圾,然后自动回收。
4)参数:在C++中指针经常被用来进行对象之间的传递,从而避免拷贝一个大的对象的系统开销。在java中,对象经常以引用的形式传递。
然而,基本数据类型总是通过它的值来传递的。即由方法创建一个新的变量,并将参数的值复制到这个新的变量中去。
5)相等的判断:对于基本数据类型,java和C++是一样的,可以通过相等操作符(==)来判断两个变量是否包含有相同的值。
但对于引用数据类型则不同了,在C++中可以通过==操作符来判断对象的内容是否相同;但是在java中==操作符判断的这个对象的引用是否相同,即判断的是它们是否指向的是同一对象,而并不是对象的内容。在java中要判断两个对象中是否包含有相同的数据,则要使用equals方法来进行判断。
2.重载操作符
1)在java中没有重载操作符,即没有像C++中那样可以重新定义+,*,= 等操作符的功能。
3.基本数据类型
在java中基本数据类型包括:数值型和字符型以及布尔型即:
byte short int long float double char boolean
依次的默认值为:
0 0 0 0 0.0 0.0 '\u0000' false
和C++的主要不同之处有:
1)在C++中的布尔型,可以采用非0即真来取决true 和false;但是在java中布尔型的值只能是true 和 false 两种没有什么非零即真的说法。
2)在C、C++ 中int 型大小可能不同,取决于它们的运行的计算机环境;在java中,一个int型变量的字节永远是4个字节即32位。
4.输入和输出的不同:
C++ 中采用的是 cout cin来进行输入和输出;而在java中的输出采用的是:
输出:
可以通过下面的语句来输出任何的基本数据类型,以及String类:
System.out.println();
System.out.println();
print() 方法是将光标停在同一行;而println()方法是将光标移至到下一行开始。
输入:
Java中的输入比较麻烦:
输入字符串:通常有两种方法:一种是利用Scanner类,另外就是利用BufferedReader类。
Scanner类比较常用,也比较简单如下面:
package cn.mdj.data.number_one;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.next(); //返回一个字符串
int i = scanner.nextInt(); //返回一个整型
double d = scanner.nextDouble();//返回一个double
System.out.println(d);
System.out.println(i);
System.out.println(s);
}
}
对于BufferedReader类读取输入,即缓存读入也需要知道:
package cn.mdj.data.number_one;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Demo02 {
public static void main(String[] args) {
try {
System.out.println(Demo02.getString());
System.out.println(Demo02.getChar());
System.out.println(Demo02.getInt());
System.out.println(Demo02.getDouble());
} catch (IOException e) {
e.printStackTrace();
}
}
//读取字符串的方法
public static String getString() throws IOException{
System.out.println("请输入:");
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine(); //读取一行数据
return s;
}
//读取字符的方法:
public static char getChar() throws IOException{
String s = Demo02.getString();
return s.charAt(0);
}
//输入整数
public static int getInt() throws IOException{
String s = Demo02.getString();
int i = Integer.parseInt(s);
return i;
}
//输入浮点型
public static double getDouble() throws IOException{
String s = Demo02.getString();
double d = Double.parseDouble(s);
return d;
}
}