1.迭代器:Iterator,本身就是一个接口
代码:BS_190607/BasicIterator
迭代器提供了一个统一的接口来遍历Map,Set,List
JDK源码:重要的方法hasNext(),是否有下一个
2.collections:工具类,工具类不需要对象,直接用,Collections.sort() Math.PI
代码:BS_190607/BasicCollections
常用的方法有:sort()从小到大排序,字符串按照字母序;shuffle()随机排序;reverse()逆序排列;binarySearch()二分查找序列中有无指定的元素,有则返回下角标,没有则返回-1
3.JavaBean:使用JavaBean存储表格数据(分别使用list,map来遍历)
代码:BS_190607/BasicJavaBean
一个完整的JavaBean要有set,get方法,和一个空的构造函数
4.IO流:以程序为中心,->程序(输入流),程序->(输出流)
五个类三个接口:File(文件类),InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流),Closeable(关闭流接口)通知操作系统你可以释放了,JVM无法调用Java的垃圾回收机制,Flushable(刷新流接口),Serializable(序列化接口)
分类:按流向:输入流(InputStream,Reader),输出流(OutputStream,Writer)
按功能:节点流(可以直接从数据源取数据),包装流(经过包装,提高了性能)
按数据:字符流(操作纯文本,能使用字符流的一定能使用字节流),字节流(视频,音频,直接操作字节,能使用字节流的不一定能使用字符流)
File,FileInputStream,FileOutputStream,FileReader都是存放在硬盘上的,这些文件JVM(Java虚拟机)无权访问,必须借助操作系统,使用完之后,要通知操作系统释放资源
然鹅,字节数组流不用关闭,应为它存放到内存中,使用完后,Java的垃圾回收机制会进行处理;任何东西都可转成字节数组,字节数组的容量不要太大
File对象可以构建一个文件,一个文件夹,这个文件/文件夹可以不存在
路径表示
// 路径表示方法一
String Path = "E:/Study/Image/ball.png";
// 路径表示方法二
String Path2 = "E:" + File.separator + "Study" + File.separator+ "Image" + File.separator + "ball.png";
//文件
System.getProperty("user.dir");//查看我当前工程的路径
xxx.getAbsolutedPath()//得到xxx的绝对路径
xxx.getName()//得到文件名
xxx.getPath()//给什么路径返回什么路径
xxx.getParent()//获取父路径,不存在的话,返回null
xxx.getParentFile().getName()//返回父对象的名称
//文件状态
xxx.exists()//是否存在
xxx.isFile()//是否是文件
xxx.isDirectory()//是否是文件夹
xxx.length()//返回的是文件的字节数,文件夹返回0
xxx.createNewFile()//创建文件不是文件夹,返回Boolean,不存在才创建,存在了返回false
xxx.delete()//删除,返回Boolean
注意:con,com3是操作系统的关键字,不能作为文件的名称
mkdir:创建要保障父目录存在
mkdirs:创建时没有父目录会创建出来
字符—>字节,叫编码encode;字节—>字符,叫解码 decode
常用的字符集:UTF-8(一个中文占3个字节), GBK
字节输入流:InputStream
package BS_190608;
/**
* 字节输入流
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
public class BasicIOtest {
/**
* 1.创建流 2.选择流 3.操作 4.释放资源
* @param args
*/
public static void main(String[] args) {
// 1.创建流
File file = new File("test01.txt");
// 2.选择流
InputStream is = null;
try {
is = new FileInputStream(file);
// 3.操作
int temp;
while ((temp = is.read()) != -1) {
System.out.println((char) temp);
}
/**
* int data1 = is.read(); int data2 = is.read(); int data3 =
* is.read(); System.out.println((char) data1);
* System.out.println((char) data2); System.out.println((char)
* data3);
**/
// 4.释放资源
// is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if (null != is)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节数组输出流:OutputStream
package BS_190608;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
public class BasicOutStream {
/**
* 字节输出流 1.创建源2.选择流3.操作4.释放资源
* @param Lona
*/
public static void main(String[] args) {
// 1.创建源
File src = new File("test02.txt");
// 2.选择流
OutputStream os = null;
try {
os = new FileOutputStream(src, true);// 加上true在文件夹后面追加内容
// 3.操作(写出,写到文件里面去)
String msg = "IO is so easy";
byte[] datas = msg.getBytes();// 字符串--->字节数组(编码)
os.write(datas, 0, datas.length);
os.flush();// 刷新一下
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (null != os) {
// 4.释放资源
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字节数组输入流:
package BS_190608;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
public class BasicArray {
/**
* 字节数组输入流 1.创建源:源头是字节数组,不要太大 2.选择流 3.操作 4资源可以不用释放
* @param args
*/
public static void main(String[] args) {
byte[] src = "talk is cheap show me the code".getBytes();// 字节数组
InputStream is = null;
try {
is = new ByteArrayInputStream(src);
// 操作
byte[] flush = new byte[5];
int len = -1;// 接受长度
while ((len = is.read(flush)) != -1) {
String str = new String(flush, 0, len);
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (null != is)
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节数组输出流:
package BS_190608;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class BasicIOArray {
/**
* 字节数组输出流 :ByteArrayOutputStream 1.创建源:内部维护2.选择流:不关联源3.操作4.释放资源:可以不用
* 这个流有特殊的东西和之前的有差别 //拿到这个数据:toByteArray
* @param Lona
*/
public static void main(String[] args) {
// 1.创建流
byte[] dest = null;
// 2.选择流
ByteArrayOutputStream baos = null;
try {
baos = new ByteArrayOutputStream();// 加上true在文件夹后面追加内容
// 3.操作(写出,写到文件里面去)
String msg = "show me decode";
byte[] datas = msg.getBytes();// 字符串--->字节数组(编码)
baos.write(datas, 0, datas.length);
baos.flush();// 刷新一下
// 获取数据
dest = baos.toByteArray();
System.out.println(dest.length + "----"
+ new String(dest, 0, dest.length));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (null != baos) {
// 4.释放资源
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
5.多线程:高可用,高性能,高并发;真正的多线程具有多核CPU
程序是静态的概念,就是指代码;进程(是资源分配的单位)是CPU调度,是动态的概念;线程是指一个进程中开辟多条路径(调度和执行的单位)
main()称为主线程
线程的几种实现方式:
1)Thread(尽量少用,Java是单一继承)
创建:创建一个类继承Thread,重写run方法
启动:创建子类对象,子类对象调用start方法(start是本地方法,我们看不到,它自己去找新的线程,本方法不保障立即运行,加入到调度器中去,看cpu时间片)
2) Runnable(尽量用这种)
创建:创建一个类实现Runnable接口,重写run方法
启动:创建实现类接口,创建代理类接口,调用start方法
3) Callable
Callable的call方法可以抛出异常,返回类型默认的是Object
重写call方法
创建执行任务
提交执行
获取结果
关闭服务
线程状态:运行,就绪,阻塞,新生,死亡
线程的新生状态:new一个对象的时候进入新生状态
线程的就绪状态:调用start方法时,yield将运行状态转成就绪态
线程的运行状态:CPU调度
线程的终止/死亡状态:1)次数达到,正常终止;2)外部干涉,加入标识(不要使用stop,destory,这两种方法不安全)
线程的阻塞状态:sleep方法:sleep(指定时间,单位毫秒);存在异常InterruptedException;sleep时间到达后进入就绪状态;可以模拟网络延时,倒计时;
package BS_190610;
public class BasicYield {
/**
* yeild礼让线程,从运行状态到就绪状态
* @param args
*/
public static void main(String[] args) {
MyYield td = new MyYield();
new Thread(td, "a").start();
new Thread(td, "b").start();
}
}
class MyYield implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "--->start");
Thread.yield();
System.out.println(Thread.currentThread().getName() + "--->end");
}
}
join()方法,插队线程,必须等他执行完,其他的线程才能执行;通过Thread对象来调用它
进入就绪状态:1)新生状态通过调用start();2)阻塞状态进入就绪态;3)运行状态调用yeild();4)jvm内部操作
进入阻塞状态:1)wait();2)sleep();3)join();4)read,write
线程的优先级:优先级不代表执行顺序,代表的是执行的概率;几个代表值NORM_PRIORITY:5;MIN_PRIORITY:1;MAX_PRIORITY:10;数值大小不能超过10
代码:BS_190610/BasitcThreadClass
线程的分类:用户线程和守护线程;系统默认的是用户线程,守护线程是为用户线程服务的,JVM虚拟机必须确保用户线程执行完毕,不需要等待守护线程执行完毕
代码:BS_190610/BasicBlessThread
线程常用的其他方法:1)isAlive()判断线程是否还活着;2)setName()给线程一个名字;3)getName()获取(代理)线程的名字;4)currentThread()获取当前正在运行的线程对象
线程同步:1)队列;2)锁synchronized(锁方法,锁块)
6.一个类它没有构造器有两种情况:1)内部有静态方法返回这个对象 2)它是一个静态的工具类,不需要对象
7.IP的作用:定位一个节点,路由,通信设备
InetAddress类的使用
InetAddress inet = null;
try {
inet = InetAddress.getLocalHost(); // 使用getLocalHost()创建InetAddress对象
} catch (UnknownHostException e) {
e.printStackTrace();
}
System.out.println(inet);//主机名/IP地址
System.out.println(inet.getHostAddress());// IP地址
System.out.println(inet.getHostName());// 主机名
try {
inet = InetAddress.getByName("www.baidu.com");
} catch (UnknownHostException e) {
e.printStackTrace();
}
System.out.println(inet);//www.baidu.com/61.135.169.121,百度服务器的IP
公认的端口1024以下的
常用命令:
netstat -ano //查看所有端口
netstat -ano | findstr "80" //查看指定端口
URL类:
URL url = new URL(
"https://www.so.com/s?ie=utf-8&src=hao_360so_b&shb=1&hsid=1a2829372d1a5d38&q=查看指定端口的命令");
System.out.println("获取协议:" + url.getProtocol());// https
System.out.println("获取域名||IP:" + url.getHost());// www.so.com
System.out.println("获取端口:" + url.getPort());// -1
System.out.println("获取资源1:" + url.getFile());// 将uri和参数,锚都打印出来
System.out.println("获取资源2:" + url.getPath());// 只打印uri
System.out.println("获取参数:" + url.getQuery());
System.out.println("获取锚点:" + url.getRef());// null