JavaSE和JavaWeb基础
十三、Java集合
集合主要分为Set、List、Map,Set的实现类有hashSet、TreeSet,set集合主要表现为不重复且有序,List的实现类主要有ArrayList、LinkedList,List集合表现为可重复且无序,Map集合是映射类型,表现为键值对类型,一个键只能对应一个值,Map的实现类主要有HashMap、TreeMap。
1、集合的理解和好处
1.1数组
- 长度开始时必须指定,而且一旦指定,不能更改
- 保存的必须为同一类型的元素
- 使用数组增加/删除元素比较麻烦
1.2集合
- 可以动态保存任意多个对象
- 提供了一系列方便操作对象的方法,例如add,remove,get,set等
- 使用集合添加/删除元素更简单
十四、Java集合排序
1、Comparator和Comparable的区别
Comparator | Comparable |
---|---|
位于java.util包 | 位于java.lang包 |
在要比较的类的外部实现该接口 | 在要比较的类上实现该接口 |
调用sort方法时,要指定Comparator的实现类 | 调用sort方法时,只需指定集合名即可 |
Comparator
第一步:实现要比较的类
第二步:实现Comparator接口
第三步:测试
Comparable
第一步:定义要比较的类,并实现Comparable接口
第二步:测试
十五、Java泛型
1、为什么使用泛型?
- 不用进行强制类型转换
- 避免运行时异常的安全隐患
2、泛型作为方法参数
public void sellGoods(List<? extends Goods> goods)
public void sellGoods(List<? super Goods> goods)
3、自定义泛型类
主要是熟悉泛型类的定义和方法的调用
4、自定义泛型方法
主要是泛型方法的参数的写法和方法的调用
十六、Java多线程
1、线程的概念
程序最小的调度单位,可以同时调用多个程序并行执行
线程常用方法:
- setName:设置线程名称
- getName:返回该线程的名称
- start:使该线程开始执行
- run:调用线程对象run方法
- setPriority:设置线程的优先级
- getPriority:获得线程的优先级
- sleep:在指定的毫秒数内让正在执行的线程休眠(暂停执行)
- interruot:中断线程
- yield:线程的礼让,让出cpu,让其他线程优先执行,但礼让的时间不确定,所以也不一定礼让成功。
- join:线程的插队,插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务
用户线程和守护线程
- 用户线程:也叫工作线程,当线程的任务执行完或者通知方式结束
- 守护线程:一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束
- 常见的守护线程:垃圾回收机制
线程有七大状态
2、创建线程的两种方式
-
通过继承Thread类创建线程(MyThread)
class MyThread extends Thread{ public MyThread(){ } public void run(){ for(int i=0;i<100;i++){ System.out.ptintln(getName()); } } }
- 通过实现Runnable接口创建线程(MyRunnable)(更适用多线程)
为什么要实现Runnable接口?
1、Java不支持多线程
2、不打算重写Thread类的其他方法
3、线程的状态和生命周期
- 线程的状态:
新建-可运行-运行-阻塞-终止
4、sleep()和hjoin()方法
sleep方法可以让线程进行睡眠,join方法可以让线程进行插队
5、线程的优先级
通过Thread.setPrority去设置线程的优先级,优先级高的线程优先执行
6、线程同步
在多线程编程,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。
7、线程间通信
8、修饰符
-
synchronized 修饰符
synchronized是Java中的关键字,是一种同步锁
1、修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是{}括起来的代码,作用的对象是调用这个代码块的对象。
2、修饰一个方法
3、修饰一个静态方法
4、修饰一个类 -
transient 修饰符
-
volatile 修饰符
十七、Java输入输出流
1、流的概念
2、File类的使用
public class FileInputDemo1 {
public static void main(String[] args) {
//创建一个FileInputStream对象
try {
FileInputStream fis=new FileInputStream("imooc.txt");
//int n=fis.read();
int n=0;
//while(n!=-1){
//System.out.print((char)n);
//n=fis.read();
//}
while((n=fis.read())!=-1){
System.out.print((char)n);
}
fis.close();
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch(IOException e){
e.printStackTrace();
}
}
}
FileInputStream:
从文件系统中的某个文件中获得输入字节
用于读取诸如图像之类的原始字节流
public in read(); //从输入流中读取一个字节
public in read(byte[] b);//从输入流中将最多b.length个字节的数据读入到一个byte数组中
public in read(byte[] b,int off,int len);//从输入流中将最多len个字节的数据读入到一个byte数组中
public void close();//关闭流,释放资源
FileOutputStream:
public void write(int b);//将指定字节写入此文件输出流
public void write(byte[] b);//将b.length个字节从指定的数组在写入到此输出流
public void write(byte[] b,int off,int len);//将指定的byte数组中从偏移量off开始的len个字节写入到此输出流
public void close();//关闭流,释放资源
public class FileInputDemo2 {
public static void main(String[] args) {
// 创建一个FileInputStream对象
try {
FileInputStream fis = new FileInputStream("imooc.txt");
byte[] b=new byte[100];
fis.read(b,0,5);
System.out.println(new String(b));
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、字节流
缓冲流
BufferedInputStrem:缓冲输入流
BufferedOutputStrem:缓冲输出流
Demo
public class BufferedDemo {
public static void main(String[] args) {
try {
FileOutputStream fos=new FileOutputStream("imooc.txt");
BufferedOutputStream bos=new BufferedOutputStream(fos);
FileInputStream fis=new FileInputStream("imooc.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
long startTime=System.currentTimeMillis();
bos.write(50);
bos.write('a');
bos.flush();
System.out.println(bis.read());
System.out.println((char)bis.read());
long endTime=System.currentTimeMillis();
System.out.println(endTime-startTime);
fos.close();
bos.close();
fis.close();
bis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}