javase

day01

1.     MS-DOS

       命令提示符(cmd)

       启动:                        Win+R,输入cmd回车

       切换盘符:               盘符名称:

       进入文件夹:          cd 文件夹名称

       进入多级文件夹:  cd 文件夹1\文件夹2\文件夹3

       返回上一级:          cd ..

       直接回根路径:      cd \

       查看当前内容:      dir

       清屏:                        cls

       退出:                        exit

2.     标识符:程序中自己定义的内容(类的名称(大驼峰式)、方法、变量的名字(小驼峰式)……)

3.     关键字特点:完全小写的字母,有特殊颜色

4.     java的数据类型分为两大类:

                  基本数据类型:四类八种

         字节型(byte)                      一个字节                 -128~127

         短整型(short)                     两个字节                 -32768~32767

         整形(int)                              四个字节                 -21亿~21亿

         长整型(long)                       八个字节                 

         单精度浮点数(float)         四个字节                 1.4013E-45~3.4028E+38

         双精度浮点数(double)     八个字节                 4.9E-324~1.7977E+38

         字符型(char)                      两个字节                 0~65535

         布尔类型(boolean)           1个字节                  true,false

                  引用数据类型:类,数组,接口

5.     float:需在数字后加F          long:需在数字后加L

day02

1.     “+”特殊用法:对于char类型,计算前会被提升为int,然后计算。

2.     char类型字符、int类型数字关系对照表:ASCLL、Unicode

3.     0--48  A--65  a--97

4.     常量优化:short sum=5+8; 13没有超出short范围,不会报错,即编译器的常量优化。(但是一旦有变量参与,就不能进行这种优化了)

5.      一元运算符:只需一个数据就可以进行操作的运算符。例如:取反!、自增++……

6.     二元运算符:需要两个数据才可以进行操作的运算符。例如:加法+、赋值=……

7.     三元运算符:需要三个数据才可以进行操作的运算符。

8.     三元运算符格式:数据类型 变量名称=条件判断?表达式A:表达式B

9.     复合赋值运算符:(其中隐含了一个强制类型转换)

+=         a+=3        a=a+3

%=         b%=4       b=b%4

10.   逻辑运算符:

    与(并且) &&、或(或者)||  二者具有短路效果,左边若可得到结果,右边不执行        非(取反) !   true变false,false变true

    (与、或:如果有多个条件可以连写)  

11.  数据类型转换:

自动类型转换(隐式):自动完成,由小到大

强制类型转换(显示):double a=(double)10;(不推荐使用:数据溢出,精度损失)

day03

1.break:switch中,一旦执行,整个switch语句立刻结束。

循环语句中,一旦执行,循环结束

(循环次数确定多用for循环,否则while)

 continue:一旦执行,跳过当前次循环剩余内容,马上开始下一次循环

2.                     do while循环:

 j=0

do{

循环体

j++

}  while(j<10)

3.switch:前后可以颠倒,匹配到那个case就从那个位置向下执行,直到遇到break或整体结束为止。

4.死循环标准格式:

while(true){

循环体

}

day04

1.      IDEA常用快捷键:

Alt+Enter                                     导入包,自动修正代码

Ctrl+Y                                           删除光标所在行

Ctrl+D                                          复制光标所在行内容,插入到光标位置下面

Ctrl+Alt+L                                    格式化代码

Ctrl+/                                           单行注释,再按取消注释

Ctrl+SHIft+/                                选中代码多行注释,再按取消

Alt+Shift+上下箭头                  移动当前代码行

2.方法的三种调用:

单独调用:方法名称(参数);        “无返回值只能单独调用”

打印调用:System.out.println(方法名称(参数));

赋值调用:数据类型 变量名称=方法名称(参数);

3.     重载:一个方法名称,实现多个类似功能

与下列因素有关:参数个数不同;参数类型不同;参数多类型顺序不同

Day05

1.     java的内存划分(5个部分):

栈(stack):方法运行在栈中;

堆(Heap):new出来的东西在堆中;

方法区(Method Area):存储.class相关信息,包含方法信息;

