java_总笔记:

java基础学习:

image-20201018213658345

对象:实物

类名  变量名 = new 类名();

变量名:引用,首地址

new : 实例|对象 存储具体内容

this关键字:

1、this代表当前对象。只能出现在方法中,谁调用这个方法,this就是谁

2、this可以在构造器用来调用其他的构造器 this()

​ 必须在构造器中调用

​ 只能在第一行

​ 构造器之间的调用不能形成闭合的环

3、通过this调用其他方法 this.方法名()

带标签的break:

int i =0;
int j = 0;
label:while(true){
 //我是第一层循环
 while(true){
   //我是第二层循环
      if(j*i == 81)
       break label; // continue label
       j++;
    }
    i++;
 }  

label: 就是标签 要终止的位置

**break label :**终止结束到标签 结束语句

continue label: 终止本次循环 跳到标签位置进行接下来的循环

static关键字:

1、static修饰的内容(属性、方法)先于对象存在的,跟随类的存在而存在

2、

​ 属性 :非静态属性,每一个对象有自己的一份独有的。静态属性,所有对象共用一份

​ 方法:先于对象存在

非静态属性对象名.属性名, 非静态方法对象名.方法名()

静态属性:对象名.属性名, 类名.属性名;(推荐)

静态方法:对象名.方法名(), 类名.方法名(); (推荐)

在静态方法中,不能使用非静态内容。非静态方法中可以使用静态内容

代码块{}

静态块:类中方法外,同时被static修饰;在类加载的时候执行一次。 一些只是在类加载的时候执行一次的代码,静态块中出现

普通块:方法内,没有关键字修饰; 方法调用的时候执行

构造块:类中方法外 , 没有关键字修饰;创建对象的时候执行,先于构造器执行; 每次创建对象都需要执行的操作

2020_10_10个人笔记:

封装

private, default, protected, public

重载(Overload)

在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载

继承

重写

两同,两小,一大

方法名相同,

形参列表相同,

返回值类型:如果是基本类型就必须相同,引用类型返回值可以为子类

抛出的异常类更小或相等,

访问权限相等或更大

1、子类需要父类的一切内容

2、除了有父类的内容之外还需要有自己特有的内容

子类是父类的延续+扩展

注意:在java中一个类只能有一个直接父类,但是可以间接继承多个类

如果一个类没有显示继承别的类,那么它的父类就是Object

instanceof方法:A instanceof B 判断A是否是B类或B的子类

super关键字

this 当前对象

super 父类对象, 通过super可以显示指定这个内容从父类中获取

调用构造器

访问属性

调用方法

子类对象的构造过程

先找父类,再找子类。而且必须首先找到父类对应的构造器。

在子类构造器的第一行,如果没有显示调用构造器(自己的,也可以是父类)会自动生成一个super()去调用父类的无参构造。 我们也可以通过super(...)手动调用父类构造器

this()

super()

父类中:父类静态块, 构造块, 构造器

子类中:子类静态块, 构造块, 构造器

父类静态块, 子类静态块, 父类构造块, 父类构造器,子类 构造块, 子类构造器

在一个类中找内容(属性、方法), 沿着继承链找, 从下往上找。

重写

当存在继承关系的两个类中,如果父类的方法不能满足子类的需求, 按需在子类中重写父类中方法(只有方法才存在重写)

方法头部保持一致(权限修饰符, 返回值类型, 方法名,参数列表)

注解:@Override

private的方法,static 方法,final方法 不能重写

子类中的内容: 继承下来的方法, 重写之后的方法, 新增的方法​

抽象类

abstract

如果在父类中的某个方法,完全不能满足任何子类的需求。所以这个方法写了也没有意义,但是我需要子类必须存在这个方法。就可以将这个方法定义成抽象方法,也就是只提供方法头。子类必须重写这个方法。

一旦有了抽象方法,这个类就不完整了,也就变成了抽象类, 抽象类不能被实例化(new对象),只能被用来继承(extends)

接口 interface

