学习java编程
|--需要遵循其语法规范
|--在其开发环境下编程
准备开发java环境
|--安装jdk
|--配置jdk
jdk:含义是java提供的一套开发工具,包含jre\编译器等
|--编译器(xx.java --- xx.class)
|--jre(java运行环境)
环境搭建
|--JAVA_HOME=安装目录11(C:\Program Files\Java\jdk1.8.0_191)
|--PATH = %JAVA_HOME%\bin
jar包
|--字节码文件(xx.class)的集合
java运行源码文件步骤
---------------------------
反编译(反编译软件:JDB)
源文件<------------------字节码文件
xx.java ------>编译------>xx.class ------------>类加载器 ------------>jre
javac Test.java java Test
案例:
在桌面新建Test.java,内容如下
public class Test{
public static void main(String [] args){
System.out.println("hello world");
}
}
//dos下如下操作
C:\Users\Administrator>cd /d C:\Users\Administrator\Desktop
C:\Users\Administrator\Desktop>javac Test.java
C:\Users\Administrator\Desktop>java Test
hello world
IDE
|--集成开发工具
|--
|--IDEA
eclise
|--新建项目
|--File --> NEW -- > project --> java project -->Finish
|--新建类
|--开发工具会自动编译源文件(bin)
|--右击
|--run as
|--application
项目的结构
|--.classpath .project .settings 这是eclipse生成的。
|--bin 字节码文件
|--src 源代码
程序入口方法
public static void main(String [] args) {
}
//注释
//含义:给程序员看的,一般描述当前代码的含义,方便代码的可读性。
在编译成字节码文件注释会忽略
//语法
// 单行注释
/*
多行注释
*/
文档注释 /** enter
//类
//谁新建的
//时间
//作用
//方法上
//作用
//作者
//参数说明
//语法
/**
*
*
*
*/
-------------------------------
//注释
//含义:给程序员看的,一般描述当前代码的含义,方便代码的可读性。
在编译成字节码文件注释会忽略
//语法
// 单行注释
/*
多行注释
*/
文档注释 /** enter
//类
//谁新建的
//时间
//作用
//方法上
//作用
//作者
//参数说明
//语法
/**
*
*
*
*/
java特点
|--简单
|--使用广泛
|--跨平台(一处编写处处运行)
|--给不同的平台安装不同的jvm
|--面向对象
|--...
关键字
|--jdk已经用的标识符
|--public void static if else ....
保留字
|--预定的,但是现在还没有使用。
标识符
|--含义:用来组成代码的符号。比如类名\包名\方法名\变量名\常量名...
组成: _ 数字 $ 英文字母
规范:
不能数字开头
中间不能有空格
类名\接口名 每个单词首字母都是大写,其他小写
包名全部小写
变量名\方法名,第一个单词首字母小写,其他单词首字母大写,剩余的全部小写。
常量全部大写
转义字符:
使用”\”把其转化成字符的本身输出,那么使用”\”的字符称作为转义字符。
\r 回车
\n 换行
\' '
\" "
\\ \
----------------------
常量
|--含义:一旦赋值之后就不能再修改的。
|--分类
|--字面常量 10
|--final :就是在 变量 前面添加final 关键字
变量
|--含义: 变量是程序中数据的临时存放场所,并且保存的值是可以被修改的。
|--组成
数据类型 变量名 [=初始值];
|--常用操作
修改
变量名= 新值
获取
System.out.println(变量名);
比如int age = 10;
age =20; //修改
System.out.println(age); //获取
|--注意
|--在同一作用范围变量不能重复定义
java
|--基本数据类型
|--数字
|--整数
|--byte short int long 区别范围不一样,语法
|--小数点
|--float double
|--布尔型
|--boolean
|--字符
char
|--引用数据类型(对象类型)
|--类
|--数组
|--String
|--...
运算符的种类:
赋值运算符:=、+=、﹣=、*=、/=、%=
算术运算符: +、﹣、*、/、%、++、 --
比较运算符:>、<、>=、 <=、= =、!=、instanceof
==用法
|--用于比较基本数据类型,值是否一样
|--用于比较引用数据库类型,比较是否同一个对象(即:比较对象的内存地址)
String str1 = new String("str");
String str2 = new String("str");
System.out.println(str1==str2);//false,因为new会开辟一块新的内存
instanceof 用于比较某个对象是否属于指定的类型
String str1 = new String("str");
System.out.println(str1 instanceof String);
逻辑运算符:!、&&、||
操作数都是boolean型
案例
boolean sign = ! true;
boolean sign = true && false;
boolean sign = true || false;
位运算符: &、|、^ 、 ~、>>、<<、>>>
三目运算符: 表达式 ? 成立:不成立;
int count = 29;
int pageSize =10;
int page = count%pageSize ==0 ? count/pageSize:count/pageSize+1;
数据类型转换
|--自动类型转换(存储范围较小的转成范围较大的)
byte -- > short --> int -- > long -- > float --> double
|--强制类型转换(存储范围较大的转成范围较小的)
注意了:可能造成数据溢出
int a = 10;
byte b = (类型)a;
自动类型提升
|--byte short char int 类型的操作数进行运算符操作结果类型都是 int
|--类型较小和类型较大的结果类型是较大的
案例
byte a = 1;
a = a+1; //报错吗?为什么?
byte a = 1;
a +=1; //报错吗?为什么?
快捷键
|-- main + alt + /
|--syso + alt + /
|--快速运行main ctrl + f11
|--复制光标|选中 ctrl + alt + 上或下箭头
|--移动光标|选中 alt + 上或下箭头
|--多行编辑 alt + shift + a
|--单行注释 ctrl + /
|--多行注释 添加 ctrl + shift + / 取消 ctrl + shift + \
|--ctrl + z
|--ctrl +1 快速修复
条件结构
if(){
}
if(){
}else{
}
if(){
}else if(){
}else{
}
作业
// && &区别
// || | 区别
//前置++ 后置++ 区别
//==
//instanceof 含义
//类型如何转换
//JAVA如何实现跨平台
//自行定义常量、变量
//你知道的命名规范有哪些
//如何导入项目
//如何到处可执行jar文件
//eclipse设置
//设置全局编码
//调整文字大小
day3
switch
|--含义:
|--语法
switch(需要比较的值){
case 具体值1:
//...
break;
case 具体值2:
//...
break;
default:
break;
}
|--执行流程
|--先匹配case,匹配到了执行case里面的代码,直到遇到break 或者 switch结束
注意
|--default可以放在case前面,也可以放在后面,建议后面
|--case default 建议加上break;
|--switch能用在byte short char int
|--String可以可以,但是需要1.7以上版本
循环
while(条件){
循环体
}
do{
循环体
}while(条件);
for(初始化一次;条件;每次循环之后执行的操作){
}
死循环
while(true){
循环体
}
do{
循环体
}while(true);
for(;true;){
}
控制
|--break; //终止当前循环
|--continue; //跳过当次循环,进行下一次
循环嵌套
|--循环包含循环
|--比如:99乘法表 TODO
|--如何结束最外层循环
|--内层控制外层的循环条件
|--标签
label:for
for
break label;
一维数组
|--含义:存放相同数据类型的容器。内存是连续的。
|--创建的方式
|--数据类型 [] 名称;
|--数据类型 [] 名称 = new 数据类型[大小;
|--数据类型 [] 名称 = {元素1,...};
|--注意:创建的数组对象是存放在堆中的,数组名是放在栈中的(数值就是数组对象的首地址)
|--常用操作
|--获取长度 数组名.length;
|--获取System.out.println(数组名[下标]); //下标从0开始
|--修改数组名[下标] = 新值;
|--常见异常
|--数组下标越界
|--空指针异常
|--循环
for(){
}
增强for
|--作业
|--元素交换
二维数组
|--一维数组中元素又是一个一维数组;行和列组成
|--创建方式
|--数据类型 [][] 数组名;
|--数据类型 [][] 数组名 = new 数据类型[行][列];
//行:一定要写
//列:可以不写
//如果不写:每一行都是null
//如果写:每一行的列是固定的,不是null的
|--数据类型 [][] 数组名 = {{元素1,...},{元素1,...},...};
//每一行,列个数可能是不一样的
|--常见操作
|--获取多少行:数组名.length
|--获取指定行的列数:数组名[指定行].length
|--常见异常
|--数组下标越界
|--空指针异常
|--作业
从随机构造班级学员成绩,找出全班学员的最高分\平局分
数据类似如下
[31,98,98,78,6,71,87,98]
[85,58,98,78,6,72,87,98]
[51,98,98,78,6,73,87,98]
[61,88,68,78,6,74,37,98]
[81,38,98,78,6,77,97,98]
知识点
|--Math随机生产整数
|--二维数组定义
|--二维数组数据的访问\修改
|--二维遍历
--------------------------------------------------
冒泡排序
|--原始数据9 2 5 4
|--过程
第一趟 2 5 4 9
第二趟 2 4 5 9
第三趟 2 4 5 9
查找算法
|--顺序查找
{1, 2, 3, 4, 5}
4所在的位置
|--二分查找(折半查找)
{1, 2, 3, 4, 5} //有顺序 小-->大
4所在的位置
思路:
取中间值3 ,因为3!=4 && 4>3;所以下标从3开始到4结束。
------------------------------------------------------
方法
|--含义:处理某一个功能的代码集合。
|--好处:可以重复使用。
|--定义语法
范围修饰符 其他修饰符 返回类型 方法名([参数类型 参数名,....]){ //形参
方法体
[return 返回数据]
}
//入口
public static void main(String [] args){
}
范围修饰符:public private protected 不写
其他修饰符:static final synchronized
返回类型是java的数据类型其中一个
方法名:合法标识符
参数类型是java的数据类型其中一个
参数名:合法标识符
返回数据:必须和返回类型匹配
|--方法调用
方法名(实参,实参N,...);
类型 变量名 = 方法名(实参,实参N,...);
|--return
|--方法调用结束了。方法结束。
|--return的数据类型要和返回类型匹配
方法调用的本质
|--方法的入栈和出栈的过程。
递归
含义:有限次数的自己调用自己,如果调用的深度太深容易造成栈溢出
//方法重载
|--在同一个类中,方法的名字相同
|--必须满足如下条件
|--方法名字一样
|--参数不同
|--参数个数
|--参数的类型
|--与方法的返回类型没有关系
//面向过程
//含义:
实现一个功能的一组命令组合成为一个函数;
//遇到的问题
当项目庞大的时候,函数越来越多,很容器造成命名冲突。不适合大型软件开发。
//面向对象
//含义
从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位。
抽象
|--含义:只关注与处理问题相关的。
对象
|--含义:具体存在的事物。
类
|--含义:对 对象的一种分类。具有相同属性和行为。对象是类的一个实例。
//类的定义
//含义:
//如何定义
//范围修饰符 其他修饰符 类名{
0-N个属性描述;
0-N个方法描述;
}
//对象
//含义:类的具体存在的事物。
//常用操作
//创建对象
//设置||获取属性值
//调用对象的方法
//打印对象
//对象比较
//成员变量和局部变量
-------------------------------------------
冒泡排序
选择排序
|--含义:选择指定位置的元素,然后将它和后面的依次比较,如果 大于 的话,就交换位置。经过一轮可以确定最小值。
2 3 1 0
一轮
2 3 1 0
1 3 2 0
0 3 2 1
二轮 0 3 2 1
0 2 3 1
0 1 3 2
三轮 0 1 3 2
0 1 2 3
---------------------------------------
二分查找
|--前提:要有顺序
|--含义:....
构造器
|--含义:创建并返回对象\初始化对象;是一个特殊的方法
|--语法
|--修饰符 类名([参数1,...]){
初始化逻辑
}
|--特殊
|--不能return 任何数据。
|--构造器名字必须和类名一样
|--不能有返回类型,包括void
默认构造器
|--含义:自带的无参构造器,如果添加了其他构造器,默认的构造器就会失效。
|--
匿名对象
|--含义:没有名字的对象 || 没有在栈中引用的对象;
|--特点
|--只能使用一次,并且使用之后就变成垃圾对象,GC就会回收。
this
|--含义:当前对象本身
|--使用场景
|--调用构造器
|--方法链
|--方法参数的二义性
GC
|--Garbage Collection,是JVM中优先级较低的线程,用于回收在 堆中 没有引用的对象;
|--如下场景会被回收
Persion p = new Persion(); p=null;
new Persion().say();
超出作用范围
if(true){
Persion p = new Persion();
}
|--当GC回收对象的是,会先调用对象的finalize方法
|--System.gc(); //让GC执行一次回收操作。
static修饰符
成员变量细分
成员方法细分
变量细分 & 生命周期
变量类型 存放位置 生命周期开始 生命周期结束
--------------------------------------------
作业
什么是类?什么是对象?类和对象的关系?
类是属性行为相同的方法集合的地方。
对象是通过类实例化出来的
构造器含义?构造器可以重载吗?
含义:每一个类都有一个构造器,创建并初始化对象的一种特殊方法
可以重载,但是必须不同参数类型和数量
this 含义?使用场景?并编写案例
含义:当前对象
场景:调用构造器
方法参数的二义性 this.age=age
方法链
public 类名 add(int param) {
result = result+param;
return this;
}
new 类名().add(1).add(2).add(3);
super含义?使用场景?并编写案例
含义:调用本类的父类构造器
场景:当子类 继承 父类 时,需要用到super来继承父类的构造器
当父类构造器已被修改为有参构造器时,子类继承时也要改为super(参数)
static修饰符可以修饰什么?什么是类级别方法?什么是对象级别方法?
修饰:
属性
代码块
方法
static属于类级别方法
封装的理解
通过在类中给变量赋予私有变量private,在加上调用setter和getter方法,实现隐藏代码,对输入输出进行限制,只允许用户调用方法来操作变量,增加安全性
继承的理解
方法重写含义?注意点有拿些?
static{ } 和 {}的区别
前者加载类时就实现一次,后者调用对象一次就实现一次,后者可以实现多次
抽象类和接口的区别
抽象类 下的抽象方法,在子类中若继承了父类抽象类,则必须实现父类提供的方法,否则自身变为抽象类
抽象类不能被实例化
抽象方法不能加static 因为会需要子类的重写
抽象类中可以全部为抽象方法,也可以不一定全是抽象方法
抽象类有构造器
接口
可以实现多继承
即interface A extends B,C ()....
若一个类要实现某一个接口,则必须实现它的所有抽象方法,否则这个类就变成抽象类
多态含义?,实现机制?自行编写案例
同一个接口,使用不同的类进行不同的操作即为多态
单例含义?自行实现一个饿汉式案例
使得一个类只能被访问一次,打印出的地址都为一个样
GC是什么?
垃圾回收机制,jvm线程会在创建的对象无用时对其进行回收即自动释放,gc作用于堆内存,于栈无关
1、定义一个点类Point,
包含2个成员变量x、y分别表示x和y坐标,
2个构造器Point()和Point(int x0,y0),
以及一个movePoint(int dx,int dy)方法实现点的位置移动,
创建两个Point对象p1、p2,分别调用movePoint方法后,
打印p1和p2的坐标。[必做题]
2、定义一个矩形类Rectangle: [必做题]
2.1 定义三个方法:getArea()求面积、getPer()求周长,showAll()分别在控制台输出长、宽、面积、周长。
2.2 有2个属性:长length、宽width
2.3 通过构造方法Rectangle(int width, int length),分别给两个属性赋值
2.4 创建一个Rectangle对象,并输出相关信息
3、定义一个笔记本类,该类有颜色(char)和cpu型号(int)两个属性。 [必做题]
3.1 无参和有参的两个构造方法;有参构造方法可以在创建对象的同时为每个属性赋值;
3.2 输出笔记本信息的方法
3.3 然后编写一个测试类,测试笔记本类的各个方法。
4、定义两个类,描述如下: [必做题]
4.1定义一个人类Person:
4.1.1定义一个方法sayHello(),可以向对方发出问候语“hello,my name is XXX”
4.1.2有三个属性:名字、身高、体重
4.2定义一个PersonCreate类:
4.2.1创建两个对象,分别是zhangsan,33岁,1.73;lishi,44,1.74
4.2.2分别调用对象的sayHello()方法。
5、设计一个类Student,该类包括姓名、学号和成绩。设计一个方法,按照成绩从高到低的顺序输出姓名、学号和成绩信息。
6、定义一个汽车类Vehicle,要求如下:[选做题]
6.1属性包括:汽车品牌brand(String类型)、颜色color(String类型)和速度speed(double类型),并且所有属性为私有。
6.2至少提供一个有参的构造方法(要求品牌和颜色可以初始化为任意值,但速度的初始值必须为0)。
6.3为私有属性提供访问器方法。注意:汽车品牌一旦初始化之后不能修改。
6.4定义一个一般方法run(),用打印语句描述汽车奔跑的功能
6.5定义测试类VehicleTest,在其main方法中创建一个品牌为“benz”、颜色为“black”的汽车。
-------------
final |--常量
|--含义:类、定义常量、方法名
| |--含义:该方法不能被子类重写
|--含义:该类不能被继承
static
|--含义:修饰的都属于类级别
|--可以直接通过 类名.来调用
|--修饰内容:
|--方法名
|--类名.
|--对象. x
|--成员变量
|--成员常量
|--类名
继承
|--含义:把相同的属性、行为提取到父类,子类通过继承就可以获得父类的属性、方法
|--注意点
|--单继承
|--一切类直接或者间接的继承了Object
方法重写:
|--含义:父类方法不满足子类的要求。
|--注意点
|--@overried注解表示,当前方法是重写父类的
|--重写方法的范围修饰符要>=原来的。
|--不能抛出比父类更大的异常
|--静态方法不能重写
|--final修饰的不能被重写
this
|--含义:当前对象
|--使用场景
|--构造器之间调用
|--避免参数二义性
|--构造方法链
|--TODO
super
|--含义:父对象
|--使用场景
|--调用父类的构造器
|--调用父类的方法
|--调用父类的属性
封装
|--含义:隐藏内部实现,对外提供公共的方法。
|--如何实现
|--属性设置成private的,如果外部能设置就提供setter、如果外部需要获取就提供getter方法
|--范围修饰符能越小就越小
|--boolean 不要is开头
抽象类
|--含义:具体子类 一定 要实现父类的抽象方法.
|--因为:不同的子类有不同的实现。将其实现放在父类是不合理的。
|--语法
abstract class
抽象方法
|--没有方法体的方法,抽象方法必须在抽象类中.
|--语法
方法的返回类型前 abstract,并且该方法没有{};
注意点:
|--抽象类不可以是final,抽象方法不可以是final,
|--抽象方法不可以是static
|--抽象类可以没有抽象方法;但是抽象方法一定是在抽象类中
|--抽象类的构造器不能否全部都是私有的
|--抽象类可以有普通方法
|--具体子类是通过继承(extends)
接口
|--含义:特殊的抽象类
|--没有构造器
|--没有普通方法
|--全部方法都是抽象的
|--不能有成员变量
|--注意点
|--全部方法都是抽象的,并且修饰符 public abstract
|--属性修饰符都是 public static final
|--不能直接new
|--具体子类是通过实现(implements)
如何选择?
|--接口优先
多态
|--含义:一个事物多种状态;只有运行的时候才能确定。
|--原理
|--实现接口
|--通过继承
子类实例过程
|--含义:调用子类的构造器,会先调用父类的构造器创建父对象,然后在创建子对象。
单例
|--含义:在程序运行期间最多只会创建一次。
|--方式
|--饿汉式
|--私有的构造器--->避免外部重复new
|--定义一个private static final 常量
|--对外提供public static 获取实例的方法
|--懒汉式
代码块
|--普通代码块
{
//创建一个对象都会执行一次
}
|--静态代码块
static{
//只会执行一次,类加载的时候
}
内存模型
|--含义:
|--堆:存放对象的;(数组,User,字符串,...)
|--栈:变量名
GC
|--含义:Garbage Collection
是一种优先级较低的线程,会检查堆内存中没有被引用的对象,然后回收。
----------------------------------------------------------------------------
Object
|--含义:一切类的根类。
|--常见的方法
|--hasCode //根据对象的地址计算出来的。
//hasCode
//含义:返回对象的哈希码值(是根据对象存放的地址),编号
//同一个对象多次调用hasCode值都是相同的。
//多次启动程序创建的同一个对象那个hasCode可能不一样。
|--equals //里面是==实现的
//一般情况会重写上述两个方法
//source-->equals hasCode
|--Class clazz = getClass(); //获取的是字节码对象<----字节码文件
|--finalize //当GC回收对象会调用该方法
|--toString //打印对象
//本质打印对象.toString();
//com.neuedu.day04._01ObjectDemo@15db9742
|--类名(全限定名) com.neuedu.day04._01ObjectDemo
|--简单名 _01ObjectDemo
包装类型
|基本装拆
//基本类型 变成 包装数据类型,装箱
Byte data2 = Byte.valueOf(temp);
//包装类型 变成 基本数据类型,拆箱
byte data3 = data2.byteValue();
|-- 自动装拆
byte data4 = 10;
Byte data5 = data4; //自动装箱
data4 = data5; //自动拆箱
|--面试
//有了基本数据类型,为什么要有包装数据类型?
//包装数据类型的默认值,可以表示特殊的含义
//包装数据类型提供了其他api
//解析字符串为基本数据类型:parseXX
|--工具类
|--String类
//字符串
//本质:final的字符数组
//final修饰的,不能被继承
//字符串是不可变的
String str1 = "test";
String str3 = "test";
//因为有缓存功能,所以str1==str3,比较内容时可以用equal
|--常用的方法
//equals equalsIgnoreCase
//trim
//startsWith
//endsWith
//replace("old str","new str")
//contains
//substring
//indexOf
//lastIndexOf
//length
//charAt
|--stringbuilder
//常用api String
//SB.toString()
//SB.append
//SB.length()
//SB.substring(start)
//SB.indexOf(str)
//SB.lastIndexOf(str)
//SB.delete(start, end)
//SB.deleteCharAt(index)
//SB.replace(start, end, str)
//SB.reverse
//StringBuilder
//含义:内容可以改变的字符串
|--stringbuffer
//StringBuffer 和 StringBuilder
//含义和方法基本上一样
//区别
//StringBuffer的方法有synchronized修饰
|--math
//Math.ceil(x)大于x的最小整数
//Math.floor(x)小于x的最大整数
//math.round(x)正数-》四舍五入,负数-》+0.5后向下取整 //Math.round(-6.4));
日期
//日期
//Date 不用了
//Calendar //Calendar cal = Calendar.getInstance(); 当前时间的日历对象
//SimpleDateFormat
//创建方式1
//SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
//simpleDateFormat.applyPattern(pattern);
//创建方式2
//SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd HH:mm:ss");
//使用2
Date date = new Date();
simpleDateFormat.format(date);//将date格式化//2019年07月21 16:29:41
String result = simpleDateFormat.format(date);
date = simpleDateFormat.parse(result);//将格式化后的时间进行解析2019-7-21 23:13:32
数组
//Arrays
//含义:提供对数组的常用api
//常用api
//toString 数组转成字符串
//binarySearch 负数说明不存在
//copyOf 复制
//copyOfRange
//sort 排序
异常
//ClassNotFoundException 什么类型的异常
//运行时,非检查RunTimeOutException 经验高质量代码解决
//非运行时,检查,可能产生该异常,则必须写出相应的处理代码,否则无法通过编译
//ClassNotFoundException
异常
|--含义:代码出错了 || 有可能出错。不是语法错误。
|--体系结构
Throwable
|--Error (非常严重)
|--栈溢出 //
|--内存溢出 //
|--....
|--Exception
|--RuntimeExcpetion
|--含义:非检查异常,代码运行着就报错了,往往都是代码不严谨。
|--方案:代码严谨性
|--常见的
|--算术异常 0/0
|--数组下标越界
|--空指针异常
|--非RuntimeException
|--检查异常
|--含义:代码有可能会错误,所以要处理这些错误。不处理编译不通过。
|--处理方式
|--自行处理
try catch
try finally
try catch finally
|--抛出
throw e 在方法声明后面throws 异常种类
//自定义异常
//含义:果Java提供的异常类型不能满足程序设计的需要,我们可以定义自己的异常类型。
//方案:
|--继承Exception
|--继承RuntimeException
------------------------------------------------------------------------------------------
串行
|--含义:强调按照顺序执行
并行
|--含义:同一时刻多个事物一块执行。
并发
|--含义:一段时间范围,多个事物执行。 //时间段
单个cpu,一遍听音乐,一遍写代码,
|--微观角度不行,
|--宏度角度可以的。 //cpu调度
//进程
//含义:正在运行的软件
//一个软件可以可以有多个进程
//特点
//有自己独立内存,进程独享.
//开软
//一遍音乐
//打游戏
xx
|--音乐进程
|--游戏进程
|--聊天进程
|--....
线程
|--含义:
//执行索引(分之)。
|--使用场景
//多个任务,比如:批量发送邮件
//多线程文件下载: TODO
//模拟多个人抢票
//....
|--如何创建
|--extends Thread
|--implment Runnable
//有线程安全问题
|--区别
|--通过继承方式不能共享同一份资源;通过实现接口方式是可以的。
|--通过实现接口方式有线程安全问题
|--java是单继承的,第一中方案不能在继承其他类,第二种方案是可以的。
//
概念
|--串行:多个事物依次执行。
|--并行:同一时刻多个事物一块发生。
|--并发:一段时间内多个事物发生。
|--进程:一个正在运行的软件(程序);都有自己 独立 的内存空间;
//可以有多个进程。
|--线程:执行的索引(分之);没有独立的内存空间;不能脱离进程。
|--创建方式
|--extends Thread
|--implements Runnable
|--区别:
//继承方式不能独立共享资源;实现接口方式可以
//实现接口方式可以继承其他类。
//实现接口方式可以共享资源,所在修改资源的时候会有线程安全问题。
//如何处理
//监视对象,监视同一时刻只能有一个线程修改资源
//同步方法 synchronized
//static 字节码对象
//非static this
//同步代码块
synchronized(this||字节码对象){
}
//锁
try{
}finally{
//释放锁
}
|--api
getName
getId
Thread.currentThread(); //获取当前线程
setProirity //设置优先级 (1 5(default) 10)
getProirity //获取优先级
join() //加入
interrput //中断
Thread.sleep(long millstime); 睡眠,不会释放锁
Object
wait
wait(long mills)
notify
notifyAll
|--生命周期
|--生产者 VS 消费者
--------------------------------------------------------------
集合
|--Map
|--HashMap
|--LinkedHashMap
|--TreeMap
|--HashTable
|--Properties
|--Set
|--HashSet
|--TreeSet
|--List
|--ArrayList
|--含义:封装了对数组的常用操作,底层采用变长数组来存储数据。
|--LinkedList
|--Vectory
|--Stack
|--Queue
|--Deque
--------------------------------------------------
数组 [1,2,3,4,6,7]
|--特点
//大小固定;下标查询快;修改快;插入慢;删除慢;
|--操作
|--删除:手动移动元素
|--添加:手动移动元素
|--...
class ArrayList{
private Object datas[];
private int size; //元素个数
public ArrayList(){
datas = new Object[10];
}
//datas 添加一个数据
public void add(Object data){
//...
if(size==10){
//扩容
datas = Arrays.copy
}else{
//继续添加
}
}
public Object get(int index){
//...
}
//.......都是操作数组
}
Collection
|--Set
|--HashSet 含义:Hash--->hasCode
|--LinkedHashSet
|--底层采用LinkedHashMap
|--List
|--LinkedList 链表
|--查找、更新慢
|--删除|添加快
|--Queue
|--Deque
|--Map
|--HashMap
|--LinkedHashMap
|--Hashtable
|--Properties
|--可以加载配置 |--ArrayList
|--SortedMap
|--TreeMap 采用二叉树(红黑树) 二叉树
|--含义:采用红-黑树存储数据结构
|--api
|--基本HashMap一样
|--注意点
|--要提供一个比较器或者key要实现Comparable接口
|--key
|--有序,顺序和compareTo || compare 返回-1 或者 1有关系 不可以重复
|--重复的依据是compareTo || compare 返回0
|--添加的元素有没有顺序
|--Set
|--
集合
|--存放对象
|--存放对象的引用 VS 数据
ArrayList
HashMap
|--Vector
|--方法基本上和ArrayList一样,线程安全的
回顾
----------------
集合
|--Collection
|--List
|--ArrayList:底层采用数组,是一种变长; [有序可以重复]
|--Vector(线程安全的)
|--Statck
|--Queue(单向队列) [有序可以重复]
|--Deque(双向队列)
|--LinkedList(链表) 双向链表(TODO 是否循环链表) (implements List)
|--Set
|--HashSet(底层采用HashMap来存储的)【无序】
|--LinkedHashMap(底层采用LinkedHashMap来存储的) 【有序】
|--TreeSet ....
----------------------------
|--Map
|--SortedMap 【有序】 |--重复的依据:比较返回0
|--TreeMap 【api和HashMap几乎一样】 [有序,key不可以重复]
|--注意:因为需要排序,所以需要比较
|--方案一:构建TreeMap的时候传递一个比较器
|--方案二:key必须实现Comparable接口
|--hasCode一样,equals返回true
|--HashMap (哈希表:存储结构数组+链表)链表:什么情况下会产生?? 【无序,key不可以是重复】
添加hasCode对应的位置有元素,但是他们两个的equals返回为false
|--LinkedHashMap【有序】
|--Hashtable【无序】 syschronized
|--Properties
//HashMap Hastable
//Hashtable是重量级的HashMap,线程安全
//HashMap的key 和 value都可以是null,Hashtable是不可以的。
//都是无序的,都实现了Map接口
------------------------------------------------------------------------------------
----------------------------------------------------
泛型
|--含义:参数化类型,类型用一个参数来表示,可以确定操作数据的类型。
|--作用
|--确定数据类型
|--避免强转
|--用法
|--类\接口\方法返回类型\方法参数
public MyArrayList<T extends BaseDTO>{ //T进一步约束,代表T 一定是BaseDTO的子类
public void add(T t){
}
public T get(int index){
return null;
}
}
|--其他用法
List<? extends XX> //? 是XX本身或者是XX的子类
List<? super XX> //? 是XX本身或者是父类
|--
public static <T> T get() {
Object obj = "xx";
return (T) obj;
}
IO
|--File
|--含义:文件或文件夹
|--api
|--如何创建对象
|--获取文件名
|--获取绝对路径
|--创建文件
|--判断是否存在
|--删除文件
|--判断是文件还是文件夹
|--列出子文件
|--FileInputStream
|--read()
|--read(byte [] temp)
|--close
|--FileOutputStream
|--write
|--close
|--字符流(一个一个字符读取)
Reader
|--FileReader
|--BufferReader //可以一行一行
Writer
|--FileWriter
|--BufferWriter
//思路
//cope
创建输入流 input 字节
创建输出流 output
//复制的逻辑(边读边写)
int len = -1;
byte [] temp = new byte[1024]; //
while((len=input.read(temp))!=-1){
output.writer(temp,0,len);
}
//io
//socket
//swing
//
-----------------------------------------
Server
|--ServerScoekt SS = new ScoektServler(8080);
Socket socket = SS.accept(); //等待客户端连接
socket.getInputStream();
socket.getOutputStream(); //将数据响应给客户端
//自行关闭
Client
|--Socket socket = new Socket("127.0.0.1",8080);
socket.getInputStream();
socket.getOutputStream(); //将数据响应给客户端
//自行关闭