本地方法栈(Native Method Stack):与操作系统相关

寄存器(pc Register):与CPU相关。

2.     动态初始化数组:数据类型[] 数据名称=new 数据类型[数据长度];

(初始化时有默认值:

整数类型:0

浮点类型:0.0

字符类型:‘\u0000’

布尔类型:false

引用类型:null)

3.     静态初始化数组:数据类型[] 数据名称=new 数据类型[] {元素1,元素2......}   

(内容确定用静态初始化)

(初始化时系统马上将默认值替换为大括号中的数值)

4.     数组名称.Length     代表数组长度

Day06

1.     间接访问private成员变量,就是定义一对Getter/Setter方法             (Alt+Insert)

2.     根据类创建对象:

导包:import 包名称.类名称;(与类属于同一个包,可省略导包语句)

创建:类名称 对象名 = new 类名称();

使用:对象名.成员方法名(参数)/对象名.成员变量名

3.     面向对象三大特征:封装、继承、多态。 (方法、关键字private都是一种封装)

Day07

1.     数组长度不可以发生变化,ArrayList<E>集合的长度可以随意变化。

2.     <E>泛型:只能是引用类型,不能是基本类型。

3.     向ArrayList中存储基本数据类型,必须使用对应的“包装类”

Byte(Byte)  short(Short)   long(Long)  float(Float)  double(Double)

Boolean(Boolean)  特殊的:char(Character)  int(Integer) 

4.     ArrayList直接打印得到的不是地址值,而是内容。无内容得到[]

5.     对于引用类型,==进行的是地址值的比较。

6.     Scanner类:实现键盘输入数据到程序中。

Day08

1.     Java.util.Arrays工具类:

public static String toString(数组):将参数数组变成字符串[元素1,元素2......]

Public static void sort(数组):升序排序数组元素。

2.     Java.util.Math 工具类:

Math.abs(double num):获取绝对值

Math.ceil(double num):向上取整

Math.floor(double num):向下取整

Math.round(double num):四舍五入

Math.PI代表近似圆周率

3.     一旦用了static关键字,那么这样的内容不再属于自己,而属于类。凡是本类的对象,都共享同一份。

4.     创建字符串3+1种方式:

三种构造方法:

Public String()  创建一个空白字符串

Public String(char[] array)  根据字符数组的内容创建

Public String(byte[] array)  根据字节数组的内容创建

一种直接创建:

String str = “Hello”;

5.     静态代码块的格式:

public class 类名称{

static{

//静态代码块的内容

}

}

6.     ==是进行字符串的地址值比较,

7.     字符串内容比较:a.equals(b)  b.equals(a)效果相同

8.     字符串与常量比较  “ABC”.equals(str)  不推荐:str.equals(“abc”)

9.     String当中与获取相关的常用方法:

str.Length()      获取字符个数;

str.concat(str1)    拼接;

str.charAt(int index)获取索引位置的单个字符

str.indexOf(str1)  str1在str中首次出现的位置,没有返回-1

Day09

1.     面向对象的三大特征:封装性、继承性、多态性。

2.     继承是多态的前提,没有继承就没有多态。

3.     Java是单继承的,可以多级继承,子类只有一个父类,父类可有多个子类

4.     @Override可写在前面检查覆盖重写

5.     父子类方法名称、参数列表必须相同(java.lang.Object类是祖宗类)

6.     子类方法的返回值必须<=父类方法的返回值范围

7.     子类方法的权限必须>=父类方法的权限修饰符。

(public>protected>()>private)

8.     抽象方法:就是加上abstract关键字,然后去掉大括号,直接分号结束

9.     抽象类:抽象方法所在的类,必须是抽象类。在class之前写上abstract即可。

注意:不能直接创建new抽象类对象,必须用子类继承抽象父类,子类必须覆盖重写所有抽象方法。 

             覆盖重写(实现):子类去掉抽象方法的abstract关键字,补上方法体大括号

10.  super关键字用来访问父类内容,而this关键字用来访问本类内容。

       super与this调用必须是构造方法的第一个且唯一一个语句.

day10

1.      接口格式:

public interface 接口名称{

          //接口内容

}

2.      接口中可包含:常量、抽象方法、默认方法、静态方法、私有方法

3.      接口中的抽象方法,修饰符必须是两个固定的关键字,[public] [abstract]

4.      抽象方法没有方法体,所在的类必须是抽象类,且必须被覆盖重写

5.      接口使用步骤:

1.public class 实现类名称 implements 接口名称{

   //…

}

        2.覆盖重写接口中所有抽象方法

         3.创建实现类的对象,进行使用。

5.     接口的默认方法会被实现类自动继承;格式:

         [public] default 返回值类型 方法名称(参数列表){

         方法体

}

6.     静态方法格式:

         [public] static 返回值类型 方法名称(参数列表){

         方法体

}

         (静态方法必须通过接口名称直接调用)

7.     普通私有方法:

         private 返回值类型 方法名称(参数列表){

         方法体

}

静态私有方法:

private 返回值类型 方法名称(参数列表){

         方法体

}

8.     接口中的常量:[public] [static] [final] 数据类型 常量名称 = 数据值;       

         (常量名称用完全大写的字母且用下划线分隔)

9.  一个类直接父类只能有一个,但接口可以有很多个。

10. 多态性(左父右子):

         父类名称 对象名 = new 子类名称();

         接口名称 对象名 = new 实现类名称();               

11. 访问成员变量的两种方式:(编译看左边,运行看左边)

         直接通过对象名称访问成员变量,等号左边是谁优先用谁,没有则向上找;

         间接通过成员方法访问成员变量,方法属于谁优先用谁,没有则向上找

12. 访问成员变量:(编译看右边,运行看右边)

        new的是谁优先用谁,没有则向上找;

13. 对象的向上转型(其实就是多态写法):父类名称 对象名 = new 子类名称();

day11

1.      final类没有子类,格式:

public final class 类名称(){

          …

}

2.      final方法不能被覆盖重写,格式:

修饰符 final 返回值类型 方法名称(){

          //方法体

}

3.      final修饰局部变量,赋值后不可改变;

final 变量类型 变量名

对于基本类型,不可变为变量中的数据不可变

对于引用类型,不可变为变量中的地址值不可变

4.      java中四种权限修饰符:

                                                    public  protected  private

同一个类(我自己)                      YES          YES          YES          YES

同一个包(我邻居)                      YES          YES          YES           

不同包子类(我儿子)                    YES          YES                             

不同包不子类(陌生人)                YES                                             

5.      权限修饰符规则:

外部类:public/();

成员内部类:四种都可;

局部内部类:什么都不能写。

6.      成员内部类的定义格式:

修饰符 class 外部类名称(){

          修饰符 class 内部类名称(){

                  //…

              }

//….                                                                       

}

7.      内用外,随便用;外用内,需要内部类对象

8.      成员内部类的使用:

间接方法:在外部类的方法当中,使用内部类,然后main调用外部类方法;

直接方法:公式:(外.内)

外部类名称.内部类名称 方法名 = new外部类名称().new 内部类名称()

9.      访问重名的外部类成员变量:外部类名称.this.外部类成员变量名

10.   局部内部类:定义在方法内部的类

修饰符 class 外部类名称{

修饰符 返回值类型 方法名(参数列表){

class 局部内部类名称{

//…

}

}

}

局部内部类:如果希望访问所在方法的局部变量,那么这个局部变量必是有效final的

11.   匿名内部类(接口的实现类或父类的子类只需要用唯一一次):

接口名称 对象名 = new 接口名称(){

    //覆盖重写所有抽象方法

};

day12

1.      直接打印对象的名字,就是调用toString方法 p=p.toString();

2.      toString方法:重写前打印对象的 包名类名@地址值(默认);

重写后打印对象中的 属性值

3.      equals方法默认比较的是地址值,调用空指针会抛出空指针异常  s1.equals(s2)

4.      Objects.equals(s1,s2)  则可以防止空指针异常

5.      Date类:表示特定的瞬间,精确到毫秒

Date(): 获取当前系统的日期和时间;