如果一个类中所有的方法都不能满足子类的需求,但是子类都必须有,这个类就被完全抽象了,完全抽象类,接口,接口只是提供标准,不提供任何的实现

对象转型:类型转换

自动: 子类->父类 (向上转型) , 丢失子类的新特性 父类引用 = 子类对象

强制: 父类->子类 (向下转型), 有可能出现类型转换异常 instanceof

多态

话不要说死了。提高程序的扩展性

多态是建立在有继承, 重写, 向上转型

当父类引用指向子类的对象,通过这个引用调用子类重写过的方法,就会发生多态,根据子类实际对象调用对应的方法。

2020_10_11个人笔记:

image-20201018214453526

异常

异常就程序出现的结果和我们想象的不一样

产生:系统(错误,根本没办法, 错了就错了)。 程序员不小心(内部,外部)

处理:捕获(自己处理) , 抛出(别人处理)

异常类结构体系:

可抛出的异常类 (Throwable)

​ 错误(Error) 管不了, 不管了

​ 异常(Exception) 可以管, 处理

​ (检查时异常接口)CheckedException(外部),编译的时候已经有问题了,必须处理

​ (运行时异常) RuntimeException(内部),编译的时候没有问题,运行的时候可能出问题, 避免

所有的继承自Exception而不继承RuntimeException的都是检查时异常

检查时异常

​ 编译的时候已经有问题了,必须处理

运行时异常

继承自RuntimeException的异常, 编译不出错,处理方式(避免),通过程序的健壮性避免

自定义异常

1、定义一个异常类 直接继承自Exception

2、在适当的时机产生异常

3、抛出异常

包装类

对8中基本类型的包装, int Integer, char Character

1、方便类型转换 String 和基本类型之间转换

2、满足容器|集合的需求

3、保存了一些数据的信息

Integer中

Integer a= //-128到127 常量池中 其他就new一个Integer对象
Integer.vauleOf();//相当于上面的,但是jdk9已经废弃
int a  =  //基本数据常量池中

Integer a=new Integer();创建对象

String a=new String(“a”)

String a=new String("a");
String b="a";

image-20201012210406657

2020_10_12个人笔记:

包装类

String

StringBuffer StringBuilder//常用,

Date: new Date(), getTime(), new Date(long)

SimpleDateFormat: 字符串->日期 日期->字符串

LocalDateTime.of() , now() , LocalDateTime.parse(str,formatter) , date.format(formatter)

LocalTime 、 LocalDate 、

LocalDateFormatter

提供了一些计算时间|日期之差的类,Period,ChronoUnit

Math -> 静态的

File: File是文件的抽象,文件和文件夹

2020_10_13个人笔记:

当容器存放类数据的话,应该重写hashCode和equal方法,否则所有的对象都是不相同的。

1.2. 容器中的接口层次结构

image-20201013193030787

​ 所有实现了Collection接口的容器类都有一个 iterator 方法用以返回一个实现了Iterator接口的对象。

Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。

4、容器的遍历

​ 普通for get(int)

​ 增强for

​ 迭代器

迭代器: 所有实现了Collection接口的容器类都有一个 iterator 方法用以返回一个实现了Iterator接口的对象。Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。

​ 1、先通过容器获取一个和当前容器相关的迭代器(游标), 默认位置在第一个元素之前

​ 2、利用迭代器提供的方法,hasNext方法,判断是否有下一个元素

​ 3、如果有,就获取下一个元素,同时让游标向后走一个,next()

Collection接口

只是一个集合可以存储多个数据, 提供常用基本的操作

int size();   // 获取容器当前存储的元素的个数
boolean isEmpty();   // 判断容器中是否有元素
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();
boolean equals(Object o);

List 接口

List是一个容器,应该具有容器的功能,还规定了这种容器中存储的数据的特点有序,可以重复的

接口中增加一些和位置相关的操作

boolean addAll(int index, Collection<? extends E> c);   // 添加一个集合的元素到指定位置
E set(int index, E element);  // 修改指定位置的元素
void add(int index, E element);
E remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
List<E> subList(int fromIndex, int toIndex);
public E get(int index)
ArrayList类
Object[] elementData  ; 存放数据的地方

