目录
三、String StringBuffer StringBuilder的区别:
* 关于String 、StringBuffer 、StringBuilder三者的异同?
* 对比String 、StringBuffer 、StringBuilder三者的效率?
* 线程通信的例子:使用两个线程打印 1-100,线程1,线程2, 交替打印
* 面试题:sleep()和 wait()方法的异同? (重要)
解决线程安全问题(synchronized关键字 和 lock锁)
* 1.面试题: synchronized(同步代码块) 与 Lock(Lock锁)的异同?
一、Java基本数据类型
二、集合体系
/**
* 一、集合框架的概述
*
* 1.集合、数组都是对多个数据进行存储操作的结构,简称Java容器。
* 说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储(.txt .jpg .avi 数据库中等)
*
* 2.1数组在存储多个数据方面的特点:
* 》一旦初始化以后,其长度就确定了。
* 》数组一旦定义好,其元素的类型也就确定了/ 更严格(是好处)。我们也就只能操作指定类型的数据了。
* 比如: String[] arr;int[] arr1;Object[] arr2;
* 》
* 2.2数组在存储多个数据的缺点:
* 》一旦初始化以后,其长度就不可修改。
* 》数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便。同时效率不高。
* 》获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用。
* 》数组中存储数据的特点:有序,可重复,对于无序、不可重复的需求,不能满足。
*
集合框架
*
* /----------Collection接口:单列集合,用来存储一个一个的对象
* /----List接口:存储有序的、可重复的数据。-----》“动态“数组
* /------ArrayList、linkedList、Vector
* /----Set接口:存储无序的、不可重复的数据
* /-------HashSet、LinkedHashSet、TreeSet
* /-----------Map接口 :双列集合,用来存储一对(key--->value)一对的数据 /键值对
* /----HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
*
1、ArrayList源码分析:
2、HashMap底层原理:
三、String StringBuffer StringBuilder的区别:
* 引用数据类型
* final 修饰类,表示不可继承;
修饰常量,表示不可修改的常量
* 关于String 、StringBuffer 、StringBuilder三者的异同?
*
* String:不可变的字符序列(底层使用char[]存储)现在是使用byte[]存储
* StringBuffer:可变的字符序列;线程安全的,效率低;(底层使用char[]存储)现在是使用byte[]存储
* StringBuilder:可变的字符序列;jdk5.0新增的;线程不安全的(没有synchronized),效率高;(底层使用char[]存储)现在是使用byte[]存储
*
*
* 源码分析:
* String str=new String(); //char[] value=new char[0];
* String str=new String("abc"); //char[] value=new char[]{'a','b','c'};
*
* StringBuffer sb1=new StringBuffer(); //char[] value=new char[16];
*
* System.out.println(sb1.length); //长度依然为0
*
* sb1.append('a');//value[0]='a';
* sb1.append('b');//value[1]='b';
*
* StringBuffer sb2=new StringBuffer("abc");//char[] value=new char["abc".length+16];
*
*
*
* public synchronized int length() {
* return count;
* }
*
* 问题一:System.out.println(sb2.length()); //长度为3 return count; 有效字符的数量,并不是字符数组真实的长度
* 问题二:扩容问题:如果要添加的数据底层数组盛不了了,那就需要扩容底层的数组。
* 默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。
*
*
* 指导意义:开发中建议使用:StringBuffer(int capacity) 或 StringBuilder(int capacity) (避免自动扩容)
* //关于容量参数的构造方法
* 增:append(xxx);添加任意类型;返回值仍为StringBuffer,即可以在后面继续调用append(yyy).append(zzz)....构成方法链
* 删:delete(int start,int end)
* 改:setCharAt(int n,char ch) / replace(int start,int end,String str)
* 查:charAt(int n)
* 插:insert(int offset,xxx) 可插入任意类型
* 长度:length()
* *遍历:for+charAt() / toString()
* 对比String 、StringBuffer 、StringBuilder三者的效率?
* 从高到低排列:StringBuilder --> StringBuffer --> String
四、int和Interger的区别
- int是基本数据类型,Integer是引用数据类型;
- int默认值是0,Integer默认值是null;
- int类型直接存储数值,Integer需要实例化对象(new),指向对象的地址。
五、多线程
** 进程和线程的区别(多线程)--》重要 **
* 面试题:创建线程有几种方式?
* 四种:继承Thread 实现Runnable 实现Callable 使用线程池
/**
* 创建线程的的方式三:实现Callable接口。 ----->JDK5.0新增
*
* 如何理解实现Callable接口的方式创建多线程比实现Runnable接口创建多线程方式强大?
* 1.call()可以有返回值的;
* 2.call()可以抛出异常,被外面的操作捕获,获取异常的信息;
* 3.Callable是支持泛型的。
* 创建线程的方式四:使用线程池
*
*背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响非常大。
*
* 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。
* 好处:
* 1.提高响应速度(减少了创建新线程的时间)
* 2.降低资源消耗(重复利用线程池中线程,不需要每次都创建)
* 3.便于线程管理
*
* corePoolSize:核心池的大小
* maximumPoolSize:最大线程数
* keepAliveTime:线程没有任务时做多保持多长时间后终止
/**快捷键:Ctrl+alt+T 是显示出用什么方法包围所选中的代码(本例中是选中同步代码,用synchronized包围,解决线程安全问题)
* 线程通信的例子:使用两个线程打印 1-100,线程1,线程2, 交替打印
*
* 涉及到的三个方法:
* wait():一旦执行此方法,当前线程就会进入阻塞状态,并释放同步监视器(释放锁)。
* notify():一旦执行此方法,就会唤醒被wait()的一个线程,如果有多个线程被wait(),我们就唤醒优先级高的。
* notifyAll():一旦执行此方法,就会唤醒所有的被wait()的线程。
*
* 注意点:
* 1.wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中。
* 2.wait(),notify(),notifyAll()三个方法的调用者必须是同步代码块或者同步方法中的同步监听器。
* 否则会出现IllegalMonitorStateException异常.
*3.wait(),notify(),notifyAll()三个方法是定义在java.lang.Object类中。
* 任何一个类的对象都可以充当同步监听器,而相同的这三个方法也是被同步监听器所调用,所以任何一个类的对象都可以调用这三个方法
*
* 面试题:sleep()和 wait()方法的异同? (重要)
*1.相同点:一旦执行方法,都可以使当前线程进入阻塞状态。
* 2.不同点:
* 1)两个方法声明的位置不一样,Thread类中声明sleep(),Object类声明wait()。
* 2)调用的要求不同:sleep()方法可以在任何需要的场景下调用,wait()方法必须使用在同步代码块或同步方法中(由同步监听器调用)。
* 3)关于是否释放同步监听器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放同步监听器,而wait()会释放锁。
/**
解决线程安全问题(synchronized关键字 和 lock锁)
* 同步代码块,同步方法(synchronized)、lock手动上锁,手动释放锁
*
* 解决线程安全问题的方式三:Lock锁 -----> JDK5.0新增
* 1.面试题: synchronized(同步代码块) 与 Lock(Lock锁)的异同?
* 相同:两者都可以解决线程安全问题
* 不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监听器
* Lock需要手动地启动同步(lock()),同时结束同步也需要手动的实现(unlock())
*
*2.优先使用顺序:
* Lock---> 同步代码块(已经进入了方法体,分配了相应的资源) ---> 同步方法(在方法体之外)