基础知识

1.所有的java代码必须写在类里面,java的入口函数 main方法

public static void main(String[] args){ }

public ----访问修饰符

static ----方法是静态的

final 最终的修饰变量的时候需要赋初始值, 并且在修饰类的时候 该类是不能被继承的;

main-----方法名

String[] args -----参数;

 

变量和常量

eg: a=1; a=2; 变量a --- 随时可变 常量 12 ----不可变

 

2.声明一个变量的方式为:

数据类型 变量名; 也可以一开始给以个变量赋值,

数据类型 变量名 = 常量(或者另一个变量);

3.class类:

通过类创建对象的方式: 数据类型 变量名=new 构造方法();

 

this关键词 指向使用对象; 当参数名和属性名相同的时候主要用来区分参数名和属性名,加了this代表属性名;

原则:属性私有化,方法公开化;如果写公共的方法与类没关系的方法可以

使用static方法,缺点,静态方法不能使用类当中的非静态成员; 一档被修饰静态成员,可以直接用类名来调用;

 

4.JVM 分为堆 栈 方法区3部分

堆:以new关键词创建的对象;JDK1.7开始 字符串常量池也移到堆区中存放;

栈:以栈帧的形式存在,每调用一个方法,创建一个站帧,其中保存临时变量和参数;

方法区:保存所有静态成员,(static修饰的);所有类的信息;如果参数是基本类型,那么传递的是值,如果是引用类型,传递的是指向堆区中的内存地址;

 

5.数组:在定义的时候必须声明数组的长度;数组在使用中 可以使用for循环;

还可以使用 for(int i : a){ i一个一个便利数组a中的值

}

对数组中的值进行排序;冒泡排序:规则,相邻元素两两比较交换位置;

选择排序:先选出一个最小的或者最大的 放到边界;

6.数学函数:Math.pow(a,b); a代表的是底数. b代表的是指数;

7.Scanner 扫描器 java.util包下;

Scanner scanner = new Scanner(System.in);从控制台接收输入的内容;

.next();接收下面一次要输入的内容;(一行为单位)

.nextInt();接收输入下面要输入的一次数字;(以行为单位)

.nextLine();接收下一次输入的一行内的数据;(以行为单位)

.next()和nextInt() 不能和nextLine()同时使用

每一行结束的时候,我们手动输入了 换行"\r" 但是用next() 和nextInt()接收的时候,只会接收前面输入的内容, 而把"\r"留下, 而nextLine() 只要见了"\r" 就会默认有一行(会接收);

 

8.异常:运行期出现的错误:观察错误的名字和行号最重要;

java异常是java提供的处理程序中错误的一种机制,程序在执行过程中出现了异常事件,可以生成一个异常类对象,改异常对象封装了异常事件的信息并将被提交给java运行时系统这一过程成为抛出(throw)异常;

当java运行时系统接收到异常对象时,会寻找能处理这一异常的代码,并吧当前的异常对象交给处理,这一过程称为 捕获(catch)异常;

 

.try{可能出现异常的代码;

}catch(cException ae){

一旦try中出现了异常,则执行catch

}finally{

无论怎么都会执行final;

}

 

catch块中必须有和try块中相同的return();并且先finally之后 最后返回return;

异常分类(Throwable)

Error : 称为错误,有JVM抛出,包括动态链接失败,虚拟机错误等,程序不对其做处理;

Exception : 所异常类的父类,一般需要用户显式的声明或者捕获

RuntimeException:一类特殊的异常,如数组下标超出等,产生比较频繁,处理麻烦,(一般可以有系统自动检测用户可不必对其处理)

 

9.Math类 java.lang.Math;提供了一系列静态方法用来科学计算,方法的参数和返回值一般为double类型;

abs()绝对值

acos,asin,atan,cos,sin,tan

sqrt()平方根;

pow(double a,double b)a 的b次幂;

log();自然对数;

max(double a,double b);

min(double a,double b);

random()返回0.0---1.0的随机数;

toDegrees(double angrad);弧度-->角度;

toRadians(double angdeg);角度--->弧度;

 

10.Enum枚举类型

只能够取待定值中的一个;

使用enum关键字;

是java.lang.Enum类型;

 

11.重写equals()

来比较两个对象是不是相同,其中判断的规则可以根据需求自己定义;

 

12.Comparable 泛型接口

compareTo() 用来自定义排序规则; 大于 rerun 1 等于 return 0 小于 return-1;

 

数据类型

java的数据类型分两种

1.基本类型:

byte 1字节 8位

short 2字节 16位

int 4字节 32位

long 8字节 64位

float 4字节

double 8字节

boolean 1字节

char 2字节

 

2.引用类型:

类 (string 属于类)

数组

接口

 

3.源码 反码 补码

 

源码-----原数本身;

反码------符号位不变,其他位取反

补码------反码+1

补码专门用来表示负数,负数的补码为反码+1, 正数的补码就是自己本身;

 

4.运算符:

数学运算符:+ - * / % ++ --; a++先运算 后增加,++a 先加价再运算;

关系运算符:> < == <= >= != 计算出的结果是boolean类型

逻辑运算符: ! && || & | 对boolean类型进行计算

短路语: 只要前一个条件能计算出表达式的值后面都不会再进行;

全路语: | & 需要走完全部的路程;

位运算: & | ^ >> << >>> <<< 全部2进制位数都移动

 

5.if条件语句/循环语句;(循环三要素:计数器 循环条件 计数器更新)