Date(Long date):  传递毫秒值,转化为日期

成员方法Long getTime():把日期转化为自1970.1.1到Date的毫秒数

6.      DateForma类&SimpleDateFormat类:

SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);

成员方法:String format(Date date) 格式化

                       Date parse(String source) 把符合模式的字符串,解析为Date日期

7.      Calendar类(日历类):为一个抽象类,其中有一个静态方法叫getInstance()

成员方法:

public int get (int field):返回给定日历字段的值;

public void set (int field ,int value):给定的日历字段设置为给定值;

public abstract void add(int field ,int amount):

根据日历规则,为给定的日子字段添加或减去指定的时间;

public Date getTime:返回一个表示此Calendar时间值的Date对象。

8.      System类:

Long currentTimeMillis()  获取当前系统毫秒值

System.arraycopy(src,0,dest,0,3)  从源数组src的0号元素复制到dest的0号到3号

9.      StringBilder类:字符串缓冲区,提高字符串效率

成员方法:

StringBuilder append(..)  返回自身,无需接受返回值,可连续写

StringBuilder reverse();  反转内容

String toString();        将缓冲区内容转换为字符串

10.   自动装箱、自动拆箱:基本类型与包装类可自动相互转换

11.   基本类型转String: 例如:  34+“”

String转基本类型: 包装类.parse基本类型(String s) 

day13

1.      Collection (单列集合最顶层的接口):

     List(单列集合的一种):(有索引,可以保证存取顺序,可以存储重复元素)

           ArrayList(重点):底层是数组实现的,查询快,增删慢

           LinkedList(次之):底层是链表实现的,查询慢,增删快

           Vector(了解)

  Set(单列集合的一种):(无索引,存取无序,不可以存储重复元素)

           HashSet(重点):底层是哈希表+(红黑树)实现的

           LinkedHashSet(次之):底层是哈希表+链表实现的,<可以保证存取顺序>

           TreeSet(了解):底层是二叉树实现的,一般用于排序 

boolean add(E e);                        向集合中添加元素

boolean remove(E e);        删除集合中某个元素

void clear();                                      清空集合中所有元素

boolean contains(E e);                    判断集合中是否包含某个元素

boolean isEmpey();                        判断集合是否为空

int size();                                          获取集合的长度

object[] toArray();                          将集合转成一个数组

2.      java.util.Iterator接口:迭代器(遍历集合)

获取迭代器:Iterator<String> it = coll.iterator();

成员方法:  boolean hasNext();  判断还有没有下一个元素

                          String next();    取出下一个元素

3.      增强for循环(foreach):用来遍历集合和数组

for(集合/数组的数据类型 变量名:集合名/数组名){

                      sout(变量名);

}

4.      泛型类和泛型方法:  类名<泛型>   方法名(泛型)

5.      泛型接口和泛型方法:接口名<泛型> 方法名(泛型)

实现类格式1:public class 实现类名 implements 接口名<任意类型>{

                              覆盖重写;

                          }

调用1:实现类名 g = new 实现类名();

                  g.method();

实现类格式2:public class 实现类名<I> implements 接口名<I>{

                              覆盖重写;

                          }

调用2:实现类名<任意类型> g = new 实现类名<>();

                  g.method();

6.     泛型通配符:

day14

1.      数据结构-数组:查询快,增删慢

(在堆内存中频繁创建数组,复制其中元素,销毁原数组,效率低下)

2.      数据结构-链表:查询慢,增删快

3.      红黑树:趋近于平衡树,查询速度非常快,查询叶子节点最大最小次数不超过两倍

(根节点、叶子节点为黑色,每个红色节点的子节点都为黑色,一个节点到其每一个 叶子节点的所有路径上黑色节点数相同)

4.      List集合方法:

void add(int index,E element);  将指定元素添加到指定位置

E remove(int index);            移除指定元素

E get(int index);                返回指定元素

E set(int index, E element);        用指定元素替换指定位置的元素     

5.      Linkedlist集合:(包含了大量操作首尾元素的方法)

void addFirst(E e) / void push(E e) :          将指定元素插入到列表开头

