一、开发环境、数据类型、运算符、执行结构、数组
1、常用快捷键
    Windows常用快捷键:Ctrl+C 复制  Ctrl+V 粘贴  Ctrl+X 截切 Ctrl+S 保存 Ctrl+Z 回退
    Dos    常用快捷键:Win+R cmd Dos界面 d:切换盘符 cd 切换目录(cd/ cd..)  dir 浏览目录  cls 清屏 exit 保存退出
    idea   常用快捷键:
        Ctrl+D 复制一行  Ctrl+Y 删除  Ctrl+R 替换文本  Ctrl+F 查找文本  Ctrl+H 显示类结构   Ctrl+O 重写方法
        Shift+F6 重命名  F2 高亮错误,快速定位   Alt+Enter 自动导包  Shift+tab 回退一个tab

        Ctrl+Shift+F 全局查找文本
        Ctrl+Shift+E 最近修改文件
        Ctrl+Shift+Enter 完成语句
        Ctrl+Shift+V 选择剪贴内容插入
2、简述JDK和JRE的区别
    JDK:Java开发工具
    JRE:Java运行环境
    JDK = JRE + Java开发工具(java javac jar javadoc )
    JRE = JVM + java核心类库

3、标识符组成?注意事项?
    由字母、数字、下划线、$组成
    不能数字开头。不能是关键字。(关键字全小写)
5、Java数据类型,基本数据类型取值范围
    基本数据类型和引用数据类型
    基本数据类型4类8种 :byte short int long float double char boolean
    对应的字节数:         1    2     4    8    4      8      2     1/4
    取值范围:byte short int long  -2的(字节数*8-1)次方 到 2的(字节数*8-1)-1
    Interger的整型池范围-128 到127  范围内,从整型池获取对象,若值相同,对象相同。超出范围,值相同,对象不同。
6、基本数据类型转换
    显示转换和隐式转换
    隐式转换大小顺序:byte,short,char--->int--->long--->float--->double

7、流程控制
    顺序结构:默认
    循环结构:for  while/do{}while()  continue break(结束一层循环或多层,多层用:标记) return
    分支结构:if else  switch    switch 中数据类型 byte short char int  1.5 枚举  1.7 String

8、运算符
    ++ -- \ %  三目运算
    += 不改变数据类型
    && & 区别:&& 前面为false不再计算后面
    “==”和“equals”区别:若没重写“equals”等价于“==”比较地址值,重写后一般比较对象值

9、一维和二维数组常用定义方法
    int[] arr = new int[2];
    int[] arr = {1,2};
    int[][] arr = new int[2][];


二、面对对象
1、类的成员
    代码块:花括号括起来的代码
        静态代码块:类加载时,加载
        构造代码块:调用构造方法前调用
        局部代码块:方法内部,限定变量生命周期
        同步代码块:获取同步锁后执行
    成员变量:
        成员变量和局部变量区别
        定义位置        类中,方法外              方法中
        初始不同        初始化,有默认值          初始化,并赋值
        内存位置        堆内存                    栈内存
        生命周期        对象销毁                  方法调用完毕
    构造方法:
        无参构造 public 类名(){}
        有参构造 public 类名(参数列表){}
        注意事项:无返回值,方法中也没有具体返回值,方法名与类名完全相同,可以重载不可重写,方法内可以有return但没有意义
    成员方法:
        权限修饰符 其他修饰符 返回值类型 方法名(参数列表){方法体}
        可变参数格式:修饰符 返回值类型 方法名(数据类型…  变量名){}     若方法有可变参数,且有多个参数,那么,可变参数肯定是最后一个

2、封装
    成员变量定义为private,提供getter setter
3、继承
    “is-a”关系时使用继承,单继承,可多层继承。
    代码块:可以理解成继承和不可继承不影响结果
    属性和方法:只可继承非私有
        重载:发生类内部。只需要方法名相同,参数列表不同。
        重写:发生在子父类。方法签名必须相同,子类访问修饰符大于等于父类,返回值类型、异常小于等于父类。
    构造方法:不可继承
        this super:分别指当前对象和父类对象,可以调用本类或父类属性、方法、构造方法,可以在构造方法中共存但是super需要放在第一行
        先调用父类构造方法,再调用子类构造方法,因为子类可能会使用父类的数据,如果父类没有无参构造用super显示调用有参构造
    继承的好处和弊端:
        好处:增加代码的复用性  提高代码的维护性  多态的前提
        弊端:增加了代码的耦合性
4、多态
    向上转型:Father f = new Son();
    向下转型:Son s = (Son)f;
    访问特点:
        成员变量:编译看左,运行看左
        成员方法(非静态):编译看左,运行看右   可以调用重写方法,但是不能调用子类特有方法
        静态方法:编译看左,运行看左
    好处:提高代码复用性(继承提供),提高代码扩展性(多态提供)
    弊端:不可访问子类属性和特有的方法
