JAVASE JAVA中级

JAVASE JAVA中级

异常及其处理

Throwable: Throwable类是java语言中所有错误或异常的超类
try catch通过异常捕获,在发生异常时,try 里的代码会立即终止,程序流程会运行到对应的catch块中,可实现多异常捕获和异常的父类Exception捕获
运行时异常与非运行时异常的区别:运行时异常时不可查异常,不需要对其进行显式的捕捉;非运行时异常是可查异常,必须要对其进行显式的捕捉抛出,不然编译器会报错不允许程序运行
Throwable实例分为 Error 和 Exception:Error错误如OutOfMemoryErrorException(内存不足),Exception分为运行时异常 RuntimeException和检查异常CheckedException;RuntimeException 如 :NullPointerException(空指针异常) 、ArithmeticException(算数异常)、IndexOutOfBoundsException(下标越界异常) 、ClassCastException(类转换异常);CheckedException 如: I/O 错误导致的 IOException、SQLException、FileNotFoundException(文件未找到异常)

I/O

文件
:当不同的介质之间有数据交互的时候,JAVA就使用流来实现
关闭流的方式

  1. 首先把流的引用声明在try的外面,如果声明在try里面,其作用域无法抵达finally.
  2. 在finally关闭之前,要先判断该引用是否为空
  3. 关闭的时候,需要再一次进行try catch处理

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

缓存流(缓存流必须建立在一个存在的流的基础上)
缓存符输入流:BufferedReader
缓存符输出流:BufferedWriter
缓存字符输入流:PrintReader
缓存字符输出流:PrintWriter

数据输入流:DataInputStream
数据输出流:DataOutputStream

对象流:序列化(对象所对应的类,必须是实现Serializable接口)
对象输入流:ObjectInputStream
对象输出流:ObjectOutputStream

  • 继承inputStream/outputStream的,为真正意义上的流
  • 继承reader/writer的,为流的处理方式,内部创建了流,解决编码问题
  • 继承buffer的,为流的处理方式,使用外部传入的流,解决IO频繁问题

集合

不用担心会出现数组的边界问题和数组空间浪费问题
ArrayList 实现了List接口,接口可以接收实现了自身的类,公式:接口名 柄名 = new 实现了接口的类()
LinkedList 实现了List接口,实现了双向链表结构Deque,实现了Queue接口(队列)
二叉树
HashMap:键值对
HashSet:Set中的元素不能重复且没有按照元素的插入顺序排列。HashSet自身并没有独立的实现,而是在里面封装了一个Map.HashSet是作为Map的key而存在的,而value是一个命名为PRESENT的static的Object对象,因为是一个类属性,所以只会有一个
Collections:容器的工具类,Set、List、Queue和Deque的接口Collection的实现

ArrayList:
定位快(根据索引直接找目标),
增删慢(原因是每次增删后,后面数据索引整体前移后移,会影响后面所有数据,但.size最后基本无影响)
LinkedList:
定位慢(根据前后顺序一个个找,但0最前和.size()最后也是直接找到),
增删快(原因是每次增删后,两侧数据建立连接关系,只需两侧建立连接)

HashMap和Hashtable都实现了Map接口,都是键值对保存数据的方式
HashMap:可以存放 null、不是线程安全的类
Hashtable:不能存放null、是线程安全的类

HashSet: 无序
LinkedHashSet: 按照插入顺序
TreeSet: 从小到大排序

hashcode:key->hashcode(散列值)->value(空间换时间)

泛型

作用:类型的参数化、安全简单
容器后面添加 < T >、Type可以是类,抽象类,接口
与面向对象子类转父类不同,子类泛型不可以转换为父类泛型

λ(Lambda)

Lambda:匿名方法,这是一种把方法作为参数进行传递的编程思想
优点:使得代码更加紧凑,适合用在简短的业务代码中
缺点:可读性差,难以理解,不便于调试,很难在Lambda表达式中增加日志等调试信息,需要较高的版本支持
聚合操作:
1、管道源

  • collection.stream()方法
  • Arrays.stream(array)方法
  • Stream.of(array)方法

2、中间操作,并不会真的进行遍历,而是在3结束操作中才真正得到执行

  • 对元素进行筛选:
  • filter匹配、distinct去除重复(根据equals判断)、sorted自然排序
  • sorted(Comparator< T >) 指定排序、limit保留、skip忽略、
  • 转换为其他形式的流 :
  • mapToDouble转换为double的流
  • map 转换为任意类型的流

3、stream的结束操作

  1. forEach() 遍历每个元素
  2. toArray() 转换为数组
  3. min(Comparator) 取最小的元素
  4. max(Comparator) 取最大的元素
  5. count() 总数
  6. findFirst() 第一个元素

多线程

创建多线程:
7. 继承Thread类
8. 实现Runnable接口
9. 匿名类的方式