void addLast(E e)                          将指定元素添加到列表结尾

E getFirst() / E getLast :                    返回第一个/最后一个元素

E removeFirst() / E pop()                    移除并返回第一个元素

E removeLast()                                                        移除并返回最后一个元素

6.      HashSet集合:无序(存储和取出顺序可能不同),查询速度特别快

7.      哈希值:是一个十进制整数,由系统随机给出,是一个逻辑地址,不是物理地址

int hasCode()  返回该对象的哈希值

8.      HashSet存储的元素必须重写hasCode和equals方法

9.      可变参数:当参数列表数据类型已经确定,参数个数不确定时,可使用可变参数

格式:修饰符 返回值类型 方法名(数据类型…变量名){}

如果有多个类型的参数,可变参数必须写到结尾:

                      修饰符 返回值类型 方法名(数据类型 变量名,数据类型…变量名){}

10.   Collections集合工具类:

boolean addAll(Collections<T> c ,T…elements):往集合中添加元素

void shuffle(List<?> list):打乱集合顺序

void sort (List<T> list):将集合中的元素按默认规则(升序)排序

  注意:必须实现Comparable,重写接口的方法compare to定义排序规则

          升序:自己(this)-参数

void sort (List<T> list,Comparator<? super T>):将集合中的元素按指定规则排序

                              升序:o1-12

全是静态方法,可直接调用(Collection.方法名)

day15

1.      Map集合的特点:双列集合,一个元素包含两个值(一个key,一个value),key与value    数据类型无关;key不能重复,value可以重复;key与value一一对应

2.      Map集合的方法: V put(K key,V value):把指定的键和值添加到Map集合中。

                       返回值V:存储键值对的时候,key不重复,返回null;

                                              key重复,会使用新的value替换Map中重复的,返回旧的value

V remove(Object key):把指定的键值对删除,返回对应的值;若没有返回null

V get(Object key):根据指定的键返回值

boolean containskey(object key):判断集合是否包含指定key

3.      Map的两种遍历方式:

Set<k> keySet() / Set<Map.Entry<k,v>> entrySet():将键都取出来放到set集合

4.      Hashtable集合:(单线程,速度慢;不能存储null键、null值)

HashMap集合:(多线程,速度快;能存储null键、null值)

5.      of方法(静态):List<E> of(E…elements)

JDK9中List接口、Set接口、Map接口增加的,可以给集合一次性添加多个元素

Set、Map方法调用时不能有重复元素

6.      Debug调试程序:让代码逐行执行,查看执行过程中出现的bug

使用方法:添加断点,右键选择Debug,程序会停在第一个断点处

执行程序:

F8:逐行执行程序

F7:进入方法

shift+F8:跳出方法,并将方法执行完

F9:跳到下一个断点,若没有下一个断点则结束程序

Ctrl+F2:退出Debug模式,停止程序

Console:切换到控制台

day16

1.      Throwable类:是所有异常或错误的超类

                       Exception类(小病):编译期异常

                               RuntimeException:运行期异常,java程序运行过程中出现的问题

                       Error类(绝症):错误,必须修改源代码,程序才能继续执行

2.      throw关键字:作用(抛出指定异常)

使用格式:throw new XXXException(“产生异常的原因”)

3.      throws关键字:异常处理的第一种方式,交给别人处理,最终交给JVM处理,中断程序

使用格式:

修饰符 返回值类型 方法名(参数列表) throws AAAException,throw BBBException…{

                      throws new AAAException(“产生原因”);

                      throws new BBBException(“产生原因”);

                      …

}

4.      try…catch:处理异常的第二种方式,自己处理

格式:

try{

可能产生异常的代码

}catch(异常类名 变量名(接收try中抛出异常的对象)){

异常的处理逻辑

}

catch(异常类名 变量名){

异常的处理逻辑

}

(try中可能抛出多个异常,可用多个catch处理,若异常有父子类关系,子类必写上面)

5.      finally代码块:

try{

可能产生异常的代码

}catch(异常类名 变量名(接收try中抛出异常的对象)){

异常的处理逻辑

}