5、抽象类特点,成员特点?
    特点:
        abstract 修饰
        不能实例化,可由子类实例化
        可以有抽象方法也可以没有              可以没有抽象方法,意义在于不让其他类实例化他
        若子类不是抽象方法,需要重写抽象方法
    成员特点:
        成员变量:可以是变量和常量  不可用abstract修饰
        成员方法:可以是抽象方法也可以不是
        构造方法:有构造方法,供子类调用
6、接口特点,成员特点?
    特点:interface 修饰;可以多实现,接口可以继承接口 ;不能实例化;实现接口的类若不是抽象类需要重写方法。
    成员特点:
        成员变量:public static final
        成员方法:必须是抽象方法
        构造方法:没有
7、抽象类和接口的区别?
    成员区别:成员变量、成员方法、构造方法
    关系区别:抽象类只能单继承或多层继承。接口可以多实现,接口间可以多继承。
    含义不同:抽象类代表“is-a”关系。接口代表“like-a” 多指功能的扩展
8、package
    注意事项:
        一个类只能有一个 package
        package 只能在第一行
        如果没有显示定义 package,默认无包名
        package  import class  顺序
    带包的类如何编译和运行:
        编译:javac -d . 类名.java
        运行:java 包名.类名
9、权限修饰符
    public protected 默认修饰符 private
10、static特点及注意事项
    特点:类加载时加载,优先于对象存在,所有对象共有,类名.形式调用
    注意事项:static方法不可调用非static方法,static方法内部不可使this
11、final可以做什么?有什么特点?
    修饰类:该类不可被继承(类中方法隐式final修饰)
    修饰成员变量:该变量变为常量,不可改变其值。若是引用类型,不可改变地址值,可改变其内容。
    修饰成员方法:该方法不可被重写
12、abstract不能和那些修饰词共用
    final:abstract 是为了让子类继承和重写,但是final不能重写或者继承。意义相反
    static:static 修饰的方法为类的方法,由类直接调用,abstract 修饰的方法没有方法体,调用没有意义
    private:private 修饰的方法,子类不能访问,也没有意义
13、final,finally 和 finalize 的区别
    final 表示“最后的”不可修改。
        修饰类,该类不可被继承。且类中方法隐式定义为final
        修饰方法,该方法不可被重写。
        修饰变量,该变量为常量,不可修改值,若是引用类型,不可修改地址值,内容可改变。
    finally  用于try ..catch..finally 语句中,一般用于释放资源
        除了try不执行  或者  System.exit(0)等类似情况外 一定会执行
    finalize 定义于object。用于gc回收对象前,释放对象所占用的内存。一般不建议重写
14、volatile
15、匿名内部类格式?
    new 抽象类或接口(){
        重写方法
    };
    局部内部类访问局部变量,局部变量必须用final修饰


三、常用API
0、Math
   Math.random()  [0,1)   ceil 向上取整  floor 向下取整  round = Math.floor(a+0.5)
1、String的常用方法:
    (1)String类的特征
        final 修饰,不可继承
        重写了equals方法
    (2)String类的构造方法
        new String();
        new String(byte[] bytes);
        new String(byte[] bytes,int index,int length);
        new String(char[] chars);
        new String(char[] chars,int index,int length);
        new String(String original);
    (3)String类的常见判断功能及课堂案例
        boolean equals(String str);
        boolean equalsIgnoreCase(String str);
        boolean contains(String str);
        boolean startsWith(String str);
        boolean endsWith(String str);
        boolean isEmpty();
    (4)String类的常见获取功能及课堂案例
        int length();
        char charAt(int index);
        int indexOf(String str);
        int indexOf(String str,int index);
        String substring(int index);
        String substring(int index,int end);
    (5)String类的常见转换功能及课堂案例
        String valueOf();
        String trim();
        String replace(String old,String new);
        String[] split(String regex);
        char[] toCharArray()
2、String、 StringBuffer、 StringBuilder 区别?
    String 是不可变字符串
    StringBuffer 线程安全,效率较低
3、正则表达式是什么?语法是什么?
    具有一定规则的字符串
    ^ 开始 \d 数字 \D 非数字 \w 字母 \W 非字母 . 任意 [a-z] 范围  | 或者  ()\1 反向引用,与括号一起用  0整个表达式 1第一个括号内容  2第二个
    数量
    ?  [0-1]
    *  [0,无穷]
    +   [1,无穷]
    {m,n}   [m,n]
4、正反斜杠
    斜杠“/”  向左,正派  反斜杠“\”向右,反派
    斜杠一般用作分隔符  反斜杠一般用作转义
    java 中反斜杠是一个转义字符,非常特殊。所以需要用用它时需要用\来转义
    中文匹配  [\u4E00-\u9FA5]

