参考资料
知识梳理:
1、线程:
thread与runnable——状态——同步与死锁
2、io
字节:Inputstream(Outputstream)——File——FileInputstream(FileOutputstream)——write()和reader()
字符:Writer(Reader)——File——FileWriter(FileReader)——writer()和reader()
3、类集
collection——list——set——map
4、输出map
entrySet——keySet——values
5、查询
forName——getConnection——preperStatement——excuteQuery——next
第九章——多线程
1、进程与线程
所谓多线程是指一个进程在执行过程中可以产生多个更小的程序单元,这些更小的单元称为线程
2、线程的实现
- Thread类
a、覆写run()方法,调用shtart()方法启动线程
b、如果一个类通过继承Thread来实现,那么同一个对象只能调用一次start()方法
- Runnable接口
Runnable接口中只定义了一个抽象方法:public void run()
- 关系
- Thread类是Runnable接口的子类
- 实现Runnable接口可以实现资源共享
2、线程的状态
创建:在程序中创建了一个线程对象后,新的线程对象处于新建状态
就绪:调用start()方法启动线程
运行:当线程被调用获得处理器资源时,线程就进入了运行状态,自动调用该线程的run()方法
阻塞:特殊情况下,如被人为挂起或需要执行耗时的输入/输出操作时,会让出CPU并暂时中止自己的执行
终止:调用stop()方法或run()方法执行结束
3、线程常用的相关方法
方法摘要 | |
| getName |
| getPriority |
| interrupt |
| isAlive |
| join |
| run |
| setName |
| setPriority |
| sleep |
| start |
| yield |
- 线程的优先级:Priority
4、同步与死锁
- 同步
多个操作在同一时间段内只能有一个线程进行,其他线程要等待此线程完成之后才能继续操作
同步代码块
synchronized(同步对象){
需要同步的代码;
}
同步方法
synchronize 返回值 方法名(参数){
}
- 死锁
线程之间互相等待而造成的程序停滞
第十章——泛型
Object类可以接收任意的子类对象
1、泛型的基本应用
class 类 <泛型>{
修饰符 泛型 属性;
public 泛型 getter();
public void setter(泛型 变量){}
}
2、通配符
- 在进行引用传递时泛型类型必须匹配才可以传递
- 无法使用Object进行操作
- 通配符“?”可以接收任意泛型对象,但不能给泛型对象的属性设置内容,可以设置null值
3、泛型的上限extends和下限super
上限
对象参数:泛型类 <? extends 类> 对象
定义类:class 类 <泛型 extends 类>{}
下限
对象参数:泛型类<? super 类> 对象
定义类:class 类<泛型 extends 类>{}
4、泛型与子类继承的限制
子类泛型类型无法使用父类泛型类接收
5、其他泛型应用
- 泛型接口
inter face 接口<泛型>{}
- 泛型方法
<泛型> 泛型 方法(泛型 参数)
第十一章——Java常用类库
1、常用类
- StringBuffer
方法摘要 | |
| append |
| charAt |
| delete |
| deleteCharAt |
| indexOf |
| insert |
| lastIndexOf |
| length |
| replace |
| reverse |
| setCharAt |
| setLength |
| substring |
| toString |
注意:
三者的继承结构
三者的区别:
StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象,而且用到了缓存机制
- Runtime
每一个JVM对应着一个Runtime类的实例,由JVM运行时为其实例化,构造方法私有化
- 日期操作类
new SompleDateFormat("格式").format(new Date());
- Math
sqrt(),max(),min(),pow(),round()
- Ramdom
构造方法摘要 | |
---|---|
Random() 创建一个新的随机数生成器。 | |
Random(long seed) 使用单个 long 种子创建一个新的随机数生成器。 |
方法摘要 | |
---|---|
protected int | next(int bits) 生成下一个伪随机数。 |
boolean | nextBoolean() 返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 boolean 值。 |
void | nextBytes(byte[] bytes) 生成随机字节并将其置于用户提供的 byte 数组中。 |
double | nextDouble() 返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 double 值。 |
int | nextInt() 返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。 |
- Arrays
2、对象克隆技术
实现Cloneable接口,此接口没有定义任何方法,要覆写Object类的clone()方法来实现克隆
第十二章——Java IO
1、File
方法摘要 | |
| compareTo |
| createNewFile |
| delete |
| deleteOnExit |
| equals |
| exists |
| getName |
| getParent |
| getParentFile |
| getPath |
| isDirectory |
| isFile |
| length |
| list |
| listFiles |
| listRoots |
| mkdir |
| mkdirs |
2、字节流
操作时必须接受File类的实例,指明文件路径
- 输出
- 输入
2、字符流
一个字符等于两个字节
- 输出
true表示追加内容,而不是覆盖
- 输入
3、字节流与字符流的区别
a、字符流在操作时使用了缓冲区,字节流在操作时不会用到缓冲区,是文件本身直接操作的
b、关闭字符流时会强制性地将缓冲区中的内容进行输出,不关闭字符流缓冲区的内容是无法输出的,而不关闭字节流依然可以输出
通过缓冲区在操作文件,不关闭字节流依然可以进行操作
4、转换流
输出流
Writer wrier=new OutputStreamWriter(new FileOutputStream(f));
输入流
Reader reader=new InputStreamReader(new FileInputStream(f));
5、打印流
打印流是输出信息最方便的类,可以打印任意数据类型,如小数、整数、字符串等。
PrintStram ps=new PrintStream(new FileOutputStram)(new File(路径));
ps.print(数据);
6、System类对IO的支持
System表示系统类
- System.out
System.out是PrintStream的对象
OutputStream out=System.out;
out.write(内容);
- System.err
System.err表示的是错误信息输出
System.err.println(e);
与System.out的区别
- System.in
System.in实际上是一个键盘的输入流
7、BufferReader
用于从缓冲区中读取内容,所有的输入字节数都将放在缓冲区中
8、Scanner
Scanner类可以接收任意的输入流
9、对象序列化
对象序列化就是把一个对象变为二进制的数据流的一种方法,必须实现Serializable,结合对象流进行输入和输出
10、对象流
可以操作单个对象,也可以操作对象数组
- 输出
- 输入
第十三章——Java类集
所谓类集就是一个动态的对象数组,类集框架本身不受对象数组长度的限制
1、Collection接口
方法摘要 | ||
| add | |
| addAll | |
| clear | |
| contains | |
| containsAll | |
| equals | |
| isEmpty | |
| iterator | |
| remove | |
| removeAll | |
| retainAll | |
| size | |
| toArray | |
| toArray |
Collection接口是单值存放的最大父类接口
2、List接口
List是Collection的子接口,可以保存各个重复的内容
- List接口的常用子类
a、Arraylist是List子类,可以直接通过对象的多态性为List接口实例化
b、LinkedList表示的是一个链表的操作类
3、Set接口
不能加入重复的元素
- Set接口常用子类
- 散列的存放HashSet
- 有序的存放TreeSet
- 自定义的类排序
每个对象所在的类必需都实现Comparable,利用比较器才可以正常的使用
- 自定义类去重
覆写equals和hashCode()
4、Map接口
a、Map接口中的每个元素都使用“key——value”的形式储存
b、Map.Entry接口是Map内部定义的一个接口,实际上每一个“key——value”的数据都保存在了Map.Entry接口实例之后,再在Map集合中插入一个Map.Entry的实例化对象
- Map接口常用子类
- HashMap:无序存放,key不允许重复
- TreeMap:可以排序的Map集合
- 保存对象
匿名对象
实例化对象
对象类覆写haseCode()和equals()
- 输出Map
for(String key:map.keySet()){
String value = map.get(key).toString();
System.out.println("key:"+key+" vlaue:"+value);
}
for(Object m:map.values()){
System.out.println(m);
}
第十四章——枚举
1、定义枚举类
2、Enum
每一个枚举对象都可以包含多个属性,可以通过构造方法赋值,通过setter方法为属性赋值
第十五章——反射机制
一、什么是反射机制?
a、程序在运行时才能得知class的名称,得到所有属性和方法,并生成其对象实体、或对其属性设值、或调用其方法,
b、总结:反射就是加载一个运行时才知道的类以及它完整的内部结构。
二、为什么要用反射机制?
a、首先反射的目的就是为了扩展未知的应用
b、如当需要扩展功能时,我们只需写一个插件,程序运行时,通过反射技术动态的创建和编译形成新类;
三、我们学习过的知识中哪些用了反射机制?
工厂模式、Spring中IOC(或DI)、AOP都使用到了java反射机制
第十六章——Java垃圾回收机制(GC)
1. 既有 GC 机制,为什么还会有内存泄露的情况
在实际开发中有些对象不能被 GC 回收, 如Session对象,如果不及时关闭(close)或清空(flush)就可能导致内存泄露。
2. 对于 Java 的 GC 哪些内存需要回收
Java内存主要包括 5 大部分:程序计数器、虚拟机栈、本地方法栈、方法区、堆。
- 程序计数器、虚拟机栈、本地方法栈
每个线程私有的内存空间,随线程生亡,无需考虑内存回收的问题。
- 方法区和堆
只有在程序运行期才知道会创建那些对象,这部分内存的分配和回收都是动态的,GC 主要关注的是这部分内存
3. Java 的 GC 什么时候回收垃圾
需要同时满足三个条件
a、该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
b、加载该类的ClassLoader已经被回收,即类加载器,负责将class加载到JVM
c、在任何地方都不存在该类对象的引用
4、什么时候启动GC?
a、程序调用System.gc时可以触发;
b、系统自身来决定GC触发的时机。
注意:
内存溢出么原因有哪些?解决方法
a、内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
b、集合类中有对对象的引用,使用完后未清空(通过将对象设置为null等),使得 JVM 不能回收
c、代码中存在死循环或循环产生过多重复的对象实体;
d、启动参数内存值设定的过小;
解决方案:
第一步,修改 JVM 启动参数,直接增加内存。
第二步,检查错误日志
第三步,找出可能发生内存溢出的位置。
第十七章——Java数据库编程
1、JDBC驱动分类
与平台无关的用于执行SQL语句的标准Java API
- JDBC本地驱动:
使用各个数据库生产商提供的JDBC驱动程序,只能 应用在特定的数据库上,会丧失程序的可移植性
- JDBC网络驱动:
将JDBC转换为与DBMS无关的网络协议,之后又被某个服务器转换为一种DBMS协议
能将JDBC的纯Java客户机连接到多种不同的数据库上,是最为灵活的JDBC驱动程序。
- 本地协议纯JDBC驱动:
将JDBC调用直接转换为DBMS所使用的网络协议,从客户机器上直接调用DBMS服务器,用于Intranet访问
2、JDBC操作步骤
查询:加载驱动——建立连接——创建语句——执行语句——处理ResultSet
Class.forName("com.mysql.jdbc.Driver") ;
DriverManager.getConnection(url , username , password )
prepareStatement
ps.executeQuery
rs.next
第十九章——Java网络编程
- URL与URLConnection
URL是统一资源定位符,可以直接使用此类找到互联网上的资源
URLConnection是封装访问远程网络资源一般方法的类,通过它可以建立与远程服务器的连接,检查远程资源的一些属性
- URLEncoder与URLDecoder
URLEncoder可以为传递内容进行编码
URLDecoder可以为传递内容进行解码
- TCP程序设计
每一个客户端都使用一个Socket对象表示
服务器端使用ServerSocket等待客户端的连接,
- UDP程序设计
TCP的所有操作都必须建立可靠的连接,会浪费大量的系统性能。
UDP(不可靠的连接)协议,被广泛用于聊天工具。