catch(异常类名 变量名){

异常的处理逻辑

}finally{

无论是否异常都会执行 

}

(如果finally中有return语句,永远返回finally中的结果,应避免该情况)

6.      父类有异常,子类异常必须<=父类

7.      多线程:并发(同一时段交替执行)、并行(同时执行)

8.      进程:点击应用程序执行,进入到内存中的程序

线程:通向CPU的执行路径

线程调度:java为抢占式调度,若优先级相同则随机

(一个程序可以有多个进程,进程包含多个线程)

9.      主线程:执行主方法(main)的线程

10.   创建多线程程序的第一种方式:创建Thread类的子类

实现步骤:

1.      创建一个Thread类的子类

2.      子类中重写Thread类的run方法,设置线程任务

3.      创建子类对象

4.      调用Thread类中的start方法,开启新线程,执行run方法。

结果:两个线程并发执行:当前线程(main线程)和另一个线程(创建的新线程)

day17

1.      Thread类常用方法:

String getName()                              返回该线程的名称

static Thread currentThread()    返回当前正在执行的线程

static void sleep(long millis)              使当前执行的线程以指定毫秒数暂停

2.      创建多线程程序的第二种方式(推荐):实现Runnable接口

实现步骤:

1.      创建一个Runnable接口的实现类

2.      在实现类中重写Runnable接口的run方法,设置线程任务

3.      创建实现类对象

4.      创建Thread类对象,构造方法中传递Runnable接口的实现类对象

5.      调用Thread类中的start方法,开启新线程,执行run方法

3.      匿名内部类方法实现线程:格式:

new 父类/接口(){

          重写父类/接口的方法

}.start();

4.      解决线程安全问题的第一种方案:使用同步代码块

格式:

synchronized(锁对象){

  可能出现线程安全问题的代码(访问共享数据的代码)

}

锁对象(任意创建的):把同步代码块锁住,只让一个线程在同步代码块中执行

5.      解决线程安全问题的第二种方案:使用同步方法

格式:

修饰符 synchronized 返回值类型 方法名(参数列表){

  可能出现线程安全问题的代码(访问共享数据的代码)

}

6.      解决线程安全问题的第三种方案:使用Lock锁

Lock接口中的方法:void lock() 获取锁  ;  void unlock() 释放锁

使用步骤:

1.      成员位置创建对象:Lock l = new ReentrantLock();

2.      在可能出现线程安全问题的代码前  l.Lock();

3.      在可能出现线程安全问题的代码前  l.unlock();

day18

1.      Executors:线程池的工厂类,用来生产线程池

Executors类中的静态方法:

Executors.newFixedThreadPool(int nThreads) 创建一个可重用线程数固定的线程池

2.      线程池的使用步骤:

1.      使用Executors的方法newFixedThreadPool生存一个线程池

2.      创建一个类,实现Runnable接口,重写run方法,设置线程任务

3.      调用ExecutorService中的方法submit,传递线程任务,开启线程,执行run方法

(4. 调用ExecutorService中的方法shutdown销毁线程池)

3.      Lambda标准格式:   (参数列表)-> {一些重写方法的代码};

4.      Lambda省略格式:   

1)      参数列表的数据类型可省略

2)      若参数只有一个,()可以省略

3)      若{}中的代码只有一行,{}、;、return可一起省略(无论是否有返回值)

5.      Lambda使用前提:                

1)  必须有函数式接口(有且仅有一个抽象方法的接口)

2)  方法的参数或局部变量类型必须为Lambda变量接口的类型

day19

1.      File类: static String pathSeparator 路径分隔符 Windows;  Linux:

static String Separator 文件名分隔符  Windows\  Linux/

2.      绝对路径:完整的     相对路径:简化的    (路径不区分大小写)

3.      File类

构造方法:

File(String pathname):通过给定的路径字符串转化为抽象路径名创建一个新的File实例

File(String parent,String child):父子路径都可以随意变化

File(FIle parent,String child)

获取功能的方法:

String getAbsolutePath():返回此File的绝对路径

String getPath():返回路径

String getName():返回路径的结尾部分