类就可以创建对象,也就可以存储数据,属性 数组

LinkedList类

类就可以创建对象,也就可以存储数据,属性 链表

**HashMap:**线程不安全:

1.在jdk1.7中,在多线程环境下,扩容时会造成环形链或数据丢失。

2.在jdk1.8中,在多线程环境下,会发生数据覆盖的情况。

HashSet

数据特点:无序,不可重复

重写了hashCode 和 equals方法

添加一个元素,先看是否有相同hashCode,如果没有直接添加。 如果有相同的hashCode值,再调用equasl方法进行详细比较

我们希望只要属性值相同,认为是相同的对象,不要再添加进去了

hashCode 的重写规则,帮我们剔除掉那些一眼就能看出来不和谁相同的对象,直接往里添, 达到提高效率的效果

2020_10_15个人笔记:

// 上下界 只能规定类型   数据
        List<? extends F> list  = null;
        List<Object> list1 = new ArrayList<Object>();

        List<S> list2 = new ArrayList<S>();
        list = list2;
        list2.add(new S());


class F{

}
class S extends F{

}

Collections工具类

Collections.sort()要求类型必须实现了Comparable接口 重写compareTo()方法,方法用来指定排序规则,默认升序排序,前面加个负号可以实现降序排序

Collections.sort() Collections.sort(list,comparator),

Comparable接口:

Collections.sort()

沉稳,写一次后面都可以用了。但是不够灵活。

1.类里面继承Comparable

2.重写CompareTo方法{里面写的是想要通过什么属性来做比较进行排序}

Comparator比较器

Collections.sort(list,comparator),

​ 1.可以自己写个类,实现Comparator接口,

​ 2.可以使用匿名内部类来实现comparator的方法

​ 3.lambda表达式实现

​ 4.使用引用其他地方的compare方法

灵活,但是每一次度需要给定

20201016个人笔记:

内部类:

不存在局部静态内部类:

类加载的时候先加载所有静态属性,静态内部类和所在的方法只能加载一个,同时加载逻辑上会有错误。如果都是静态的,内部类该加载在那个地方,

匿名内部类:

匿名内部类对象, 简化

如果存在一个接口, 接口里边只有一个抽象,再次进行简化 Lambda

interface Fly{
    void fly();
}

Fly fly=new Fly{
    @Override
    public void fly() {
        System.out.println("ni");
    }
};

Lambda表达式:

(参数)->{方法体}

​ 左侧:Lambda表达式的参数列表。对应接口中抽象方法的参数列表。 右侧:Lambda表达式中所需要执行的功能,即Lambda体。对应接口中抽象方法的 实现。

函数式接口

1、系统可以给

2、自己给(按需求给)

一个接口,只存在一个抽象类。能够使用Lambda

验证一个接口是否是函数式接口

@FunctionalInterface

消费型接口 Comsumer

​ 方法:void accept(T t)

供给型接口 Supplier

​ 方法:T get()

函数型接口 Function

​ 方法:R apply(T t)

断定型接口 Predicate

​ 方法:boolean test(T t)

方法引用

方法引用就是lambda的变形,简写。

假设我们需要实现的功能(方法),已经有人提供了, 我们就可以引用别人写好的方法。

功能是我要的,方法的返回值,参数列表要和我们的接口方法保持一致

方法调用:使用的结果

方法引用:使用的方法体

-> ::

语法格式:

对象::实例方法名 非静态方法

类名::静态方法名 静态方法

类名::实例方法名 非静态方法

类名::new 引用构造器

20201017学习笔记:

IO流:

File既可以表示文件也可以表示文件夹。

​ Reader 和Writer只能处理文本。

​ write(int a) //a自动转型为char型

​ BufferedReader 有readLine()方法。

​ BufferedWriter有writeLine()方法。

InputStream --> FileInputStream 字节流,出现乱码时可read(byte[])稍微避免

