基础知识
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.二分查找
前提条件:一个排序完整的数组才可以使用;