Long Length():以字节为单位返回文件大小,不存在返回0

判断功能的方法:

boolean extsis():判断路径是否存在

boolean isDirectory():判断是否以文件夹结尾                    (路径不存在返回false)

boolean isFile():判断是否以文件结尾                (路径不存在返回false)

创建删除的方法:

boolean createNewFile():若该文件不存在,创建一个新文件

boolean mkdir():创建单级文件夹

boolean mkdirs():创建单级或多级文件夹 

boolean delete():删除文件或文件夹

遍历方法:

String[] List():遍历文件夹

File[] listFiles():遍历文件夹(带路径)

day20

1.      顶级父类们:

字节流:字节输入流InputStream        字节输出流OutputStream

字符流:字符输入流Reader                  字符输出流Writer

2.      OutputStream:此抽象类是所有字节输出流类的超类

成员方法:

void write(byte b) // void write(byte[] b) // void write(byte[] b,int off,int len)数组的一部分off开始,len长度

byte[] getBytes()  把字符串转化为字节数组(String类的方法)

追加写/续写(true:可在文件后续写  false:创建新文件覆盖原文件)

FileOutputStream(String name,boolean append)

FileOutputStream(File file, boolean append)

换行:

Windows:\r\n Linux: /n          mac: /r

3.      InputStream:

int read(byte bytes) // int read(byte[] bytes)  //int read(byte[] bytes, int offset ,int length)         

4.      Reader:

int read()  //  int read(char[] cbur)

5.      Writer:

void write(int c)  //  void write(char[] cbuf)  //  abstract void write(char[] cbuf,int offset,int count)  //

void write(String str)  //  void write(String str, int off,int len)

void flush()  刷新该流的缓冲 

void close()  关闭此流(但是会先刷新缓冲)

注意:write方法是先把数据写入缓冲区中(字符-->字节),再用flush刷新到文件中

6.      Properties双列集合(唯一与IO流相结合的集合):

Object setProperty(String key,String value)  往集合中添加数据

String getProperty(String key)  通过key找value         

Set<String> stringPropertyNames()  返回键集

将集合中的临时数据写入硬盘

void store(OutputStream out, String comments) 

void store(Writer writer,String comments)

读取硬盘中的键值对

void load(InputStream inStream)

void load(Reader reader)

day21

1.      缓冲流:提高四个基本FileXXX流的效率

BufferedOutputStream:字节缓冲输出流

2.      转换流(编码,解码):

OutputStreamWriter(编码):字符通向字节的桥梁

构造方法:

OutputStreamWriter(OutputStream out)创建默认字符表的OutputStreamWriter

OutputStreamWriter(OutputStream out,String charsetName)创建指定编码表的OutputStreamWriter

参数charsetName:指定编码表,可以是utf-8,gbk……不指定默认utf-8

InputStreamReader(解码):字节流向字符的桥梁

3.      对象的序列化流(把对象以流的方式写入文件中):

ObjectOutputStream特有的成员方法:

void writeObject(Object obj)  

        反序列化流(读取):

                  ObjectInputStream特有的成员方法:

                  void readObject(Object obj)

          注意:

1)序列化和反序列化的类必须实现Serializable接口

2)被transient关键字(瞬态关键字)和static关键字(静态关键字)修饰的成员变量,不能序列化

3)解决序列化异常:在类中Private static final long serialVersionUID = 1L;

4.      打印流PrentStream(extends OutputStream):

ps.write(97) à a

ps.print(97) à 97

day22

1.      TCP通信:客户端Client和服务器Server之间的通信,这个连接中包含IO对象

2.      Socket类:

构造方法:Socket(String host,int port) 创建套接字并连接到指定主机的端口号(port)

                                            (host 服务器主机名称/服务器的IP地址)

成员方法:OutputStream getOutputStream() 返回此套接字的输出流

                    InputStream getInputStream() 返回此套接字的输入流

3.      ServerSocket类:

构造方法:ServerSocket(int port) 创建绑定到特定端口的服务器套接字

成员方法:Socket accept() 监听并接收此套接字的连接

day23 