OutputStream --> FileoutputStream

Reader->FileReader 对文本(字符流)进行操作 出现乱码不可避免

Writer->FileWriter

加Buffer前缀 使用缓冲流

BufferInputStream BufferoutputStream

BufferReader 新增readLine() BufferWriter新增writeLine() 提高性能读取文件

ByteArrayInputStream和ByteArrayOutputStream 不常用,不能对文件操作

InputStreamReader 可设计编码方式 对象 放入BufferReader中

// 解决乱码而且方便
        // 通过字节流读取文件内容, 由转换流内部帮我们将字节转为字符,而且我们设置了 编码
        InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"), "GBK");
        BufferedReader bufferedReader = new BufferedReader(isr);

DataInputStream 和DataInputStream 一个一个按格式存,一个一个按格式取

ObjectInputStream和ObjectOutputStream 对对象进行操作

类需要实现序列化接口,类中的属性可以加transient该属性的值就不能被序列化

20201019学习笔记:

多线程:

接口不能继承类,只能继承接口。

多线程:三种实现方法

**Thread :**将需要实现线程的类继承Thread类,重写run()方法,run中内容就是可以多线程的。但是,Java中是单继承的,所以使用这种方法比较少。

**Runnable :**实现Runable接口,实现run()方法。常用

​ Thread th=new Thread(类对象)或Thread th=new Thread(类对象,需要传入的名称)

​ 方法中用Thread.currentThread().getName()获取

**Callable:**实现Callable接口,实现call方法,创建实现类对象,由Callable创建一个FutureTask对象,由FutureTask创建一个Thread对象。启动线程。不常用 不过有返回值。

Runable:

  1. 创建线程类: 继承 Thread类 +重写 run() 方法

  2. 构造线程类对象: 创建 子类的对象

  3. 启动线程: 通过子类对象调用 start() 方法

线程的5种状态:

image-20201027201321370

​ 新建 : new就是新生
​ 就绪 : 当一个线程调用start(),就进入到就绪队列进行等待,等待cpu的调度
​ 运行 : 当cpu分配时间片给哪一个线程,这个线程才能运行
​ 阻塞 : 不是一定会出现的,非正常运行了 sleep
​ 死亡|终止 : 线程结束

    如何控制线程进入终止状态:
        1.正常运行结束   2.stop ,destroy() 过时    3.通过标识判断

    如何进入就绪状态:
        1.start  2.线程切换  3.yield 礼让线程   4.阻塞解除

    如何进入阻塞状态
        1.sleep    2.join 插队   3.wait(notify和notify唤醒)    4.IO


    注意:
        一个线程如果进入阻塞状态,阻塞解除没有办法直接恢复到运行,会直接恢复就绪
        一个线程如果一旦终止,没有办法恢复
   sleep 线程休眠|睡眠  (ms)
      静态方法
      抱着资源睡觉
      当一个执行到sleep方法,当前线程就会休眠指定时间,在休眠过程中,让出cpu的资源
礼让线程 yield
    让出cpu的资源,同时恢复就绪状态,等待cpu重新调度,是否还是会调度到原线程,不一定

状态:thread.getState()得到状态。

join方法: //插入thread.join();插入并执行完

//hread.join(1000)插入并执行1秒或更少(结束)

wait()方法

语义:使得当前线程立刻停止运行,处于等待状态(WAIT),并将当前线程置入锁对象的等待队列中,直到被通知(notify)或被中断为止。

notify()方法

语义:唤醒处于等待状态的线程

使用条件:notify()也必须在同步方法或同步代码块中调用,用来唤醒等待该对象的其他线程。如果有多个线程在等待,随机挑选一个线程唤醒(唤醒哪个线程由JDK版本决定)。notify方法调用后,当前线程不会立刻释放对象锁,要等到当前线程执行完毕后再释放锁。

优先级

每一个线程都有优先级别问题 优先执行谁 ,概率问题,但是 不能控制一个线程是否先执行

thread.getPriority()得到优先级

