天天看点

JAVA基础

JAVA流程控制

一定要读取到有效字符后才可以结束输入。

对输入有效字符之前遇到的空白,next()方法会自动将其去掉

只有输入有效字后才将其后面输入的空白作为分隔符或者结束符。

next() 不能得到带有空格的字符串

以Enter为结束符,也就是说NextLine()方法返回的时输入回车之前的所有字符。

可以获得空白。

只要布尔表达式为true,循环就会一直执行下去

do while 循环和while类似 不同的是do while循环至少会执行一次

do while 循环是先循环在判断

九九乘法表

break: 在任何循环语句的主体部分,均可用break控制循环的流程。用于强行退出循环,不执行循环中剩余语句。

continue:用于在循环语句体中。用于终止某次循环过程,跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定

goto: 标签

<code>outer:for (int i=101;i&lt;150;i++){ for (int j=2;j&lt;i/2;j++){ if (i%j == 0) continue outer; } System.out.println(i+""); }</code>

方法

return : 结束方法返回一个结果 break :跳出

数组

优化过

面向对象

加上静态变量可以直接用类名调用 没加静态 必须 new 静态方法和类一起加载 非静态方法必须调用
每个类默认继承Object的类只是隐藏了 子类继承父类的所有方法,父类的private子类不可以调用
super可以强制调用父类的方法 重名可以

注意点:

super调用父类的构造方法,必须再构造方法的第一个

suiper必须再子类的方法或者构造方法中

super 和 this 不能同时调用

代表的对象不同

this :本身调用者这个对象

super:代表父类对象的应用

前提

this:没有继承也可以使用

super: 只有继承才可以使用

构造方法

this : 本类的构造

super:父类的构造

加上静态可以直接用类名调用 B.test();
父类的静态方法不能被重写 b是A new 出来的对象,因此调用了A方法没有static时,b调用的时对象的方法,而b时用A类new的 因为静态方法时类的方法 ,而非静态是对象的方法 有static时 b调用了B的类的方法 因为b是b类定义的 子类方法和父类的方法必须一致 方法体不同

修饰符

可以扩大但是不能缩小 public &gt; protected &gt; private
子类调用的方法都是自己的 或者继承父类的 父类可以指向子类 但是不能调用子类独有的方法
instanceof判断类型是否相似 父类引用指向子类对象 把子类转成父类,向上转型 把父类转换子类,向下转型 : 强制转换
继承抽象类必须实现抽象类里面的所有方法 继承只能单继承 接口 可以多继承 抽象类不能new出来只能靠子类去实现他

方法2

作用 约束 定义一些方法让不同的方法让不同的人实现 接口不能实例化接口没有构造方法 implements可以实现多个接口
java中所有类都要继承Object Object是一个类,也是所有类的根 我们写的类即使不写继承关系,那么也会继承Object

判断左右两端的数据是否一致

字符串的判断一定要用equals

== 判断内存地址

默认的toString是Object的方法 (包名+类名+@内存地址)

直接调用bean文件的toString方法 目录会以默认的地址 所以要在子类里重写toString方法

可以判断两个对象是不是一个类型的

堆 主要放对象

栈 局部变量,以及基本数据类型的变量

代码区:类和方法

数据区:常量池和静态变量

异常

要捕多个异常要从小到大

快捷键生成异常 选中代码 Ctrl + Alt + T

最大得到异常要写在最后面

常用关键字:

try //尝试着去处理可能会出现异常的东西 catch //捕获异常 finally //无论有没有异常都会去运行 throw //抛出异常 throws //方法抛出异常

Math数学类

时间

字符串

charAt(0) //拿到第0个字符 concat("a"); //字符串后后面加a 拼接字符串 contains("a"); //字符串中是否包含a startsWith("guan"); //字符串是否以guan 开始 endsWith("xin"); //字符串是否以xin结尾 equalsIgnoreCase //忽略大小写是否一致 equals //判断两个字符串是否一致 indexOf("c") //判断字符串所在的位置 length() //字符串的长度 replace //替换 split //切割 substring(2,4) //截取

StringBuffer和StringBuilder用法都是一样的

StringBuilder &gt;StringBuffer // StringBuilder 速度更快

append //末尾添加字符串 insert //在第几位后加入的字符串 String s = stringBuilder.toString(); //转成字符串

容器List,Map,Set.

List 线性结构

Set集合,非线性去除重复

Map 映射 存储的时候以key:value的形式存储数据

用法一样 底层内存层面上有区别正常用感觉不到 ArrayList //查询效率比较高 LinkedList //删除和增加元素效率高

常用操作

add //添加 remove //删除 size //长度 get() //获取某个元素 contains //里面是否有这个数据