5、Date Calendar GregorianCalendar SimpleDateFormat
    Date : 日期时间类,仅仅表示时间,或者存储某个特定的时间
    Calendar ca = new GregorianCalendar();
    或者Calendar.getInstance(); 日历类,可以获取时间的年月日等  获取的星期要减一,月份要加一
    SimpleDateFormat:可以实现文本和时间的互相转换,以及改变时间的表示格式   yyyy-MM-dd HH-mm-ss

6、泛型
   好处:提高安全性(将运行期的错误转换到编译期);省去强转的麻烦
   注意:1.7的新特性菱形泛型;泛型必须是引用类型
   使用:
       定义在类上    public class 类名<泛型类型1,…>
       定义在方法上  public <泛型类型> 返回类型 方法名(泛型类型 变量名)
       定义在接口上  public interface 接口名<泛型类型>
   泛型通配符:
        任意类型,如果没有明确,那么就是Object以及任意的Java类了
        * B:? extends E
        * 向下限定,E及其子类
        * C:? super E
        * 向上限定,E及其父类

7、list去重  contains
   LinkedList类特有功能
       public void addFirst(E e)及addLast(E e)
       public E getFirst()及getLast()
       public E removeFirst()及public E removeLast()
       public E get(int index);
   ArrayList 、LinkedList 、Vector 区别:
        ArrayList: 底层数组,线程不安全,效率较高。适合查询,不适合增删。每次增容50%
        Vector:    底层数组,线程安全,效率较低。  适合查询,不适合增删。每次增容1倍
        LinkedList:双向链表,线程不安全,效率较高。适合增删,不适合查询。有大量操作首尾元素方法。

8、set 自动去重
   HashSet 去重原理
        当HashSet调用add()时,
        * 先调用对象hashCode()得到哈希值, 比较哈希值,无相同则存入集合
        * 有相同,再用equals()比较相同哈希值对象,结果为false存入,true则不存
        所以 ,将自定义类的对象存入HashSet,类必须重写hashCode()和equals()方法
   LinkedHashSet的特点
        * LinkedHashSet 是HashSet子类
        * 可以保证怎么存就怎么取
   TreeSet
        特点:
        * TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列
        使用方式:
        * a.对象实现Comparable,重写compareTo方法,this-参数  或  this compareTo 参数 为升序,反之逆序
        * b.创建TreeSet的时候可以new 一个Comparator,重写compare()方法,o1 -o2 或 o1 compareTo o2 为升序,反之逆序
        两种方式的区别:
        * TreeSet构造函数什么都不传, 默认按照类中Comparable的顺序(没有就报错ClassCastException)
        * TreeSet如果传入Comparator, 就优先按照Comparator
9、Collections成员方法
    public static <T> void sort(List<T> list)
    public static <T> int binarySearch(List<?> list,T key)
    public static <T> T max(Collection<?> coll)
    public static void reverse(List<?> list)
    public static void shuffle(List<?> list)
    集合、数组互转
    * Arrays工具类的asList()方法的使用  Arrays.asList(T[] a);
    * Collection中toArray(T[] a)泛型版的集合转数组  list.toArray(new T[list.size()]);
10、 三种迭代的能否删除
    * 普通for循环,可以删除,需要索引
    * 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
    * 增强for循环不能删除

11、HashMap
    * Set<Map.Entry<K,V>> entrySet():
    * V get(Object key):根据键获取值
    * Set<K> keySet():获取集合中所有键的集合
    * Collection<V> values():获取集合中所有值的集合
    HashMap和Hashtable的区别
    * Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高
    * Hashtable不可以存储null键和null值,HashMap可以存储null键和null值

12、异常
    继承体系:
        * Throwable
            * Error
            * Exception
                * RuntimeException  运行时异常,其他为编译时异常
    异常处理的两种方式
        * a:try…catch…finally
            注意:finally块的语句在try或catch中的return语句执行之后返回之前执行
                finally里的修改语句可能影响也可能不影响try或catch中 return已经确定的返回值,
                若finally里也有return语句则覆盖try或catch中的return语句直接返回
        * b:throws
            throws和throw的区别:
            * a:throws
            * 用在方法声明后面,跟的是异常类名
            * 可以跟多个异常类名,用逗号隔开
            * 表示抛出异常,由该方法的调用者来处理
            * b:throw
            * 用在方法体内,跟的是异常对象名
            * 只能抛出一个异常对象名
            * 表示抛出异常,由方法体内的语句处理
    Throwable的几个常见方法
        * a:getMessage()
        * 获取异常信息,返回字符串。
        * b:toString()
        * 获取异常类名和异常信息,返回字符串。
        * c:printStackTrace()
        * 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