sleep :抱着资源睡觉,在sleep的时候一直使用着锁的资源。

yelid :礼让线程

synchronized:同步锁,

​ 可以锁类:类名.class

​ 可以锁类对象:this 或者自己定义好的类对象都行,不变的

​ 可以锁资源:通常使用地址不变的资源,类的属性。

​ 同步块: 资源,一定要锁不变的东西,引用数据类型 -->自定义的 引用数据类型的地址

方法也能加synchronized

死锁

​ 尽量避免嵌套锁。

20201020学习笔记:

网络编程:
        IP : 定义网络上的节点
        端口 : 区分不同的软件
        URL : 统一资源定位符

        网页编程  : 应用  js  jsp ...
        网络编程  : 协议  底层  数据的传输 ...

        ***协议
            udp :  写信  不安全  效率高  协议简单   大小一般不超过60k
            tcp :  打电话  安全  协议复杂 麻烦  没有限制

InetAddress类:

​ 构造方法不是public,只能使用它的方法。

常用方法:

​ InetAddress.getLocalHost(); 返回本机主机的地址,返回一个InetAddress对象

​ InetAddress.getByName(“www.baidu.com”); //通过域名

​ InetAddress.getByName(“103.235.46.39”);//通过地址

​ InetAddress实例对象.getHostAddress()//返回IP地址

​ InetAddress实例对象.getHostName()//返回IP地址

InetSocketAddress

​ 比InetAddress类多了一个端口号

URL类实现网络爬虫。

UDP编程:

DatagramSocket**,**

DatagramSocket(int port)//设置自己的端口

public DatagramPacket(byte buf[], int offset, int length) //接收端,服务端

public DatagramPacket(byte buf[], int offset, int length, SocketAddress address)//发送端,客户端

DatagramPacket 数据包

TCP编程:

Socket:客户端

ServerSocket:服务端

20201021学习笔记:

CompareTo:容器中sort排序时,可以需要重写的方法CompareTo,实现Comparable接口。

使用set,map,存放类数据中可能需要重写hashCode和equals方法;

要clone是需要实现接口cloneable,

ObjectOutputstream:存放类对象时需要实现序列化接口 Serializable ;

20201022学习笔记:

数组的底层原理:

​ 在堆中开辟一段连续的内存,并将首地址放入栈中。

多态,重写。

多态利用父类代码重写实现的。

反射:

反射 是发生在程序运行期间的行为
Java反射机制,可以实现以下功能:
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理;

反射的源头: Class
Class 类的实例表示正在运行的 Java 应用程序中的类和接口

    Class 对象
        在类加载 到内容中时就有了表示这个类型的Class对象
        Class对象是唯一的,不会改变的

三种获得Class对象的方法:

​ 1.类名.class

​ 2.类对象名.getclass()

​ 3.Class.forName(“包名.类名”);常用

得到类对象:

​ 通过Class类对象.newInstance()方法获得Object类,在进行转型得到对象。

由class对象可以得到类的方法,类的属性,类的构造器:

方法:

getConstructors() 得到类所有的public构造方法,

getConstructor(Class<?>… parameterTypes) 通过传入的传输类型判断调用的构造器。

getDeclaredConstructors() 得到类的所有的构造方法

getDeclaredConstructor(Class<?>… parameterTypes)

获取属性:

getFields()

getField()

getDeclaredField()

getDeclaredFields()

setAccessible(true); //开放权限
set(Object obj, Object value)  //设置值

获取方法:

getDeclaredMethods()

getDeclaredMethod()

getMethod()

getMethods()

invoke(Object obj, Object... args)   //前面是类对象,后面是参数

注解:

根据参数分类:标记注解,单值注解,完整注解。

根据用途分类:

jdk内置系统注解:比如@Override ,@Deprecated,@SuppressWarnings

元注解:

​ @Target: 描述注解的使用范围

​ @Rentention: 描述注解的生命周期

​ @Document: 表示这个注解会存在于API文档中

​ @Inherited: 标识可以被继承

自定义注解:

