java基础笔记

2018-10-28  本文已影响0人  61etj

1 static

2 局部代码块

3 构造代码块

4 静态代码块

5 继承关系下代码块运行流程

6 多态中

7 抽象类的构造方法

8 接口

9 内部类调用对象

    Outer.Inner oi=new Outer().new Inner();

10 局部内部类

11 字符串

    Stirng s1=new String("abc");和String s2="abc"的区别

12 引用类型

13 冒泡排序

14 选择排序

15 进制的范围

16 Scanner

17 正则表达式

[abc] 表示检测  是否是  a或b或c 一个字符  []里面的特殊符有五个:[]-\^,其他字符都是普通字符,包括*.?等。   
[^abc] 表示检测    不能为  a或b或c 一个字符 
[a-zA-Z]表示所有字母 一个字符 
[0-9]表示数字 一个字符 
.  代表任何字符 一个字符(不包括换行) 表示自身  用\.
\s  空格,tab,换行
\S  等价[^\s]  匹配任意字符[\s\S]
\d 代表[0-9]  使用的时候要转义  \\d
\D 代表[^0-9]
\w 代表[a-zA-Z_o-9]  所有单词
\W 代表[^\w]  非单词
^  行开头  在[]内表示取反
$  行结尾
\b 单词边界  非单词的地方就是单词边界
| 多个数据选一(常用于多字符) 
    http|ftp|svn abc  会获取到 http,ftp,svn abc  
    用(http|ftp|svn) abc 会获取到 http abc,ftp abc,svn abc
() 数据分界和取数据
    例子 (a(b(c))) 则  
        \1(分组一)为 abc  \2 为 bc \3 为 c 
            分组 表示对前面数据 分界的引用
            
        $1 替换分组内的内容
    
(?:) 非捕获组
    分组排除用此表示符的组

