- 数组的工具类Arrays
1)toString(数组名) : 打印数组中所有的元素 2)sort(数组名) :对数组中的元素进行排序 3)copyOf(原来数组的名字,新数组的长度) 如果新长度=旧长度–普通复制 如果新长度>旧长度–扩容 如果新长度<旧长度–缩容 注意:本方法并不会改变原来数组,而是创建指定长度的新数组 - 冒泡排序
1)如果有n个数,最多比较n-1轮 2)每一轮中如何比较? 从头开始,把所有数过一遍【相邻比较,位置不对就互换】 3)之前轮中比较出来的最大值,不需要参与下一轮的比较 4)写法:外层循环控制的是比较的轮数,内层循环控制的是比较的次数 拓展:可以了解一些其他的排序算法,比如二分排序,快速排序,归并排序,全排序 - 如果这个类提供了其他的构造函数,默认的无参构造会被覆盖掉,所以需要手动提供无参构造
- 静态资源是类资源,随着类的加载而加载,只加载一次,并且优先于对象进行加载,直到类消失,它才会消失
- 接口其实是对外暴露的一套规则,是一套开发规范,以后要面向接口进行编程,是先天设计的结果
- 抽象类与接口的区别
抽象类是一个特殊的类,使用class定义,特殊在这个类中可以定义没有方法体的方法(抽象方法) 接口可以理解成一个特殊的抽象类,特殊在接口中所有的方法都是抽象方法,但注意接口不是类,用interface定义 抽象类中有构造方法,为了给子类创建对象时调用 接口中没有构造方法的,子类调用的是父类的构造方法 接口可以多继承,但抽象类只能单继承 抽象类可以定义普通的成员变量,但接口只能定义静态常量 接口与抽象类均不可以实例化/创建对象 抽象是后天重构的结果,接口是先天设计的结果 - 常见异常:
空指针异常 IO异常 sql异常 数据库连接异常 数组越界异常 字符串越界异常 找不到类异常 算数异常 - String转StringBuilder:
String s = “abc”; StringBuilder sb = new StringBuilder(s); - StringBuilder的:
StringBuilder转String: StringBuilder sb = new StringBuilder(); sb.append(“abc”); String s = sb.toString(); 总结一句话,拼接多用StringBuilder,用完转回String用String丰富的方法 - Integer i1 = Integer.valueOf();数据只要在-128~127有一个高效的效果
Integer i2 = new Integer(4);没有高效的效果,只是创建了一个包装类的对象 - 多线程编程实现方案一:extends Thread继承方式
- 多线程编程实现方案二:implements Runnable 实现方式
- 多线程编程实现方案三:Executors 创建线程池的方式
1)创建线程池的工具类:Executors.newFixedThreadPool(int n);可以创建包含最多n个线程的线程池对象 2)创建好的线程池对象:ExecutorService 使用pool.excute()来讲线程池中的线程以多线程的方式启动,每次调用都会将一个线程对象加入到就绪队列之中 这个线程池对象负责: 新建/启动/关闭线程,而我们主要负责的是自定义的业务 注意:线程池是不关闭的,实现的效果就是线程池中线程对象的随取随用,这样就避免了频繁的创建与销毁线程,不会造成资源浪费 3)合理利用线程池可以拥有的优势:
- 降低系统的资源消耗:减少系统创建与销毁线程对象的次数,每个线程都可以重复利用,执行多次任务
- 提高响应速度:当任务到达时,任务可以不用等待线程创建就能立即执行
- 提高线程的可管理性:可以根据系统的承受能力,调整线程池中线程的数目
防止因为创建多个线程消耗过多的内存导致服务器的崩溃
- 两种常见的锁
synchronized 互斥锁(悲观锁,有罪假设) 采用synchronized修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。 每个对象都有一个monitor(锁标记),当线程拥有这个锁标记时才能访问这个资源,没有锁标记便进入锁池。任何一个对象系统都会为其创建一个互斥锁,这个锁是为了分配给线程的,防止打断原子操作。每个对象的锁只能分配给一个线程,因此叫做互斥锁。 ReentrantLock 排他锁(悲观锁,有罪假设) ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,实际上独占锁是一种相对比较保守的锁策略,在这种情况下任何“读/读”、“读/写”、“写/写”操作都不能同时发生,这在一定程度上降低了吞吐量。然而读操作之间不存在数据竞争问题,如果”读/读”操作能够以共享锁的方式进行,那会进一步提升性能。 ReentrantReadWriteLock 读写锁(乐观锁,无罪假设) 因此引入了ReentrantReadWriteLock,顾名思义,ReentrantReadWriteLock是Reentrant(可重入)Read(读)Write(写)Lock(锁),我们下面称它为读写锁。 读写锁内部又分为读锁和写锁,读锁可以在没有写锁的时候被多个线程同时持有,写锁是独占的。 读锁和写锁分离从而提升程序性能,读写锁主要应用于读多写少的场景。 - 1.子类在创建对象时,默认会先调用父类的构造方法
2.原因是子类构造函数中的第一行默认存在super();–表示调用父类的无参构造 3.当父类没有无参构造时,可以通过super(参数)调用父类的其他含参构造 子类必须调用一个父类的构造函数,不管是无参还是含参,选一个即可 构造方法不可以被继承!因为语法的原因:要求构造方法的名字必须是本类类名不能在子类中出现一个父类名字的构造方法 1.子类在创建对象时,默认会先调用父类的构造方法 2.原因是子类构造函数中的第一行默认存在super();–表示调用父类的无参构造 3.当父类没有无参构造时,可以通过super(参数)调用父类的其他含参构造 子类必须调用一个父类的构造函数,不管是无参还是含参,选一个即可 4.构造方法不可以被继承!因为语法的原因:要求构造方法的名字必须是本类类名 不能在子类中出现一个父类名字的构造方法*/ - 对于不想进行序列化的变量,使用transient关键字修饰。
transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。 注意: 1.javaBean(称之为pojo , entity) 实现序列化接口 2.json数据: web层响应数据到客户端,一般数据是json数据 通常使用json工具把javaBean转换成json,要求javaBean要实现序列化接口 比如: jackSon工具, 带忽略某个字段注解,这个字段不参与序列化@JsonIgnore 比如: jsonLib工具,里面有个api: JsonConfig 灵活指定那些字段不被序列化 比如: fastJSON工具
|