自定义注解
1.使用@interface定义注解

    注解:
        1.默认隐示实现了java.lang.Annotation接口
        2.自定义的注解类不能继承其他父类或者实现其他接口
        3.注解属性,在属性名的后面添加一对()
        4.注解类的属性的 修饰符只能为public|default
        5.注解类的属性的数据类型只能为基本数据类型,String,annotation,枚举,以上类型的数据
        6.如果枚举类的数据只有一个,建议你设置属性名字为value,如果只有一个属性并且属性名字为value,赋值可以省略属性名,否则属性名=属性值\
        7.使用注解类时候如果存在多个参数 ,需要放在一对{}中赋值
        8.使用default为属性添加默认值
public @interface 注解名{定义体}

参数:

修饰符:

方法的类型:

​ (int,float,boolean,byte,double,char,long.short);

​ String 类型

​ Class类型,

​ enum类型;

​ Annotation类型;

​ 以上所有类型的数组

命名(方法的名字)

对取名没有要求,如果只有一个参数成员,最好把参数名

称设为"value",后加小括号。

参数

注解中的方法不能存在参数

默认值

可以包含默认值,使用default来声明默认值

@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) 
@interface Programmer{
    String value() default "马云";
    int name;
}

20201023学习笔记:

xml:

<?xml version="1.0" encoding="utf-8" ?> //xml头部标识

常用dom4j来解析XML文件。需要导入dom4j包。

获得document对象:
SAXReader reader=new SAXReader(); 

Document document=reader.read(newFile("input.xml"));

document对象就能操作xml文件了,

ElementrootElm=document.getRootElement();//获得根节点 

Element memberElm=root.element("member"); //获得点memeber标签的子节点

String text=memberElm.getText();//获得节点文本 

Element ageElm=memberElm.addElement("age");//添加子节点

ageElm.setText("29");//设置节点文本 

parentElm.remove(childElm);//)删除某节点

编写xml文件重要步骤:

 //1.创建Document对象
        Document document = DocumentHelper.createDocument();
        //2.添加根节点
        Element root = document.addElement("sxt");
        //3.跟标签中添加子元素
        Element bjsxt =root.addElement("bjsxt");
        //4.添加属性
        bjsxt.addAttribute("location","西三旗");
        //5.添加子元素
        bjsxt.addElement("name").addText("北京尚学堂");
//1.XMLWriter 写出
        XMLWriter writer = null;

        //2.指定写出的docuemnt内容的格式器
        //OutputFormat format = OutputFormat.createCompactFormat();
        OutputFormat format = OutputFormat.createPrettyPrint();

        //3.创建这个流,指定 使用哪一种格式写出
        writer = new XMLWriter(new FileWriter(path),format);

        //4.写出
        writer.write(document);

删除:
root.remove(e);

正则表达式:

​ 正则表达式是用来描述具有一定特征的字符串的特殊字

符串。

常用的一些:

由 [] 组,只匹配一个, 需要注意以下四个:

​ ^ : 如果在第一个位置,表示取反的含义。其他位置就是普通符号^

​ - :表示一个区间即范围

​ ] : 最近一个位置为:结束 ,如果要表示普通的]请加 \

​ \ : 转义

. : 全部类型;

\d:数字0到9;

\w:A到Z,a到z,0到9.

量词:

*:0个及以上

+:1个及以上

?:0或1个

{n}:n次,非负数

{n,}:大于等于n次

{n,m}:大于等于n次,小于等于m次

贪婪模式:

懒惰模式:

独占模式:

边界:

​ 1)、边界不占用宽度,只是一个界限

​ 2)、 ^ :开始 \b :单词边界 \B :非单词边界

​ $ :结束

​ ^ :多行代表每行头 单行代表整个字符串的开始

​ $ : 多行代表每行尾 单行代表字符串的结尾

​ \b : 匹配前面或后面的不是\w

​ \B : 匹配前面或后面的是\w

	查找开头的 hello -> ^hello 
    找出 独立的单词 world -> \bworld\b 
    查找结尾的 world -> world$
