String() String(String value) String(byte[] bytes, int offset, int length) String(byte[] bytes, String charsetName) String(byte[] bytes, int offset, int length, String charsetName) //指定字符集 String(char[] value) String(char[] value, int offset, int count) String(StringBuffer buffer) String(StringBuilder builder)
indexOf(int ch) indexOf(String str) indexOf(int ch, int fromIndex) indexOf(String str, int fromIndex)
lastIndexOf()lastIndexOf(int ch) lastIndexOf(String str) lastIndexOf(int ch, int fromIndex) lastIndexOf(String str, int fromIndex)
字符串加工
concat(String str) 将指定字符串连接到字符串结尾subString(int beginIndex) -subString(int beginIndex, int endIndex) 字符串切割toUpperCase() 全大写 -全小写 LowerCase()compareTo(String anotherString)equalsIgnoreCase(String anotherString)trim()valueOf() int,long,float,double,char,char数组,Object转换成String的方法getBytes() 把String字符串转换为字节数组 -byte[] getBytes(String charsetName)replace(char oldChar, char newChar) 与正则表达式相关matches(String regex)split(String regex) 切割得到的字符串数组不包含作为分割的字符==:基本类型:比较的是值是否相同 引用类型:比较的是地址值是否相同 equals(): 引用类型:默认情况下,比较的是地址值,可进行重写,比较的是对象的成员变量值是否相同
-ArrayList底层采用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组。 -扩容规则: 新增的时候发现容量不够用了,才去扩容 扩容后的大小= 原始大小+原始大小/2 + 1【JDK1.6之前】 扩容后的大小= 原始大小+原始大小/2【JDK1.7之后】 直接add是将元素赋值给数组顺序的最后一位。 指定插入位置的add方法,参考以下:【arraycopy】
public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }-LinkedList底层采用双向链表实现 -没有初始长度,也没有扩容规则
-HashSet底层是使用HashMap来实现的 -扩容规则: 当前大小 和 当前容量 的比例超过了扩容因子,就会扩容 对应HashMap默认初始长度为16,扩容因子默认0.75。 add是将该对象作为底层所维护的Map对象的key,而value则是同一个Object对象 扩容2倍
-HashMap底层是使用数组和单向链表结合来实现的 -扩容规则: 存放新值的时候当前已有元素的个数必须大于等于阈值 存放新值的时候当前存放数据发生hash碰撞(当前key计算的hash值换算出来的数组下标位置已经存在值)【两者同时满足才发生扩容】
因为上面这两个条件,所以存在下面这些情况 (1)就是hashMap在存值的时候(默认大小为16,负载因子0.75,阈值12),可能达到最后存满16个值的时候,再存入第17个值才会发生扩容现象,因为前16个值,每个值在底层数组中分别占据一个位置,并没有发生hash碰撞。 (2)当然也有可能存储更多值(超多16个值,最多可以存26个值)都还没有扩容。原理:前11个值全部hash碰撞,存到数组的同一个位置(这时元素个数小于阈值12,不会扩容),后面所有存入的15个值全部分散到数组剩下的15个位置(这时元素个数大于等于阈值,但是每次存入的元素并没有发生hash碰撞,所以不会扩容),前面11+15=26,所以在存入第27个值的时候才同时满足上面两个条件,这时候才会发生扩容现象。
扩容2倍
按照传输的单位分成字节流,字符流 字节流的父类:InputStream OutputStream 字符流的父类:Reader Writer
序列化是将内存中的对象以二进制的方式存储在硬盘文件中。
反序列化是将硬盘文件中表示对象的二进制转化为对象。
序列化实现 需要让一个类实现Serializable接口,该接口是一个标识性接口,标注该类对象是可被序列化的,然后使用一个输出流来构造一个对象输出流并通过writeObject(Object)方法就可以将实现对象写出(即保存其状态)
序列化除了能够实现对象的持久化之外,还能够用于对象的深度克隆【clone浅克隆】
深度克隆/浅度克隆:对某个对象进行克隆,对象的的成员变量如果包括引用类型或者数组,那么克隆的时候其实是不会把这些对象也带着复制到克隆出来的对象里面的,只是复制一个引用,这个引用指向被克隆对象的成员对象,但是基本数据类型是会跟着被带到克隆对象里面去的。而深度可能就是把对象的所有属性都统统复制一份新的到目标对象里面去。
1.继承Thread类创建线程
//继承Thread类 public class MyThread extends Thread{ //重写run方法 public void run(){} } public class Main { public static void main(String[] args){ new MyThread().start(); //创建并启动线程 } }2.实现Runnable接口创建线程
//实现Runnable接口 public class MyThread2 extends Runnable{ //重写run方法 public void run(){} } public class Main { public static void main(String[] args){ new Thread(new MyThread()).start(); //创建并启动线程 } } //直接在函数体内使用 Thread t = new Thread(new Runnable(){ public void run(){ System.out.println("内部类开启线程"); } });3.使用Callable和Future创建线程
//实现Callable接口 public class MyThread2 implements Callable { //重写call()方法 public Object call(){ return null; } } public class Main { public static void main(String[] args){ //使用Lambda类表达式创建Callable对象 //使用futureTask类来包装Callable对象 Callable callable = new MyThread3(); FutureTask futureTask = new FutureTask(callable); Thread thread = new Thread(futureTask); thread.start(); } }共享内存机制和消息通信机制。 1.同步。访问权限【锁】。 2.notify/wait机制
New:当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread(); Runnable:当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行; Running:当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中; Blocked:处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种: 1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态; 2.同步阻塞 – 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态; 3.其他阻塞 – 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
Dead:线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
(1)不能够跨越多个对象。 (2)当在等待锁对象的时候,不能中途放弃,直到成功。 (3)等待没有超时限制。 (4)不能中断阻塞。
并发就是指代码逻辑上可以并行,有并行的潜力,但是不一定当前是真的以物理并行的方式运行。并发指的是代码的性质,并行指的是物理运行状态。