Concurrency问题:利用 synchronized 解决同步问题,一个类,其方法都是有synchronized修饰的,那么该类就叫做线程安全的类
死锁:相互占有对象并等待对方释放
线程交互
synchronized方式:使用wait和notify或者notifyAll进行线程交互,这两个方法不是线程的方法,而是同步对象的方法,wait()一定是在synchronized块里
Lock方式:lock对象得到一个Condition对象,然后分别调用这个Condition对象的:await, signal,signalAll
线程池:使用线程容器实现任务,过程中不需要创建新的线程,而是循环使用这些已经存在的线程(线程池类ThreadPoolExecutor)
synchronized、lock与trylock
相同:当前线程占用对象,其他线程就不能占用
不同:Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,Lock是代码层面的实现;synchronized 块结束会自动释放对someObject的占用; lock必须调用unlock方法进行手动释放,为了保证释放的执行,往往会把unlock() 放在finally中进行;trylock会在指定时间范围内试图占用,不成功则跳过,能够规避死锁,synchronized 会一直试图占用下去

JDBC

本例中选择:MySQL
为多种关系型数据库DBMS提供统一的访问方式,用Java来操作数据库
mysql语言:增删查改(CRUD)

基本步骤

1.为项目导入mysql-jdbc的jar包:mysql-connector-java
2.初始化驱动:Class.forName(“com.mysql.jdbc.Driver”)
3.建立与数据库的连接:connection:Connection c = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/数据库名?characterEncoding=UTF-8”,“root”,
“root”)
4.创建Statement用于执行SQL语句(executeQuery 执行SQL查询语句)(预编译PreparedStatement:根据sql语句创建PreparedStatement,能够通过设置参数,指定相应的值,而不是Statement那样使用字符串拼接,防止SQL注入式攻击)
5.execute执行sql语句(execute与executeUpdate的相同点:都可以执行增加,删除,修改;但是,execute可以执行查询语句,然后通过getResultSet,把结果集取出,executeUpdate不能执行查询语句,execute返回boolean类型,true表示执行的是查询语句,false表示执行的是insert,delete,update,executeUpdate返回的是int,表示有多少条数据受到了影响)
6.关闭连接
PreparedStatement比Statement优势
1.编码更加简便(避免了字符串的拼接,可以通过参数指定相应的值)
2.提高性能(因为有预编译操作,预编译只需要执行一次)
3.安全(可以有效防止sql注入)(sql注入:将客户输入的内容和开发人员的SQL语句混为一体)
存储过程、存储函数:connection.prepareCall(参数:存储过程或存储函数名)(参数格式:存储过程(无返回值return,用out参数替代):{ call 存储过程名(参数列表) };存储函数(有返回值return):{ ? = call 存储函数名(参数列表) })

使用事务
在事务中的多个操作,同时成功或失败
通过 c.setAutoCommit(false);关闭自动提交
使用 c.commit();进行手动提交
当表的类型是INNODB的时候,才支持事务
ORM:Object Relationship Database Mapping(对象对应数据库里的记录)
DAO:DataAccess Object(数据访问对象)
ConnectionPool:数据库连接池
SQL优化
解析过程:from … on… join …where …group by …having …select dinstinct …order by limit …
索引:类型(system>const>eq_ref>ref>range>index>all)、原则(索引覆盖、复合索引最佳左前缀、防止索引失效、逐步优化、小表驱动大表、建立在经常使用的字段上)
索引失效:复合索引的跨列或无序使用、不等于或者is null的使用、like的%开头、类型转化、or的使用、索引上的计算函数等操作
低效查询:慢查询、Profiles
锁:表锁和行锁(lock加锁和事务自动加锁)
主从复制:集群在数据库的一种实现、读写分离、实时备份、三线程实现(主节点(log dump thread)、从节点(I/O thread, SQL thread))

GUI(图形用户界面)

框架、框架布局器、组件、面板、菜单、工具栏、表格、事件触发与监听、swing线程

网络编程

IP:2位,4个字节:192.168.1.100(127.0.0.1 是固定ip地址,代表当前计算机)
端口
Socket:打开端口:ServerSocket、接受监听:accept()、使用Scanner读取控制台的输入

反射

类对象:用于描述类的属性和方法
获取类对象:Class.forName、Hero.class、new Hero().getClass()
反射机制:会先拿到Hero的“类对象”,然后通过类对象获取“构造器对象”,通过构造器对象创建一个对象newInstance() ,需要类型转换
访问:对于private修饰的成员,需要使用setAccessible(true)才能访问和修改
get…与getDeclared…
这两个方法都是用于获取字段
get… 只能获取public的,包括从父类和接口继承来的字段
getDeclared… 可以获取本类所有的字段,包括private的,但是不能获取继承来的字段。 (这里只能获取到private的字段,但并不能访问该private字段的值,除非加上setAccessible(true))
调用方法:(invoke(类对象,名字string))
反射可以越过泛型检查 :虽然可以通过反射,访问private等访问修饰符不允许访问的属性/方法,也可以忽略掉泛型的约束;但实际开发不建议这样使用,因此可能造成程序的混乱
动态加载:新建外部文件Properties,设置参数实现外部加载类型和方法

注释

内置注解:@Override @Deprecated @SuppressWarnings @FunctionalInterface 等
元注解:@Target表示这个注解位置、@Retention 表示生命周期、@Inherited 表示该注解具有继承性、@Repeatable注解在同一个位置可多次出现、@Documented注解用在javadoc命令生成API文档
第三方注解

发布了12 篇原创文章 · 获赞 0 · 访问量 151

猜你喜欢

转载自blog.csdn.net/weixin_42142764/article/details/101708467