一、开发环境、数据类型、运算符、执行结构、数组
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}
饿汉式:加载类时,便创建该类的对象,供调用者调用
懒汉式:当第一次调用获取该类的方法时,才创建该类的对象
适配器设计模式:定义一个抽象类,实现接口,重写接口所有的方法。当我们继承这个抽象类时,就可以选择性的重写方法。