1.java.io.Writer和java.io.OutputStream的区别 OutputStream Writer 字节流,以byte为单位 字符流,以char为单位 写入字节(0-255):void write(int b) 写入字符(0-65535):void write(int c) 写入字节数组 void write(byte[] b) 写入字符数组void wirlte(char[] c) void write(byte[] b, int off, int len) void w…
1.java.io.Reader和java.io.InputStream的区别 InputStream Reader 字节流,以byte为单位 字符流,以char为单位 读取字节(-1,0-255):int read() 读取字符,(-1,0-65535):int read() 读到字节数组:int read(byte[] b) 读到字符数组:int read(char[] c) int read(byte[] b, int off, int len) int read(char[] c, in…
1.JDK提供的InputStream分为两类: 直接提供数据的InputStream * FileInputStream:从文件读取 * ServletInputStream:从HTTP请求读取数据 * Socket.getInputStream():从TCP连接读取数据 提供额外附加功能的FilterInputStream * 如果要给FileInputStream添加缓冲功能: BufferedFileInputStream extends FileInputStream * 如果要给Fi…
1.序列化 序列化是指把一个Java对象变成二进制内容byte[] 序列化后可以把byte[]保存到文件中 序列化后可以把byte[]通过网络传输 一个Java对象要能序列化,必须实现Serializable接口: * Serializable接口没有定义任何方法 * 空接口被称为标记接口(Marker Interface) ObjectOutputStream负责把一个Java对象写入二进制流: try(ObjectOutputStream output = new ObjectOutputS…
1.从classpath读取文件可以避免不同环境下文件路径不一致的问题. Windows和Linux关于路径的表示不一致 Windows:C:\conf\default.properties Linux:/User/admin/conf/default.properties //先获取getClass(),再通过getResourceAsStream可以获取任意的资源文件 try(InputStream input = getClass().getResourceAsStream("/defau…
1.ZipInputStream是一种FilterInputStream 可以直接读取zip的内容 InputStream->FilterInputStream->InflateInputStream->ZipInputStream->JarInputStream JarInputStream使用ZipInputStream派生出来的,可以直接读取jar文件的MANIFEST.MF文件 ZipInputStream的基本用法: try(ZipInputStream zip = ne…
1. Socket 在开发网络应用程序的时候,会遇到Socket这个概念. Socket是一个抽象概念,一个应用程序通过一个Socket来建立一个远程连接,而Socket内部通过TCP/IP协议把数据传输到网络. Socket/TCP/部分IP都是由操作系统提供的.不同的编程语言只是提供了对操作系统调用的加单封装,例如Java提供的几个Socket相关的类就封装了操作系统提供的接口. 为什么需要Socket? 因为仅仅通过IP地址进行通信还不够,同一台计算机同一时间会运行多个网络程序.当计算机收…
TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通常使用一个无限for循环,在这个for循环内部,每次调用accept方法,返回一个与远程客户新建的Socket连接,紧接着启动一个新的线程,来处理这个连接. ServerSocket ss = new ServerSocket(port); for( ; ; ){ Socket sock = ss.…
1. UDP编程: 不需要建立连接 可以直接发送和接收数据 1.1 客户端 DatagramSocket sock = new DatagramSocket(){} sock.connect(addr,9090);//并不建立连接 //接收 byte[] data=...; DatagramPacket packet = new DatagramPacket(data, data.length); sock.send(packet); //发送 byte[] buffer = new byte[…
1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract void run(); } public class Student extends Person{ @Override public void run(){} } public class Teacher extends Person{ @Override public void run(){}…
每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法: 抽象方法用abstract修饰 抽象方法没有任何执行语句 因为无法执行抽象方法,因此这个类也必须声明为抽象类abstract class 无法实例化一个抽象类.如果子类不是抽象类,依旧可以被实例化. 抽象类作用: 抽象类用于被继承 抽象类可以强迫子类实…
1.继承 继承是一种代码复用的方式. Student与Person有相同部分的代码. Student可以从Person继承,这样Student获得了Person的所有功能,只需要编写新增的功能即可.通过继承,可以实现代码的复用. 继承使用关键字extends,一个类只能有一个父类. 如果没有写明继承类,编译器会自动指定该类继承于基类Object. Person:超类super,父类,基类 Student:子类subclass,扩展类 Person.java //默认继承Object public…
1.对象的概念 面向对象编程:Object-Oriented Programming 对现实世界建立计算机模型的一种编程方法. 现实世界 计算机模型 Java代码 人 类/class class Person() 小明 实例/ming Person ming = new Person() 小红 示例/hong Person hong = new Persion() 小军 示例/jun Person jun = new Persion() 书 类/class class Book() Java核心…
函数名也是变量: >>> f = abs >>> f(-10) 10 然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数 def add(x, y, f): return f(x) + f(y) x ==> -5 y ==> 6 f ==> abs f(x) + f(y) ==> abs(-5) + abs(6) ==> 11 把函数作为参数传入,这样的函数称为高阶函数,函数式编程就…
1. Stream Java8引入全新的Stream API 位于java.util.stream包 1.1 Stream API不同于java.io的InputStream/OutputStream java.io java.util.stream 存储 顺序读写的byte/char 顺序输出的任一Java对象 用途 序列化数据至文件/网络 内存计算/业务逻辑 1.2 Stream和List也是不同的 List元素已经分配并存储在内存中的,而Stream输出的元素并没有预先存储在内存中,它通常…
1. 函数式编程 Java有2类方法: 实例方法:通过实例调用 静态方法:通过类名调用 Java的方法相当于过程式语言的函数 函数式编程(Functional Programing): 把函数作为基本运算单元 函数可以作为变量,传递给另一个函数 函数可以接收函数 函数可以返回函数 历史研究函数式编程的理论是Lambda演算,所以把支持函数式编程的风格成为Lambda表达式 2. Java的单方法接口 在Java中,有许多接口只定义了1个方法: Comparator Runnable Callab…
1.HTTP协议: Hyper Text Transfer Protocol:超文本传输协议 基于TCP协议之上的请求/响应协议 目前使用最广泛的高级协议 * 使用浏览器浏览网页和服务器交互使用的就是HTTP协议 * 手机应用上绝大多数程序与服务器之间交互数据使用的也是HTTP协议. HTTP协议是一个纯文本协议 HTTP是一个请求/响应协议.浏览器发送一个请求,服务器收到以后,然后发送响应. HTTP 1.0: 每次请求都会创建一个新的HTTP连接,浏览器在请求一个网页之后,往往还是多次请求图…
1接收Email协议类型 接收Email:收件人通过MUA软件把邮件从MDA抓取到本地计算机的过程. 1.1 POP3 从MUA到MDA使用最广泛的是协议是POP3 Post Office Protocol version 3,建立在tcp之上的协议 标准端口110 整个会话加密,加密端口995 1.2 IMAP 与POP3的区别:IMAP在本地的所有操作都会自动同步到服务器上,允许用户自己创建文件夹 Internet Mail Access Protocol 标准端口143 加密端口993 2…
1.邮件发送 1.1传统邮件发送: 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱. 1.2电子邮件发送: 与传统邮件类似,它是从用户电脑的邮件软件(如outlook)发送到邮件服务器上,然后经过若干个邮件服务器的中转,到达对方邮件服务器上,收件方就可以用软件或浏览器来接收邮件. MUA(邮件软件,Mail User Agent)-->MTA(邮件服务器,Mail Transfer Agent)-->MTA-->MDA(邮件投递代理,Mail Delivery Ag…
使用Future可以获得异步执行结果 Future<String> future = executor.submit(task); String result = future.get(); 但是当我们使用get()获得异步执行结果的时候,这个方法可能会阻塞.我们通过while循环反复调用isDone()来判断异步结果是否已经完成. while(!future.isDone()){ Thread.sleep(1); } String result = future.get() 所以使用Futu…
JDK提供了ExecutorService接口表示线程池,可以通过submit提交一个任务. ExecutorService executor = Executors.newFixedThreadPool(4); executor.submit(task); 但这里的task有个问题,因为继承制Runnable,如果希望返回一个结果,只能用Result来表示,这样主线程获取结果,就很不方便. class Task implements Runnable{ public String result…
Atomic java.util.concurrent.atomic提供了一组原子类型操作: 如AtomicInteger提供了 int addAndGet(int delta) int incrementAndGet() int get() int compareAndGet() Atomic类可以实现: 无锁(lock-free)实现的线程安全(thread-safe)访问 原理:CAS(Compare and Set)如果AtomicInteger实例的值是prev,就替换为next,返回…
Concurrent 用ReentrantLock+Condition实现Blocking Queue. Blocking Queue:当一个线程调用getTask()时,该方法内部可能让给线程进入等待状态,直到条件满足.线程唤醒以后,getTask()才会返回,而java.util.concurrent提供了线程安全的Blocking集合,如ArrayBlockingQueue. class TaskQueue{ final Queue<String> queue = new LinkedL…
1.线程锁可以嵌套 在多线程编程中,要执行synchronized块: 必须首先获得指定对象的锁 Java的线程锁是可重入的锁.对同一个对象,同一个线程,可以多次获取他的锁,即同一把锁可以嵌套.如以下代码 public void add(int m){ synchronized (lock){ this.value += m; another(m); } } public void addAnother(int m){ synchronized (lock){ this.another += m…
多任务 现代操作系统(windows,MacOS,Linux)都可以执行多任务: 多任务就是同时运行多个任务,例如同时开启钉钉.百度网盘.火狐.谷歌.ps等 操作系统执行多任务就是让多个任务交替执行,例如浏览器执行0.001秒,网盘执行0.001秒,钉钉执行0.001秒.因为任务的数量远远多余CPU的数量,因此任务也是交替执行的 进程.线程 进程(Process):一个任务就是一个进程. 线程(Thread):某些进程内部还需要同时执行多个子任务.例如word打字.拼写检查.打印等 进程和线程的…
1.Math Math提供了数学计算的静态方法 序号 方法 描述 1 abs() 返回参数的绝对值.Math.abs(-9)//9 2 ceil() 返回大于等于( >= )给定参数的的最小整数.Math.ceil(4.5)//5.0 3 floor() 返回小于等于(<=)给定参数的最大整数 .ath.floor(4.5)//4.0 4 rint() 以0.5为界返回与参数最接近的整数.返回类型为double.Math.rint(4.5)//4.0 Math.rint(4.51)//5.0…
直接定义常量 public class Weekday { //定义int常量 public static final int SUN = 0; public static final int MON = 1; public static final int TUE = 2; public static final int WED = 3; public static final int THU = 4; public static final int FRI = 5; public stati…
1.JavaBean定义 符合以下命名规范的class被成为JavaBean private 类型的field 针对这个field的get和set方法 public class Person { private String name; private int age; private boolean child; public String getName() { return name; } public void setName(String name) { this.name = nam…
Java的数据类型: 基本类型:int boolean float 引用类型:所有class类型 为一个基本类型int赋值为null,会提示"incompatible types"错误. 错误原始:基本类型是不能视为对象(引用类型)的.. 可以定义一个Integer类,包含一个实例字段int.这样可以把Integer视为int的包装类型wrapper. 包装类型本身是引用类型,只是其内部持有一个基本类型的变量. JDK为每种基本类型都创建了对应的包装类型: 基本类型 对应的引用类型 b…
字符串操作过程中,每次用 + 拼接字符串,有以下问题: 每次循环都会创建新的对象 绝大部分都是临时对象.浪费内存 影响GC效率 String s = ""; for(int i=0;i<1000;i++){ s = s +String.valueOf(i); } System.out.println(s); 为了解决这个问题,Java提供了StringBuilder类,可以高效的拼接字符串 1.StringBuffer类 StringBuilder是可变对象 StringBuil…