1.      函数式接口:有且只有一个抽象方法的接口

@FunctionalInterface注解:检测接口是不是一个函数是接口

2.      常用的函数式接口

1)  Supplier<T> (生产型接口)接口中的get方法生产泛型类型的数据

2)  Consumer<T>(消费型接口)使用accept方法消费泛型执行类型的数据 

3)  Predicate<T> 判断T类型的数据

抽象方法:boolean test(T t);  符合条件返回true,否则false  

表示“与”关系:pre1.test(s) && pre2.test(s) 等价于 pre1.and(pre2).test(s)  

“或”:or         “非”:negate  (同上)

4)  Function<T,R> 用抽象方法R apply(T t)  将T类型的参数转化为R类型

fun1.andThen(fun2)

day24

1.      Stream流:Stream<T>接口不是函数式接口

Collection集合可以通过stream默认方法转为流: Stream<E> stream

Stream接口的静态方法of可以获取数组对应的流:Stream<T> of(T…values)

Stream流为管道流,只能用一次

2.      常用方法:(除了终结方法就是延迟方法)

forEach: 遍历流中的数据(终结方法:调用后不能继续调用Stream流中的其他方法)

                            void forEach(Consumer<? super T> action)

filter:过滤数据  Stream<T> filter(Predicate<? super T> predicate)

                                                      boolean test(T t);

map:映射  Stream<R>  map(Function<? super T , ? extends R> mapper)

                                                      Function方法R apply(T t)

count:元素个数(终结方法)  Long count();

limit: 截取元素  Stream<T> limit(long maxsize)

skpi:跳过前几个元素 Stream<T> skip(long n);

concat:合并两个流(静态方法)Stream<T> concat(Stream<? extends t> a,Stream<? extends T> b);

3.      方法引用优化Lambda:

对象和成员方法都存在:s-> system.out.println(s)  ==  system.out::println

静态方法引用:Math::abs

父类:super::父类成员方法

本类:this::成员方法

类的构造器:Person::new

数组的构造器:int[]::new

基础加强

1.      Junit单元测试(白盒测试):

步骤:1) 定义一个测试类(测试用例)    测试类名:CalculatorTest  包名:xxx.xxx.test

                    2) 定义测试方法      方法名:testAdd()  返回值:void  参数:空参

                    3) 给方法加@Test

                    4) 导入Junit依赖环境

        判定结果:断言:Assert.assertEquals(期望的结果,实际的结果)

        @Before:修饰的方法会在测试方法之前自动执行,用于申请资源

        @After: 修饰的方法会在测试方法之后自动执行,用于释放资源

2.      反射:框架设计的灵魂

a)       框架:半成品软件。可以在框架的基础上进行软件开发,简化编码

b)       反射机制:将类的各个组成部分封装为其他对象

  好处:

1.        可以在程序运行过程中,操作这些对象

2.        可以解耦,提高程序的可扩展性

3.      注解:@Override覆盖重写父类方法 @Deprecated已过时 @SuppressWarnings(“all”)压制(所有)警告

自定义注解:

* 格式:

            元注解

            public @interface 注解名称{

                属性列表;

            }

        * 本质:注解本质上就是一个接口,该接口默认继承Annotation接口

            * public interface MyAnno extends java.lang.annotation.Annotation {

        * 属性:接口中的抽象方法

            * 要求:

                1. 属性的返回值类型有下列取值

                   * 基本数据类型

                   * String

                   * 枚举

                   * 注解

                   * 以上类型的数组

                2. 定义了属性,在使用时需要给属性赋值

                   1. 如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。

                   2. 如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可。

                   3. 数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}可以省略

        * 元注解:用于描述注解的注解

            * @Target:描述注解能够作用的位置

                * ElementType取值:

                   * TYPE:可以作用于类上

                   * METHOD:可以作用于方法上

                   * FIELD:可以作用于成员变量上

            * @Retention:描述注解被保留的阶段

                * @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保留到class字节码文件中,并被JVM读取到

            * @Documented:描述注解是否被抽取到api文档中

            * @Inherited:描述注解是否被子类继承

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值