选择符 |

| ->优先级低 ,满足匹配则停止,不会查找更优的方案

he|hello –>只匹配 he,不匹配 hello

hello|he->匹配 he 与 hello

分组:
匹配 ab c -> ab|c 
    匹配 ab ac -> a(b|c) 
    只匹配 get -> \bget\b 
    匹配 get 和 getValue -> getvalue|get 
    get(value)? 
    获取 and or -> \band\b|\bor\b   \b(and|or)\b
反向引用

​ 内部默认缓存,从第一个左括号计算,编号为 1 开始。

\i 的内容和前面第i个组的内容相同

(")test\1 –> “第 1 个左括号中  可识别"test"
((")test)\2> “第 2 个左括号中   
((("))test)\3> “第 3 个左括号中 
(["'])([^"']+)\1 ->找出合法的字符串"" 或''  可识别"12"

非捕获组: (?:xxx) : 不缓存组

(["'])(?:[^"']+)\1 ->不缓存第二组,不能引用第二组 
(?:["'])(?:[^"']+)\1>所有的组都没有缓存,不能再引用了。
零宽断言

前瞻和后顾

(\w+)(?<=ing)>匹配 singing testing --->sing test整个单词 ->后顾
(\w+)(?=ing) -->匹配ingsing ingtest  sing test->前瞻
常用类

java.util.regex , Pattern , Matcher, String

String str ="and"; //完全匹配 
boolean flag =str.matches("\\b(and|or)\\b"); System.out.println(flag);
str="\"happy\" and \"regex\" \"baidu\" or \"google\""; //替换所有
str =str.replaceAll("\\b(and|or)\\b", "-->"); 
System.out.println(str); //分割 
str="\"happy\" and \"regex\" \"baidu\" or \"google\""; //切割 
String[] arr=str.split("\\b(and|or)\\b");
for(String temp:arr){
    System.out.println(temp); 
}
arr=str.split("m");
Pattern:

compile(String regex) 将给定的正则表达式编译为模式

compile(String regex,int flags) 将给定的正则表达式编译为带有给定标志的模式

matcher(CharSequence input) 创建一个匹配器,匹配给定的输入与此模式。

mathches(String regex,CharSequence input) 编译一个给定的正则表达式,并尝试匹配给定的输入

Matcher:

find() 尝试找到匹配模式的输入序列的下一个子序列。

find(int start) 重新设置该匹配器,然后尝试从指定的索引开始找到匹配模式的输入序列的下一个序列。

matches()尝试整个区域与模式进行匹配。

20201024学习笔记:

Stream流:

泛型参数不能为基本类型,改为包装类。是基于Object的

因为基本数据类型不能转object类型。

Stream的操作三个步骤
1、创建Stream

一个数据源(如:集合、数组),获取一个流

2、中间操作

一个中间操作链,对数据源的数据进行处理

3、终止操作

一个终止操作,执行中间操作链,并产生结果

Stream的中间操作

多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间

操作不会执行任何的处理,而在终止操作时一次性全部处理,称为”惰性求值”。

filter :筛选。

limit :截断流

distinct :去重复

sorted(Comparable)-自然排序

sorted(Comparator)-定制排序

查找与匹配
// allMatch-检查是否匹配所有元素
// anyMatch-检查是否至少匹配一个元素
// noneMatch-检查是否没有匹配所有元素
// findFirst-返回第一个元素
// findAny-返回当前流中的任意元素emps.parallelStream()// 并行流-多条线程进
// count-返回流中元素的总个数
// max-返回流中最大值
// min-返回流中最小值
// map   {{},{},{}}
// flatMap  {}
收集
// List-把流中所有元素收集到List中
// Map-把流中所有元素收集到Map中,当出现相同的key时会抛异常

20201027学习笔记:

成员变量和局部变量的区别:

​ 成员变量:(实例变量)

​ 1、成员变量定义在类中,在整个类中都可以被访问。

​ 2、成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。

​ 3、成员变量有默认初始化值。

局部变量:

​ 1、局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。

​ 2、局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。

​ 3、局部变量没有默认初始化值

类变量(静态变量):

​ 1.随着类加载而加载,

​ 2.由于对象存在,

​ 3.被所有的对象所共享

​ 4.可以直接被类名调用

单例模式:

​ 实例保证只能有一个(对象地址相同)

饿汉式 :  类加载的时候就创建对象                  ->线程安全
懒汉式 :  当方法调用的时候(要的时候)才创建对象    ->线程不安全,相对效率高
    通过同步控制懒汉式线程安全问题

步骤:
    1.私有的构造器
    2.私有的静态该类的引用
    3.公共的静态的访问方式

静态代理:

​ 1.代理角色和真实角色实现相同的接口
​ 2.代理持有真实角色的引用 (通过成员变量来控制之间的关联关系)
​ 3.代理行为

抽象类和接口的异同之处:

1.都不能被实例化。

2.抽象类的子类度必须实现抽象类中的全部的抽象方法,才可以被实例化,不然任然为抽象类。

3.抽象类可以有构造方法,也可以有普通方法。接口不行

4.抽象类中的变量可以是普通变量,接口中定义的变量只能是公共的静态的变量。

容器中线程安全问题:

​ vector,HashTable、Properties是线程安全的。

​ ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。

节点流和处理流:

节点流:inputStream & outputStream & Reader & writer 之类的 ,new是前面加File的

处理流,需要加在节点流的基础上。
在这里插入图片描述

经典问题:

public class Test {
    public Test() {
    }
    static void print(List<Integer> al) {
        al.add(2);
        al = new ArrayList<Integer>();
        al.add(3);
        al.add(4);
    }
    public static void main(String[] args) {
        List<Integer> al = new ArrayList<Integer>();
        al.add(1);
        print(al);
        System.out.println(al.get(1));
    }
}

//输出2

float f=3.4f; 
Float f2=3.4f;
double d=3.4;
Double d2=3.4;
Double d3=34D;
long l1=345;
Long l2=224L;
System.out.println(1>0?9:9.9);//自动向上转输出9.0

​ 3.被所有的对象所共享

​ 4.可以直接被类名调用

单例模式:

​ 实例保证只能有一个(对象地址相同)

饿汉式 :  类加载的时候就创建对象                  ->线程安全
懒汉式 :  当方法调用的时候(要的时候)才创建对象    ->线程不安全,相对效率高
    通过同步控制懒汉式线程安全问题

步骤:
    1.私有的构造器
    2.私有的静态该类的引用
    3.公共的静态的访问方式

静态代理:

​ 1.代理角色和真实角色实现相同的接口
​ 2.代理持有真实角色的引用 (通过成员变量来控制之间的关联关系)
​ 3.代理行为

抽象类和接口的异同之处:

1.都不能被实例化。

2.抽象类的子类度必须实现抽象类中的全部的抽象方法,才可以被实例化,不然任然为抽象类。

3.抽象类可以有构造方法,也可以有普通方法。接口不行

4.抽象类中的变量可以是普通变量,接口中定义的变量只能是公共的静态的变量。

容器中线程安全问题:

​ vector,HashTable、Properties是线程安全的。

​ ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。

节点流和处理流:

节点流:inputStream & outputStream & Reader & writer ,new是前面加File的

其他都是处理流,需要加在节点流的基础上。

经典问题:

public class Test {
    public Test() {
    }
    static void print(List<Integer> al) {
        al.add(2);
        al = new ArrayList<Integer>();
        al.add(3);
        al.add(4);
    }
    public static void main(String[] args) {
        List<Integer> al = new ArrayList<Integer>();
        al.add(1);
        print(al);
        System.out.println(al.get(1));
    }
}

//输出2

float f=3.4f; 
Float f2=3.4f;
double d=3.4;
Double d2=3.4;
Double d3=34D;
long l1=345;
Long l2=224L;
System.out.println(1>0?9:9.9);//自动向上转输出9.0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值