次数符
?  一次或一次都没有
*  零次或多次
+  一次或多次
{n} 刚好n次  
    注意如果刚好需要匹配字符{1},则正则需要给{进行转义,得到\{1}的正则。 
    如果{}中间不是数字,则{}本身不需要转义。
{n,} 至少n次
{n,m} 至少n次,不超过m次

() 用于包括整体,后面跟着  次数符  可以限定小括号内的出现次数
eg: 
    [a-zA-Z_0-9]+@[a-zA-Z_0-9](\\.[a-zA-Z_0-9]{2,})+  表示邮箱
    \\w+@\\w(\\.\\w{2,})+  邮箱高级版

String对象有 boolean matches(String regex)用于判断字符串是否匹配给定字符
String对象有 String[] split(String regex) 用于分割字符串
String对象有 String replaceAll(String regex,String replacement) 用于根据正则替换字符串

------------高级-----------

使用原则  
    定锚点(利用正则定位出需要使用正则的最小区域,一般确定锚点时都指定下末尾结束字符,提高效率)
        eg:  
            获取<meta content="text/html; charset=utf-8" http-equiv="content-type"> 
            锚点 meta      结束 >
                 charset   结束 "
            <meta[^>]*?charset=([^"]+)"
            利用 [^>]确定meta长度,利用[^"]确定长度
            
    去噪点(去掉无关数据)
    取数据(利用子模式来获取数据)

?表示非贪婪模式,默认为贪婪模式
    区别
        贪婪模式会越过之后条件,根据当前条件匹配所有字符串,之后挨个字符 回溯 进行判断是否匹配(从整个慢慢缩减匹配)
        非贪婪模式 会根据当前条件挨个向下一个字符判断到不满足条件结束,进行之后条件的判断(从单个字符慢慢增量到整个匹配)
    
    经常用
        [^>]* 贪婪  代替  .*?> 非贪婪
        
    使用时机
        前面匹配千万不要同时能够适配到后面需要匹配的数据,使用注意按照字符串顺序来进行匹配(挨个或挨段匹配)
        贪婪 通过 [^结束字符]*  这种限定的方式能快速匹配到完整的数据,不要再单独匹配这个完整的数据,最好是获取数据的时候用
        非贪婪模式  [^结束字符]*? 通过这种限定方式会一个字符一个字符匹配满足条件的字符串知道匹配到结束字符,最好是过滤不需要的字符时候用
        
环视(断言/零宽断言)
    环视主要有以下4个用法: 
        (?<=exp) 匹配前面是exp的数据 
        (?<!exp) 匹配前面不是exp的数据 
        (?=exp) 匹配后面是exp的数据 
        (?!exp) 匹配后面不是exp的数据
        
    环视匹配可多次匹配,普通匹配不能
    环视匹配不占宽度,环视匹配结果不纳入数据结果

18 正则匹配器

String="被匹配字符串";
String regex="匹配规则";
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(s);

Matcher实例

19 Math

abs()绝对值
ceil()向上取整
floor()向下取整
max(a,b)取最大值
min(a,b)取最小值
pow(a,b)  取a的b次幂
random()取随机数 [0.0,1.0)
round()四舍五入
sqrt()返回正平方根

20 随机数

    public int getRandom(int start,int end){
        return (int)(Math.random()*(end-start+1))+start;
    }

21 Random

构造分为有种子和没种子的

22 System

包含一些有用的类字段和方法,该不能被实例化

    gc()运行垃圾回收器,该方法调用后会启用垃圾回收器,寻找当前内存中可被回收的内存,并且
    调用被释放内存的finalize方法,释放内存。
    
    exit(int state)终止当前正在运行的虚拟机 exit(0),0表示正常终止

    currentTimeMillis()返回当前时间与协调世界时1970年1月1日午夜之间的时间差(以毫秒为单位)
    arraycopy(object src,int srcPos,Object dest,int desPos,int lenth)复制数组

23 BigInteger

24 BigDecimal

25 SimpleDateFormat

SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
String=format(Data)格式化Data
Data=parse(String)解析格式化后的内容

26 Calendar

日历抽象类
Calendar.getInstance()获取实例
get(Calendar.常量)获取年月日等日期值
add(Calendar.常量,值)给日历指定对应时间
set(int year,int month,int date)设置日历当前时间

27 集合

特有方法
void add(int index,Object element)在指定位置添加元素 注意:只能在size大小内添加,否则越界异常
ListIterator listIterator()返回List集合特有的迭代器

特有功能:
逆向遍历,可以通过previous()配合hasPrevious()返回上一个元素
add()增加功能,在迭代的时候增加元素(解决问题:迭代器遍历时,利用list直接add,会造成并发修改异常,因为迭代器是根据当前List大小做迭代,list大小变化后,没有及时通知迭代器)

Object set(int index,Object element)根据索引修改元素,返回被修饰的元素
subList(int fromIndex,int Index) 返回集合[fromIndex,Index)的部分
  底层是数组,查询快,增删慢,线程安全,效率低
  特有方法:此类为jdk早期类,所以方法名还没有被规范
    void addElement(Object obj) 增加元素类似普通List的add
    Object elementAt(int index)获取索引指向的元素
        Enumeration elements()获取迭代器

底层是链表,查询慢,增删快,线程不安全,效率高

特有方法:
void addFirst(Object e)在首位增加一个元素
void addLast(Object e)在末尾增加一个元素
Object getFirst()获取首个元素
Object getLast()获取末尾元素
Object removeFirst()移除首位元素并返回被移除的元素

        Object removeLast()移除末尾元素并返回被移除的元素

28 泛型

问题:
有些类保存很多实现时才能确定类型的对象,如果写多个类不利于维护,代码冗余
且成本高,用Object容易出现转型以及安全性问题。

解决方案:
jdk5引入泛型,将此类型的类中管理的对象类型,由实例时才确定使用类型。

问题:
某些方法返回值或参数需要有多个重载,且方法体内代码一样,造成方法冗余。

解决方案:
引入泛型方法,方法中参数以及返回值最终确定是由调用时决定

    public interface 接口名<T>{}
    public class 类名<Timplements 接口名<T>{}

问题:
接口是泛型,但是创建的类还是无法确定继承接口的方法需要使用的类型
需要实例使用时确定

解决方案:
创建的类也必须引入泛型类

这个东西是和T不同, T是在定义类考虑到使用时才能确定类型时才使用T

? 表示通配符 ,是在使用时,限定实例泛型用的
注意,使用?后改引用就不能正常赋值了,赋值只能赋值null,但是可以获取 ? 限定实例的泛型 可以是任意类
eg:
Collection<?> c =new ArrayList<Object>();//自身也行

问题:
使用泛型时,左边泛型使用父类,右边泛型使用子类报错
解决方案:
原因,泛型使用时左右必须一致,不一致会报错,引入 ? 表示通配任何类

? extends E 向下限定

限定实例的泛型必须是 引用的泛型的 子类或本身

    eg:
        Collection<? extends Animal> c =new ArrayList<Animal>();//自身也行
        Collection<? extends Animal> c =new ArrayList<Dog>();

问题:
当使用?作为泛型时赋值实例可以填写任意的类。造成不安全的问题
解决方案:
为了使用实例时明确实例类型,使用<? extends 实例使用的泛型的父类>,就
可以限定实例泛型的类型必须继承 实例使用的泛型的父类

? super E 向上限定

    eg:
        Collection<? super Animal> c =new ArrayList<Animal>();//自身也行
        Collection<? super Animal> c =new ArrayList<Object>();

限定实例的泛型必须是 引用的泛型的 父类或本身

29 增强for 底层是迭代器

30 静态导入

import static 包名.类名.方法(方法必须是静态)
使用就可以直接用方法了

31 可变参数 jdk5 出现

public static int sum(int... a){//底层a其实是个数组,并且可变参数必须在最后一个
    //用增强for可以获取每个参数
    
}   

eg:
    Arrys中有
    public static <T> List<T> asList(T... a)

注意:
将数组转换成List后,集合长度是固定的, 如果修改集合长度(例如增加或删除元素)
会抛出UnsupportedOperationException异常
修改元素不改变集合长度则可正常。

32 Set

存取顺序和取出顺序不一致,唯一 注意,因为获取顺序不一致,所以
没有通过索引获取值得方法。只能通过 迭代器,增强for的方式来获取值)

- 底层是二叉树(红黑树是一种自平衡的二叉树)



- 能够对元素按照某种规则进行排序
    - 自然排序 
        - 无参构造使用自然排序
        - 实现Comparable才能自然排序
    - 比较器排序
        - 带参构造使用比较器排序 参数类型为Comparator

33 Map

小tip :0开头是八进制只有0-7

34 Collectons

35 集合类总结

36 异常

处理同类型异常,注意:catch的异常类型必须是平级,不允许出现父类

try{
    ...
}catch(异常类型 | 异常类型 | 异常类型 ... 变量名){
    ...
}

catch中出现return 会 经过finally后return,但是return的值一般会直接先定好

子类继承父类,父类方法有抛异常,子类也必须抛相同或者父类异常的子类

37 File

File(String pathname)根据路径返回一个File对象  不写盘符,默认路径在当前项目
File(String pathname,String child)根据路径,和子文件名返回一个File对象
File(File parent,String child)  

createNewFile()创建文件 
mkdir()创建文件夹
    注意 :创建文件或文件夹的目录必须存在
mkdirs()
    创建文件或文件夹的目录不存在则创建

delete()删除文件或文件夹
    注意:删除目录时,必须无子
    
rename(File) 重命名

isDirector() 是否是目录
isFile()是否是文件
exists()是否存在
canRead()能否读取
canWrite()能否写入
isHidden()是否隐藏

getAbsolutePath() 获取绝对路径
getPath() 获取相对路径
getName() 获取名称
length() 获取字节数
lastMoaified() 获取最后修改时间,毫秒值

list() 获取指定目录下的所有文件或者文件夹的名称数组
listFiles()获取指定目录下所有文件或文件夹的File数组

list(FilenameFilter filter) 使用文件过滤器,过滤成功才会放入返回值
listFiles(FilenameFilter filter)

38 IO流

输入 Reader结尾的
输出 Writer结尾的

tip: 字符占2个字节,不close时必须flush刷新缓冲区才会写入磁盘,字节占一个,直接可写入

OutputStreamWriter =  OutputStream + 编码表
InputStreamReader =InputStream + 编码表
tip:OutputStreamWriter和InputStreamReader属于一个转换器,将字节流加上编码转换成字符流

FileReader 对InputStreamReader进行封装
FileWriter 对OutputStreamWriter进行封装

tip:计算机中,中文字符保存是由两个字节保存,计算机是如何识别 字节数组中那些需要拼成中文,那些不需要呢?

原因,中文字符两个字节一般第一个字节都是负数,如果是复数,计算机自动将当前以及后一位进行拼接

tip:只能操作目的地,不能操作数据源(没有输入流,只有输入).

** tip:可设置读取位置,获取当前位置**

将多个流合并成一个流

tip:将对象进行读取以及写入,被序列化的类必须继承Serializable标记接口

序列化接口存在一个标记值,这个标记值会在序列化后保存与序列化中, 如果要获取的话
必须有相同标记值的类才能被正常的反序列化

标记值 serialVersionUID
不想被序列化字段声明 transient
- Path:路径
    

- Paths:有一个静态方法返回一个路径
        public static Path get(URI uri)
    

- Files:提供了静态方法供我们使用

            public static long copy(Path source,OutputStream out):复制文件
            public static Path write(Path path,Iterable<? extends CharSequence> lines,Charset cs,OpenOption... options)

线程

默认优先级5

让自身线程执行完毕,之后的线程才能继续

如果主线程死亡后,其余线程都是守护线程则会自动结束守护线程

对象: 多个线程使用的同个对象

- 锁
    

    - 非静态 this
    

    - 静态是 类的字节码文件对象
    
**tip:Collections.synchronizedXXX() 此方法是将非线程安全的集合转换为线程安全的集合**


- Lock
    
    
    - look()加锁
                
    
    - unlook()解锁



- 等待唤醒机制
    
    - Object中(锁对象)
            
            wait()等待,后会立即释放锁
            notify()唤醒单个线程
            notifyAll()唤醒所有线程



- 线程组

        ThreadGroup 默认都为为main线程组
    

- 线程池
        

    - Executors
    
            ExecutorService newFixedThreadPool(int n) 创建一个带有n个线程的线程池
            
        

    - ExecutorService 
    
            submit() 参数可以可执行Runnable或Callable对象
            shutDown() 结束线程池

定时器

    Timer 定时
    TimerTask 任务

网络编程

封装了IP,端口

- Socket 客户端
    
        getOutPutStream()获取输出流进行数据输出


- ServerSocket 服务器端
        
        accept()获取Socket对象,监听客户端连接,此方法会阻塞等待客户端连接
        Socket.getInputStream()获取输入流

反射

- Field成员变量获取方法


        getFields()获取所有public成员变量
        getDeclaredFields()获取所有成员变量
        getField("成员变量名")获取指定public成员变量
        getDeclaredField("成员变量名")获取指定任意成员变量
        
        

- Field使用
            

        set(Object obj,Object value)给指定对象的Fielda赋值

    > 上面这个方法如果访问private会报非法访问异常解决方案setAccessible(true);设置取消java访问检查
            
    

- Method成员方法获取方法

        getMethods()获取所有public的method方法(获取所有包括父亲的)
        getDeclaredMethods()获取所有method(仅获不包括父亲的)
        getMethod("方法名",Class... parameterType)获取指定public方法名的method
        getDeclaredMethod("方法名",Class... parameterType)获取指定方法名的method
        
        

- Method使用


            invoke(Object obj,Object..args)
            

    > 上面这个方法如果访问private会报非法访问异常,解决方案setAccessible(true);设置取消java访问检查
上一篇下一篇

猜你喜欢

热点阅读