学习笔记-java核心技术卷一

整理下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!'");
   }
}
  1. java对大小写敏感
  2. 关键字public :访问修饰符,用于控制程序的其他部分对于这部分代码的访问级别
  3. 关键字class:java程序中的全部内容都包含在类中,java程序的所有内容都应该放置在类中
  4. class后紧跟类名,类名的命名格式:以大写字母开头的名次,使用骆驼命名法,是数字和字母的组合
  5. 源文件的文件名必须与公共类的文件名相同,并以.java做扩展名
  6. 运行编译程序时,java虚拟机从指定类的main方法开始执行,每一个java程序都必须要有一个main方法
  7. java用{}花括号划分程序的各个块,任何方法的代码都以{开始,用}结束,我们一般会把匹配的花括号上下对齐,java执行忽略空格符号
  8. 每个句子必须用分号;结束,回车不是结束标志,因此需要时可以将一条语句写在多行上
  9. java的通用语法是:object.method(parameter)等价于于函数调用,点号用于调用方法
  10. 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来进行实现的。

 二叉树的遍历:先序遍历、中序遍历、后序遍历

先序遍历:根-左-右

中序遍历:左-根-右

后序遍历:左-右-根

一定要记住,以上的顺序不仅针对整个大的二叉树而言,也是每个内部的子二叉树的遍历顺序,只有根据这种规律才能的出每种独一无二的序列

三大属性

原文地址:https://www.cnblogs.com/zhuwf/p/12431395.html