整理下core of java
第三章、java的基本程序设计结构
一个简单的java应用程序
一个简单的java应用程序,概览下java的语法
public class FirstSample { public static void main(String[] args) { System.out.println("We will not use 'Hello, World!'"); } }
- java对大小写敏感
- 关键字public :访问修饰符,用于控制程序的其他部分对于这部分代码的访问级别
- 关键字class:java程序中的全部内容都包含在类中,java程序的所有内容都应该放置在类中
- class后紧跟类名,类名的命名格式:以大写字母开头的名次,使用骆驼命名法,是数字和字母的组合
- 源文件的文件名必须与公共类的文件名相同,并以.java做扩展名
- 运行编译程序时,java虚拟机从指定类的main方法开始执行,每一个java程序都必须要有一个main方法
- java用{}花括号划分程序的各个块,任何方法的代码都以{开始,用}结束,我们一般会把匹配的花括号上下对齐,java执行忽略空格符号
- 每个句子必须用分号;结束,回车不是结束标志,因此需要时可以将一条语句写在多行上
- java的通用语法是:object.method(parameter)等价于于函数调用,点号用于调用方法
- java方法可以没有参数,也可以有一个两个N个参数,但是没有参数也要有空括号()
(一般方法首字母是小写,基本类型也是小写,其他对象类名接口名首字母大写,后续单词都用驼峰命名法)
数据类型
java是一种强类型的语言,必须为每一个变量声明一种类型,在java中一共八种基本类型
四种整型 int(4字节) short(2字节) long(8字节) byte(1字节 -2^7 ~2^7 ) [bait]
两种浮点型 float(4字节) double(8字节)
char类型 表示单个字符,如’A‘,常用于表示字符常量,表示Unicode编码
布尔类型 只有两个值,true 和 false,用来判断逻辑条件,整型和布尔值之间不可以相互转换
声明变量
举例 int num;
类型名在变量名之前,并且这条语句以分号结束
变量名是一个以字母开头的由字母或数据构成的序列,java中的字母指Unicode字符,包括下划线等
变量初始化
声明一个变量以后,一定要使用赋值语句对变量进行显式的初始化,不可使用未被初始化的变量
对于已声明的变量进行复制的格式是,变量名放在等于号左侧,响应的java表达式处于等于号右侧
int num;
int num = 10;
也可以把变量的初始化和声明放在一行,比如int num = 10;
常量
java中,使用final关键字指示常量,表示这个变量只能被赋值一次,一旦被赋值后,就不能再更改了,一般常量名全部大写
在java中,经常会希望某个变量可以在一个类中的多个方法使用,通常将这些变量称为类变量,可以用关键字static final设置一个类常量
类常量定于于main方法外面,那么这个类的其他方法也能使用这个常量,如果类常量被声明为public,那么其他类也能使用这个常量
如果想要该常量在其他类的方法也可以使用,那么就加上public关键字,只在此类的方法使用,那么加上private关键字
运算符
+ - * / % 加减乘除取余,当参与/运算的都是整型时,表示整数除法,如果有一个是浮点数,那么是浮点除法
可以在赋值语句中,使用一种简化的格式书写二元算数运算符
例如 x + = 4;等价于x = x+ 4
自增和自减运算符,n++相当于将变量n的当前值+1,n--将n的值减一,自增和自减运算符需要注意两个点
- 自增和自减运算符更改了变量的值,所以操作数不可以是数值,比如4++是不合法的
- 自增和自减运算符可以前缀形式,++n和n++结果一样,但是在数学表达式中,++n使用+1之后的值,n++使用当前值,最好不要在表达式里中用
关系运算符
关系运算符 == 检验相等 !=校验不等于 < > <= >=
逻辑运算符 && 逻辑与 || 逻辑或 !逻辑非,逻辑运算时,如果第一个操作数已经能确定表达式的值,那么不会计算第二个操作数
三元运算符问号 condition?exp1:exp2 条件为真时计算第一个表达式,条件为假时计算第二个表达式,并返回对应表达式的值
位运算符
在处理整型数值时,可以直接对组成整型的各个位进行操作,这意味着可以使用屏蔽技术获得整数中的各个位
&与|或^异或~非
关于异或,如果符号左右两值不相等,异或结果为1,相等结果为0;
强制类型转换=(类型名)变量
枚举类型 enum Size {q,w,d };
字符串,java基本类型里没有字符串类型,有一个预定义类String,每个用双引号括起来的字符都是String类的一个实例
substring方法可以从较大字符里获得一个子串
s.substring(n,m)从位置为s字符串的位置n的字符到位置m-1的字符,总长度为m-n,比如(0,3)是0 1 2 三个字符
允许用+号拼接两个字符串,且如果+号连接的有非字符串,后一个被自动转换成字符串并拼接
JAVA字符串不可更改,因为String类没有提供用于直接修改字符串的方法,如果想更改,可以用substring截取后再用+号拼接的方式
String类的equals方法可以比较字符串是否相等,不可以用==,用==比较的是字符串所在的位置
String类的一些方法,假设一个String str =“abcdef”;
int i =str.length() ; 返回一个int值,为字符串的长度,6
char c=str.charAt(2);返回一个char值,为位置2的字符,也就是c
char c[] =str.toCharArray() ;返回一个char数组类型
for
(
int
i = 0; i < c.length; i++) {};可以c数据遍历
int a1 = str.indexOf("bc",0);返回bc字符串第一次出现的开始位置,如无返回-1
int q2 = str.lastIndexOf("bc");返回bc字符串最后一次出现的开始位置,如无返回-1
equals(String other) ;比较字符串是否相等,相等返回true
equalsIngnoreCase(String other);比较字符串是否相等,忽略大小写,相等返回true
String s = str.toUpperCase(); 返回全部大写的字符串
String s = str.toLowerCase();返回全部小写的字符串
trim();删除字符串前后的空格
contains(String other) ;是否包含对应的字符串,包含返回true
startsWith(String other);是否以某字符串开始,是返回true
endsWith(String other);是否以某字符串结束,是返回true
String s =str.replace(char oldchar,char newchar)用newchar替换str里的所有oldchar
string 和int之间的转换
string转换成int :Integer.valueOf("12")
int转换成string : Integer.valueOf(12)
由于java String的拼接比较麻烦,所以可以使用Stringbuilder 类,也可以成为String的构建器
Stringbuilder b = new StringBuilder();
int length()
StringBuilder append(String str)拼接一个字符串并返回this
StringBuilder append(char c)拼接一个字符并返回this
void setCharAt(int i ,char c) 将位置i的代码单元设置为c
StringBuilder insert(int i,String s)在i位置插入一个代码单元并返回this
StringBuilder insert(int i,char c)在i位置插入一个代码单元并返回this
StringBuilder delete(int n,int m) 删除从n开始到m-1的代码单元并返回this
String toString()返回一个和构建器内容相同的字符串
(java中计算位置都是从0开始的)
打印输入输出到控制台
输入:略
输出 System.out.println(x);
控制流程
java使用条件语句和循环结构确定控制流程
一对花括号括起来的若干条java语句叫做块,块确定了变量的作用域
块可以嵌套,不能在嵌套的两个块中声明同名的变量
条件语句
条件为真时,执行一条语句
if(condation)statement
//注意观察这个条件语句,if直接跟括号,括号里放条件,如果是一条,可以直接在小括号里放
如果希望条件为真时,执行多条语句,那么就要使用块,也就是用中括号把代码扩起来
if(condation)
{statement1;
statement2;
}
带else的情况就是 if(condation) statement1 else statement2
注意块的逻辑是若干条java语句,所以如果条件语句嵌套,也是利用中括号来实现的
循环语句
while(condation)statement
如果条件为ture时,循环执行之后的语句或者语句块
//注意,这里可以看出条件语句都在小括号里
如果条件为false 就什么也不执行
如果想要其后的语句至少执行一次,那么使用
do statement while(condation)
do while是先执行语句或者语句块,再检验循环条件,如果为true继续执行语句,为false继续向下执行
确定循环
for循环是支持迭代的一种通用结构,利用每次迭代之后更新的计数器或者类似变量来控制迭代次数
比如把1到10的数输出发到屏幕上
for(int i=1;i<=10;i++)
System.out.println(i);
for (计数器初始化;每次新一轮循环前需要检测的循环条件;如何更新计数器)
for语句的三个部分应该对同一个计数器变量进行初始化、检测、更新
for语句的第一部分声明的变量,这个变量的作用域就只是for循环的整个循环体,不可在循环体之外使用
那么因此产生两个现象,一是可以在各自独立的不同的for循环定义同名的变量
第二个是,如果我们想要在循环体之外使用计数器的终值,要确保这个变量在循环语句的前面而且在外部声明!如下
int i;
for (i=1;i<=10;i++){...}
for循环是while循环的一种简化形式,可以使用while循环写出同样的逻辑
还有一种for each循环,可以依次处理数组中的每个元素,而不必考虑指定下标
for (某变量:集合) 语句块 比如for(int element:a)
定义一个某变量用来暂存集合中的每一个元素,针对该变量执行语句,达到遍历执行的效果
也就是for each element in a
但是在不希望遍历集合的每个元素,或者循环内部需要下标时,还是需要传统for循环
多重选择:switch
为了避免if else结构在处理多个选项时的笨重,可以使用switch语句
switch语句将执行与选项值相匹配的case开始执行直到遇到break语句,如果无任何匹配case,走default子句
switch(choice)
{case1:
...
break;
case2:
...
break;
default://bad input
...
break;
}
case可以是char byte short int或者其包装类,枚举常量,
如果是枚举常量时,不用在每个标签中指明枚举值,可以由switch的表达式值确定
大数值:略
数组
数组是一种数据结构,用来存储同一类型值的集合,通过一个整型下标可以访问数组中的每一个值,如a[i]
数组变量的声明,数组类型[] 数组变量的名字,比如 int[] a //可以将int[] 理解为整型数组,那么显然a被声明了一个整型数组
给数组a赋值,数组是用new运算符创建的,int[] a= int(100); 该语句创建了一个可以储存100个整数的数组
数组长度也可以是个变量 a=new int(n);创建一个长度为n的数组
创建数组后,如果是数字数组,所有元素初始化为0,布尔类型初始化为false,对象数据初始化为null
数组的初始化也有一种简写形式,可以进行初始化元素值,同时定义数组长度
int[] test ={2,35,6,7};
test =new int[] {2,35,6,7};
要获得数组的元素的个数,可以使用a.length
一旦创建了数组就不能改变它的大小,如果经常需要改变数组大小的,就应该使用另一种数据接口,数组列表(arraylist)
//通过此理解下 【数据结构】的概念
数组拷贝:略
命令行参数
每个java应用程序都有一个带String args[] 参数的main方法,这个参数表明main方法将接收一个字符串数组,也就是命令行参数
数组排序
可以用Arrays类的sort方法快速排序,Arrays.sort(a);
多维数组,声明一个多维数组 double[][] =balances;
多维数组其实是数组的数组,数组的每个元素是包含元素的数组
//需要了解Array类和ArrayList类,使用范围和区别,并因此去看一些算法题,你要举重若轻
对象与类
类是构造对象的模版,由类构造对象的过程称为创建类的实例
java编写的所有代码都位于某个类的内部
封装是将对象的数据和行为组合在一个包里,并对对象的使用者隐藏了的具体实现方式
每个特定的对象都有一组特定的属性值,这些值的集合就是这个对象的当前状态
实现封装的关键是,不能让类中的方法直接访问其他类的实例域,程序仅仅通过对象的方法与对象数据进行交互
对象的三个主要特性:行为,状态,标识
对象的状态只能通过调用方法来实现
OOP的编写思路:首先从设计类开始,然后往每个类里加方法(算法题是直接写方法,所以确定了方法参数和返回即可),经验之谈是名词对应属性,动词对应方法
要想使用对象,首先要构造对象,并指定其初始状态,然后,对对象使用放哪啊高发
方法的构造:java中使用构造器构造新实例,构造器是一种特殊的方法,用来构造并初始化对象
构造器的特点
- 构造器名字与类相同 //构造器首字母大写,不同于其他方法
- 每个类可以有一个以上的构造器
- 构造器可以有0个、1个或者多个参数
- 构造器没有返回值
- 构造器总伴随这new操作符一起被调用
new date() 通过new操作符和构造器方法构造一个对象后,该对象可以传给其他方法,也可以对该对象使用方法
如果希望构造的对象多次使用,可以将对象存放在一个变量中 Date d = new Date();Date是类型声明,d是变量,new操作符号,Date()构造器
d就是一个对象变量,即引用了一个Date对象
修改实例域方法称为修改器方法,习惯上会加上前缀set
仅访问实例域而不修改的方法称为访问器方法,习惯上会加上前缀get
一个完整的程序,应该将若干类组合在一起,其中只有一个类有main方法
最简单的类定义形式:
class 类名{
属性
构造器
方法
}
源文件名(xxxx.java)必须与public的类名一致,在一个源文件中只能有一个公有类,但是可以有任意数目的非公有类
程序员习惯于将每一个类存到一个单独的源文件里
对于某些方法来说,出现在括号里的参数是显式参数,而如果会用到对象本身,这个对象就是隐式参数,关键词this可以表示隐式参数
final 实例域,在每一个构造器执行之后,这个域的值被设置,并且在后面的操作不会再对它进行修改
static 静态域,被static 修饰的属性,属于类,而不属于对象,没有static修饰的属性则每个对象有不同的属性
静态常量,也是一个意思,属于类,而不属于对象,如果不被static修饰,则每个对象都要拷贝一份,比如private final static double PI
静态方法,是没有this参数的方法,即不能对对象本身实施操作的方法,如果一个方法不需要访问对象状态,所需要参数都是显式参数;或者只需要访问类的静态域,可以使用静态类
每个类对象的方法都可以对公有域进行修改,所以一般不要把实例域设计成public
main方法就是个静态方法
值调用:表示方法接收的是调用者提供的值,不可修改
引用调用:方法接收的是调用者提供的变量地址,可修改
JAVA总是按值调用,方法所得到的是所有参数值的一个拷贝
一个方法不可能修改一个基本数据类型的参数
重载:如果一个类中,多个方法有相同的名字,不同的参数,便产生了重载
要完整的描述一个方法,需要指出方法名和参数类型,即一个方法的唯一标识是方法名和参数类型的组合
一个类,最好要有一个无参数的构造器,如果一个构造器都没有,系统会提供一个无参数构造器
如果一个类的实例域有每个构造器都会需要赋值的,可以将其直接在类中赋值
Random() 构造一个新的随机数生成器
int nextInt(int n )返回一个1~ n-1之间的随机数
java允许使用包将类组织起来,使用包的主要原因是确保类名的唯一性
标记public 的类,可以被任意的类使用
标记private的类,只能被定义他们的类使用
如果没有标记,这一部分可以被同一个包的所有方法访问
继承:基于已有的类构造一个类,子类可以继承父类的实例域和方法,在此基础还可以添加新的方法和域,以满足新需求
继承关系的判定,即is -a关系,每个子类对象也是父类的对象
多态
抽象类
抽象方法
ArrayList是一个采用类型参数的泛型类,尖括号中的类型就是数组列表中保存的元素对象类型
ArrayList<Integer> data = new ArrayList<>;
add方法 在数组列表的尾部添加元素 增
void add(int index,T obj) 在index位置插入obj,其他元素向后移动
int size()返回实际包含的元素数目
T set(int index,T obj)用obj覆盖对应index的值
T get(int index) 获取指定位置的元素值
T remove(int index) 删除一个元素,将后面的元素向前移动,被删除的元素由返回值返回
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
Array一旦创建长度无法更改,ArrayList的大小是可以动态变化的
ArrayList可以通过add get remove来对元素做增加 获得 删除操作,Array是通过下标
获取数组的长度的方式也不同
对象包装器
有时,需要将基本类型转换为对象,比如一个新的Arraylist尖括号里不可以放基本类型
所有的基本类型都有一个与之相对的类,这些类称为包装器,比如基本类型int的包装类Integer
对象包装器类是不可变的
ArrayList<Integer> list = new ArrangList<>;
list.add(3);会自动变换成 list.add(Integer.valueOf(3)); 称之为自动装箱
当一个Integer对象赋给一个int值时,会自动拆箱, int n= list.get(i); 会自动翻译成 int n =list.get(i).intValue();
String toString(int i)
int parseInt(String s) 返回字符串s表示的整型数值
Integer valueOf(String s)
接口
回调 :是一种常见的设计模式,在这个模式中,可以指出某个特定事件发生时应该采取的动作
java库中的具体集合
除了Map结尾的类之外,其他类都实现了Colection
都可以使用add size remove
ArrayList
HashSet一种没有重复元素的无序集合
HashMap 一种存储键值对的数据结构
List:可存储相同的值
Set:不可存储相同值
Set的典型实现是HashSet,其主要方法add,remove,contains,均是通过内置的HashMap来进行实现的。
二叉树的遍历:先序遍历、中序遍历、后序遍历
先序遍历:根-左-右
中序遍历:左-根-右
后序遍历:左-右-根
一定要记住,以上的顺序不仅针对整个大的二叉树而言,也是每个内部的子二叉树的遍历顺序,只有根据这种规律才能的出每种独一无二的序列
三大属性