switch case: 循环,break;

循环

while() for(); do{代码块} while{循环条件};

6.强制类型转换;

int i=128;

byte j=(byte)i;

char a=(char)i; a计算出的为ASCII码;

7.String(字符串)类型

String name = new String(); 使用new 创建;

String name = "张三"; 直接赋值, String 的底层是字符数组;

String 之间可以运算, 实现字符串的拼接;

 

String a="asdf";

String b="ads";

 

方法:toUpperCase() 大写转换;

 

float 精确为小数点之后7位;

double

 

 

8.包装类(在比较数字的时候一定要拆包装, 使用)integer在进行比较的时候,如果在8位

以内(-128---127)默认有一个缓存,对象会指向缓存的地址;

通常情况下,类下的属性都应该定义成包装类;

包装类都是引用类型;

 

byte 1字节 Byte

short 2字节 Shot

int 4字节 Integer

long 8字节 Long

float 4字节 Float

double 8字节 Double

boolean 1字节 Boolean

char 2字节 Character

 

Integer.paseInt(str); 将字符串中数字转换成Int数据类型的数字;

9.String字符串:

底层是char数组:

equals() 比较两个字符串的值是不是一致;

String.valueOf();强制类型转换; 参数为Object;

数组的长度length();

substring();截取字符串;一个参数的时候为开始截取的位置到结束.当参数为两个的时候,第一个为开始的位置,第二个参数为结束的位置;

replace();替换数组中的元素;第一个参数传要被替换的字符,第二个参数传替换之后的字符;

replaceAll();替换数组中全部选定的元素;第一个参数传 匹配的正则表达式,第二个参数传替换成什么字符串;

 

拼接字符串:

StringBuilder(); 非线程安全; 单线程拼接的时候使用;

append(" ");追加字符;

StringBuffer(); 线程安全; 多线程拼接的时候使用;

append(" ");

String+=的拼接方式 在jdk1.8的时候已经被优化,性能已经等同于StringBuilder();但是在开发中禁止使用;

instanceof 判断类型是否相同

 

 

数组

 

1.定义:在堆区中创建一个连续的内存空间来保存对象或者变量;

2.定义方式:

数据类型+[] 对象名=new 数据类型+[数组长度] //定义的时候不赋值

数据类型+[] 对象名={元素,元素} //定义的时候赋值

访问方式

对象名[数组的下标] 下标从0开始;

数组长度

数组名.length

增强for

for(数据类型 变量 : 数组对象){

方法体

}

 

3.排序:

冒泡排序,相邻两数互相比较,两两交换;

选择排序:用第一个和后面每一个比较;

 

 

数组的缺点:长度是固定的; 数组在扩容的时候不方便;

用final 修饰的String 是不能被继承的

 

4.集合

(1) ArrayList()------属于java.util包;若要提升性能,可以在参数中直接写出要添加的个数,固定size();的长度即可;

List ----------------

构造方法---如果不传参数,默认底层数组的长度是10;

如果有参数,底层数组长度和所传参数相同;

add()方法--代表向集合中添加元素,每添加一个 size 加1;

--当有两个参数的时候第一个为索引值,第二个为数据值

remove()方法,参数为索引值,

list.contains()传入一个元素,判断是否存在这个元素;

size方法--返回集合的长度(添加才算) 一旦长度超过底层数组长度 这自动扩展,每次扩展的容量为 原长度的1.5倍;

 

get方法--传下标,

ArrayList---遍历,

增强for

for(Object a:array){}

普通

for(int i=0;i<arr.size();i++ {}

迭代器迭代:

Iterator it = list.iterator();

while(it.hasNexe()){

Syso(it.next);

}

 

(2).HashSet(); 无序 去重复; 不能通过get()取出;

Set();

remove(); 参数传递的是数值;

(3).HashMap();

映射----键值对;

put( , )方法--存放---参数的类型为Object---存放的过程中(键)key不可重复; 值可以重复;

get(key)方法----获取---获取的过程参数为key;

containsKey();判断是不是存在这个key;

containsValue(); 判断是不是存在这个值value ;

hashMap()不支持增强for循环;

HashMap map = new HashMap();

 

 

5.二维数组:看成以数组为元素的数组----多维数组的声明和初始化,应该从高维到低维的顺序进 行;

静态初始化: int intA[][] = {{1,2},{2,3},{3,4,5}};

动态初始化: int a[][] = new int[3][5];

int b[][] = new int[3][];

b[0] = new int[2];

b[1] = new int[3];

数组的拷贝:

使用java.lang.System类的静态方法;arraycopy

System.arraycopy(s,0,sbak,0,s.length)各参数分别代表 s为从哪个数组复制,0代表从s的0号索引开始复制 , 然后复制到 sbak数组的0号索引开始,长度为s.length;

 

 

6.泛型集合:

规范了数据类型的集合;再定义的时候类型后用<规定的类型> 注意.泛型中不能使用基本类型;(但是可以用包装类替代)

例如 List <String> list = new ArrayList(); 规范了该对象只能存放String类型的元素,从Jdk1.7之后支持泛型推导,但是在在JKD1.7之前是不能被识别的,必须完整写,例如:

List <String> list = new ArrayList<String>();

Set<String> set = new HsahSet<String>();

Map<Integer , String> map = new HashMap<Integer , String>();

 

7.二分查找

前提条件:一个排序完整的数组才可以使用;