13、File
    构造方法
        * File(String pathname):根据一个路径得到File对象
        * File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
        * File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
    创建功能
        * public boolean createNewFile():创建文件 如果存在这样的文件,就不创建了
        * public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了
        * public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来
    重命名和删除功能
        * public boolean renameTo(File dest):把文件重命名为指定的文件路径。(路径名不同,就是改名并剪切)
        * public boolean delete():删除文件或者文件夹(删除一个文件夹,该文件夹内不能包含文件或者文件夹)
    判断功能
        * public boolean isDirectory():判断是否是目录
        * public boolean isFile():判断是否是文件
        * public boolean exists():判断是否存在
        * public boolean canRead():判断是否可读
        * public boolean canWrite():判断是否可写
        * public boolean isHidden():判断是否隐藏
    获取功能
        * public String getAbsolutePath():获取绝对路径
        * public String getPath():获取路径
        * public String getName():获取名称
        * public long length():获取长度。字节数
        * public long lastModified():获取最后一次的修改时间,毫秒值
        * public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
        * public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
    文件名称过滤器的概述
        * public String[] list(FilenameFilter filter)
        * public File[] listFiles(FileFilter filter)

14、流
    按流向分为两种:输入流,输出流
    按操作类型分为两种:字节流,字符流
        字节流的抽象父类:InputStream OutputStream
        字符流的抽象父类:Reader      Writer
    IO程序书写
        * 使用前,导入IO包中的类
        * 使用时,进行IO异常处理
        * 使用后,释放资源
    BufferedInputStream和BufferOutputStream:装饰者模式
    使用指定的码表读写字符:
        FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表)
        FileWriter是使用默认码表写出文件, 如果需要使用指定码表写出, 那么可以使用OutputStreamWriter(字节流,编码表)
        BufferedReader br =                            //高效的用指定的编码表读
        new BufferedReader(new InputStreamReader(new FileInputStream("UTF-8.txt"), "UTF-8"));
        BufferedWriter bw =                            //高效的用指定的编码表写
        new BufferedWriter(new OutputStreamWriter(new FileOutputStream("GBK.txt"), "GBK"));
15、实现线程的常用方法
    继承thread类  实现runnable接口   都可以使用匿名内部类
        获取当前线程的对象  Thread.currentThread()
    线程的生命周期:新生 就绪 运行 阻塞 死亡
    Java线程生命周期:新生  运行  阻塞  等待  超时等待 死亡
    sleep方法和wait方法的区别?
        * sleep在同步代码块或者同步函数中,不释放锁。必须传入参数,时间到了自动醒来。
        * wait 在同步代码块或者同步函数中,释放锁。  可以传入参数,也可以不传入参数 。通常用的都是没有参数的wait方法
    Timer类(计时器)
        Timer timer = new Timer();
        timer.schedule(TimerTask ,Date);  TimerTask规定了计时结束后的操作,Date,规定了计时的时间和循环周期。

16、反射(可以越过泛型检查)
    获取反射类的三种方法
        Class类的静态方法forName(String className)   Class.forName("Reflect");
        类的静态属性class                            Reflect.class;
        对象的getClass()方法                         new Reflect().getClass();
    通过反射获取带参构造方法并使用
        无参构造函数创建对象: Reflect reflect1 = (Reflect) clazz3.newInstance();
        有参或指定的构造函数:Reflect reflect2 = (Reflect) clazz3.getConstructor(String.class,String.class).newInstance("反射2","长度2");
    通过反射获取成员变量并使用
        获取可见指定字段并赋值: Field size = clazz3.getField("size");  size.set(reflect1,"长度1");
        获取私有指定字段并赋值:Field name = clazz3.getDeclaredField("name"); name.setAccessible(true); name.set(reflect1,"反射1");
    通过反射获取方法并使用
        获取可见指定方法并执行:Method method2 = clazz3.getMethod("method2", String.class); method2.invoke(reflect1,"参数2");
        获取不可见指定方法并执行:Method method1 = clazz3.getDeclaredMethod("method1",String.class);  method1.setAccessible(true); method1.invoke(reflect1,"参数1");

17、单例设计模式:保证类在内存中只有一个对象。
    (1)控制类的创建,不让其他类来创建本类的对象。private
    (2)在本类中定义一个本类的对象。Singleton s;
    (3)提供公共的访问方式。  public static Singleton getInstance(){return s}
    饿汉式:加载类时,便创建该类的对象,供调用者调用
    懒汉式:当第一次调用获取该类的方法时,才创建该类的对象

    适配器设计模式:定义一个抽象类,实现接口,重写接口所有的方法。当我们继承这个抽象类时,就可以选择性的重写方法。