不能有重复数据

不是按照存储的数据进行存放的

HashSet //无序的 TreeSet //默认进行排序 升序

操作

add(); //添加元素 remove(); //删除元素 remove(“wode”); //直接写删除的内容

如果出现重复的key之前的会被顶掉

HashMap //不排序 TreeMap //根据key来排序的只能排int类型 map.put(11,"wang"); map.put(12,"wen");
put(key,value) //存数据 remove(key) //删数据 size() //长度 keySet //打印所有key get //通过key 查询value值
next //下一个 hasNext //是否还有下一个

Flie类

多线程

线程开启不一定立即执行,由cpu调度 子类继承Thread 重写run()方法 写入线程体 去主线程调创建线程对象,调用start()方法启动线程 启动:子类对象.start();
实现接口Runnable具有多线程能力 启动线程:传入目标对象+Thread对象.start();
callable和Runnable的区别是callable可以有返回值
线程只能启动一次 NEW //尚未启动的线程处于此状态 RUNNABLE //执行的线程 BLOCKED //阻塞等待监视器锁定的线程处于此状态 WAITING //正在等待另一个线程执行特定动作的线程处于此状态 TIMED WAITING //正在等待另一个线程执行动作达到的线程处于此状态 TERMINATED //已退出的线程
线程优先级数字越大越高 setPriority 主线程默认 5
进程:一个程序可以包含多个线程,只要包含一个 线程就是一个单独的资源类,没有任何附属操作 1.属性2.方法

java默认有2个线程,1、main线程 2、GC线程主要做垃圾回收

线程的状态

Lock 接口
synchronized 和 Lock区别

synchronized 内置java关键字,Lock是一个java类

synchronized 无法判断获取锁的状态,Lock 可以判断是否获取到了锁

synchronized 会自动释放锁, Lock必须要手动释放锁,如果不释放锁,会被死锁

synchronized 当线程1阻塞了,线程2会进行等待

Lock 当线程1阻塞了,线程2不一定等待

synchronized 可重入锁,不可以中断 非公平 ;Lock 可重入锁 不可以中断 可以判断锁 非公平(可以自己设置)

synchronized 适合锁少量的代码同步问题,Lock 适合锁大量的同步代码

Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); }

ReentrantLock //可重入锁 (常用) ReentrantReadWriteLock.ReadLock //读锁 ReentrantReadWriteLock.WriteLock //写锁

初始方法

Lock锁

condition.await(); condition.signalAll();

精准执行

按照顺序依次执行

8锁,就是关于锁的8个问题 1、标准情况下,两个线程先打印 发短信还是 先打印 打电话? 1/发短信 2/打电话 1、sendSms延迟4秒,两个线程先打印 发短信还是 打电话? 1/发短信 2/打电话

synchronized 锁的对象是方法的调用者

普通方法没有锁!不是同步方法,就不受锁的影响,正常执行

增加了一个普通方法后!先执行发短信还是Hello?// 普通方法 两个对象,两个同步方法, 发短信还是 打电话? // 打电话

static静态的同步方法,锁的是Class

增加两个静态的同步方法,只有一个对象,先打印 发短信?打电话? 两个对象!增加两个静态的同步方法, 先打印 发短信?打电话?
1个静态的同步方法,1个普通的同步方法 ,一个对象,先打印 发短信?打电话? 1个静态的同步方法,1个普通的同步方法 ,两个对象,先打印 发短信?打电话?
Callable接口类似于Runnable 不同于: 可以有返回值 可以抛出异常 方法不同 run(),call();
CountDownLatch //加法计数 CyclicBarrier //减法计数 Semaphore //信号量
countDownLatch.countDown(); // 数量-1 countDownLatch.await(); // 等待计数器归零,然后再向下执行 每次有线程调用 countDown() 数量-1,假设计数器变为0,countDownLatch.await() 就会被唤醒,继续执行!
semaphore.acquire(); //获得,假设如果已经满了,等待,等待被释放为止! semaphore.release(); //释放,会将当前的信号量释放 + 1,然后唤醒等待的线程!

https://www.kuangstudy.com/bbs/1374937897278402561

https://www.kuangstudy.com/bbs/1374936485165297666

集合不安全

HashSet 的底层就是一个HashMap Set&lt;String&gt; set = new HashSet&lt;&gt;(); //不安全 Set&lt;String&gt; set = Collections.synchronizedSet(new HashSet&lt;&gt;()); //安全
map 是这样用的吗? 不是,工作中不用 HashMap 默认等价于什么? new HashMap&lt;&gt;(16,0.75); Map&lt;String, String&gt; map = new HashMap&lt;&gt;(); 扩展:研究ConcurrentHashMap的原理