Java语法
2020-07-31 14:28:29 3 举报
AI智能生成
Java语法
作者其他创作
大纲/内容
进阶语法
常用API
Object
toString
不覆写,返回地址
System
static long currentTimeMillis()`:返回以毫秒为单位的当前时间。
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):将数组中指定的数据拷贝到另一个数组中。
equals
与等号的差别
ide有覆写好的equals方法,可以判断类和其内容是否相同
Objects
7出来的工具类
null-save(空指针安全的)或null-tolerant(容忍空指针的)
equals
DateFormat和simpleDateFormat
1.String format(Date date)将Date对象格式化为字符串。
2.Date parse(String source)将字符串解析为Date对象。
2.Date parse(String source)将字符串解析为Date对象。
Date
long getTime( )把日期对象转换成对应的时间毫秒值。
Calender
static Calendar getInstance()返回日历类的实例
int get(int field): int year = cal.get(Calendar.YEAR);
void set(int field, int value)
abstract void add(int field, int amount)
Date getTime()
StringBuilder
StringBuilder append(...)
String toString()
包装类
自动装箱
Integer i = 1
自动拆箱
int i = new Integer(10)
Collection集合
特点
数组的长度是固定的。集合的长度是可变的。
遍历
Itrator 迭代器
迭代取出所有元素
特点
数组的长度是固定的。集合的长度是可变的。
常用方法
boolean add(E e)
void clear()
boolean remove(E e)
boolean contains(E e)
boolean isEmpty()
int size()
Object[] toArray()把集合中的元素,存储到数组中。
遍历
Itrator 迭代器
迭代取出所有元素
hasNext( )&&next( )
增强for
不要在遍历的过程中对集合元素进行增删操作,否则用for循环
List
Collection的子接口
Collection的子接口
特点
①有索引、②可以保证存取顺序、③可以存储重复元素
特有方法
void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
E get(int index) :返回集合中指定位置的元素。
E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
ArrayList
特点
元素增删慢,查找快
数组结构
使用
使用最多的功能为查询数据、遍历数据
LinkedList
特点
链表结构。
方便元素添加、删除的集合。
Set
Collection的子接口
Collection的子接口
特点
①不允许存储重复的元素。
因为add()方法调用了hashCode()和equals()方法
②没有索引,没有带索引的方法,也不能使用普通的for循环遍历。
HashSet
原理
1.8之前:
哈希表 = 数组 + 链表;
1.8之后:
哈希表 = 数组 + 链表/红黑树;
把元素按哈希值分组,储存到数组中,再把哈希值相同的用链表链接,如果超过8个,转换为红黑树
特点
③是一个无序的集合,存储元素和取出元素的顺序有可能不一致。
④(查询的速度非常的快)底层是一个哈希表的结构
原理
1.8之前:
哈希表 = 数组 + 链表;
1.8之后:
哈希表 = 数组 + 链表/红黑树;
把元素按哈希值分组,储存到数组中,再把哈希值相同的用链表链接,如果超过8个,转换为红黑树
哈希值:
是一个十进制的整数,由系统随机给出(就是对象的一个逻辑地址,不是数据实际存储的物理地址)
Object类的:
public native int hashCode()返回对象的哈希值。
native:代表该方法调用的是本地操作系统的方法。
public native int hashCode()返回对象的哈希值。
native:代表该方法调用的是本地操作系统的方法。
LinkedHashSet
哈希表(数组+链表/红黑树)+链表
多了一条(记录元素的存储顺序),保证元素有序。
jdk9的一个新特性
List,Set,Map三个接口中添加了,静态的方法of,可以给集合中一次性添加多个元素
static <E> List<E> of (E...elements)
注意
集合中存储的元素的个数已经确定了,不在改变时使用。
of方法只能List,Set,Map用,实现类不能使用
Set和Map在调用of方法时,不能有重复的元素,否则会抛出异常
可变参数
可变参数底层是一个数组。
注意
一个方法的参数列表,只能有一个可变参数
如果方法的参数有几个,那么可变参数必须写在参数列表的末尾。
Collections
java.utils.Collections 是集合工具类,用来对集合进行操作。
java.utils.Collections 是集合工具类,用来对集合进行操作。
常用方法
static <T> boolean addAll(Collection<T> c, T... elements) :往集合中添加一些元素。
static void shuffle(List<?> list) 打乱顺序 :打乱集合顺序。
排序
排序自定义类时,需要实现Comparable<T>接口
static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。简单些,推荐
static <T> void sort(List<T> list,Comparator<? super T> ) :将集合中元素按照指定规则排序,Comparator是一个函数式接口
Map
特点
Map集合中的元素,key和value的类型可以相同,也可不同
特点
Map集合中的元素,key和value的类型可以相同,也可不同
Map集合中的元素,key是不予许重复的,value是可以重复的
Map集合中的元素,key和value是一 一 对应的。
常用方法
V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
V get(Object key) 根据指定的键,在Map集合中获取对应的值。
Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
遍历
利用Set<K> keySet(),获取Set集合,遍历Set,在get(key)获得Value
通过Set<Map.Entry<K,V>> entrySet()来遍历
用接口Map.Entry<K,V>里的方法getKey(),getValue()
HashMap
特点
是一个线程不安全的集合,是多线程集合,速度快,可以存<null,null>
底层是一个哈希表,查询速度特别快。
hashMap是一个无序集合,存储元素和取出元素的顺序可能不一致
自定义类作为key时,需要覆写equals()和hashCode(),保证key不重复
LinkedHashMap
LinkedHashMap集合底层是一个哈希表+链表(保证迭代顺序)
这个集合是一个有序集合,存储元素和取出元素的顺序都是一致的。
HashTable
底层也是一个哈希表,是一个线程安全的结合,是单线程,速度慢
不能存null
不能存null
泛型
好处
避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型。
好处
避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型。
把运行器异常(代码运行之后会抛出的异常),提升到了编译器(写代码的时候会报错)
使用
定义、使用含有泛型的类
class Person<T>
Person<String> per = new Person<>();
Person<String> per = new Person<>();
定义、使用含有泛型的接口,抽象方法用法一样
interface Person<E> {
void doing(E e);}
void doing(E e);}
第一种:在实现接口时,就将泛型指定了
第二种:在创建对象时,才将泛型指定
class StudentImpl<E> implements Person<E>
定义、使用含有泛型的方法
异常
Throwable
Error
必须修改源代码
Exception
Checked异常
可以被处理的异常,所以Java程序必须显示处理Checked异常(就是ide中常见的红线)。如果没有处理,进行编译java文件会出现编译出错。无法编译,没有.class文件。
runtimeException
运行期间异常,java程序运行过程中出现的问题
异常处理的处理方式
Throws
try...catch..finally...
finally可以写return
版本更新
JDK7前处理
try...catch...finally 代码块,处理异常部分
try...catch...finally 代码块,处理异常部分
JDK7的处理
还可以使用JDK7优化后的 try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。
还可以使用JDK7优化后的 try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。
JDK9的改进
JDK9中 try-with-resource 的改进,对于引入对象的方式,支持的更加简洁。被引入的对象,同样可以自动关闭,
无需手动close
JDK9中 try-with-resource 的改进,对于引入对象的方式,支持的更加简洁。被引入的对象,同样可以自动关闭,
无需手动close
Throw
自定义异常类
父类方法的抛出异常是什么,子类就抛出什么异常,或者不抛出异常。父类没有异常,子就不能写throws
多线程
Thread
构造方法
public Thread(Runnable target,String name) :等,以这个参数列表做无序排列
常用方法
String getName() :获取当前线程名称。
static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
static Thread currentThread() :返回对当前正在执行的线程对象的引用。
Runnable
构造方法
public Thread(Runnable target)
public Thread(Runnable target,String name)
Thread和Runnable区别
Runable接口的话,可以实现资源共享。多个Thread线程不能。
可以避免java中的单继承的局限性。
增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。创建线程任务和启动线程独立。
线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。
同步
同步代码块
synchronized(同步锁){
需要同步操作的代码
}
需要同步操作的代码
}
同步方法
public synchronized void method(){
可能会产生线程安全问题的代码
}
可能会产生线程安全问题的代码
}
锁机制
public void lock() :加同步锁。
public void unlock() :释放同步锁。
public void unlock() :释放同步锁。
同步锁
对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁.
1. 锁对象 可以是任意类型。
2. 多个线程对象 要使用同一把锁。
在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他的线程只能在外等着
1. 锁对象 可以是任意类型。
2. 多个线程对象 要使用同一把锁。
在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他的线程只能在外等着
线程间的通信
wait和notify
线程池
Executors类
常用方法
static ExecutorService newFixedThreadPool(int nThreads):返回线程池对象。(创建的是有界线程池,也就是池中的线程个数可以指定最大数量)获取到了一个线程池ExecutorService 对象
public Future<?> submit(Runnable task) :获取线程池中的某一个线程对象,就直接run了,并执行
Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用。
Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用。
File类
相对路径&&绝对路径
Idea:相对路径是相对于当前项目
构造方法
有三种
常用方法
获取
String getAbsolutePath() :返回此File的绝对路径名字符串。
String getPath() :将此File转换为路径名字符串。构造方法写的啥,就是啥。
String getName() :返回由此File表示的文件或目录的名称。
long length() :返回由此File表示的文件的长度。文件夹没有大小,文件才有。
判断
boolean exists() :此File表示的文件或目录是否实际存在。
boolean isDirectory() :此File表示的是否为目录。
boolean isFile() :此File表示的是否为文件。
删除
boolean delete() :删除由此File表示的文件或目录。
创建
boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
遍历
String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录
过滤器FileFilter
函数式接口
boolean accept(File pathname) :测试pathname(file对象)是否应该包含在当前File目录中,符合则返回true。并且把该pathname保存到file数组中去
IO流
字节流
输入:从硬盘读取数据,向内存中输入数据读取
输出:从内存中输出数据,写入数据进硬盘中保存
输入:从硬盘读取数据,向内存中输入数据读取
输出:从内存中输出数据,写入数据进硬盘中保存
OutputStream
常用方法
void close() :关闭此输出流并释放与此流相关联的任何系统资源。
void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
abstract void write(int b) :将指定的字节输出流。每次可以写出一个字节数据
void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 offff开始输出到此输出流。
子类
FileOutputStream
public FileOutputStream(File file),可以加参数boolean,代表是否追加写
等
InputStream
常用方法
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
abstract int read() : 从输入流读取数据的下一个字节。读一个,指针向后移一位,直到末尾,返回-1,返回读取字节的值
int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。每次都读b那么长的字节,并存入b中,直到读完。b作缓冲作用,存储得到的字节,int放回每次读到字节的个数
子类
FileInputStream
等
字符流
Reader
子类
Writer
注意事项
使用Filewriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中,不关闭输出流。
close( )释放资源(会先把内存缓冲区中的数据刷新到文件中),关闭输出流。
close&&flush
flush:刷新缓冲区,流对象可以继续使用。
close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
Properties类
继承于 Hashtable ,它使用键值结构存储数据,每个键及其对应值都是一个字符串。他是唯一 一个和IO流结合的集合。利用Properties可以向文件输出键值对,从文件输入键值对
继承于 Hashtable ,它使用键值结构存储数据,每个键及其对应值都是一个字符串。他是唯一 一个和IO流结合的集合。利用Properties可以向文件输出键值对,从文件输入键值对
常用方法
Object setProperty(String key, String value) : 保存一对属性。
String getProperty(String key) :使用此属性列表中指定的键搜索属性值。
Set<String> stringPropertyNames() :所有键的名称的集合。
void load(InputStream inStream) : 从字节输入流中读取键值对
void store(Write write , String comments): 从字符输出流中,写入键值对
缓冲流
字节缓冲流
BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。
字符缓冲流
BufferedReader(Reader in) :创建一个 新的缓冲输入流。
BufferedWriter(Writer out) : 创建一个新的缓冲输出流。
特有方法
BufferedReader: public String readLine() : 读一行文字。
BufferedWriter: public void newLine() : 写一行行分隔符,由系统属性定义符号。
转换流
字符编码
编码:自然语言的字符->二进制:根据字符集,知道对应的数字,在把数字化成二进制
解码:二进制->自然语言的字符
字符集
ASCII字符集
ISO-8859-1字符集
GBxxx字符集
GB2312
GBK
双字节编码方案
GB18030
Unicode字符集
UTF-8
一至四个字节为每个字符编码
常用字(含中文),使用三个字节编码
UTF-16
UTF-32
InputStreamReader类
InputStreamReader(InputStream in, String charsetName) : 创建一个指定字符集的字符流。
是Reader的子接口
OutputStreamReader类
OutputStreamReader(OutputStream out, String charsetName) : 创建一个指定字符集的字符流。
打印流
可以改变输出目的地,例如文件,而不是像Console中输入,System.setOut(ps)
System有三个字段:out,in,
static PrintStream out “标准”输出流。
static InputStream in “标准”输入流。
static PrintStream err “标准”错误输出流。
对象的序列化和反序列化
ObjectOutputStream类
序列化流:将Java对象的原始数据类型写出到文件,实现对象的持久存储。
使用集合,可以向文件序列化对象集合
final void writeObject(Object obj)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("Advanced\\src\\对象的序列化流\\2.txt"));
ObjectInputStream类
反序列化流,将之前使用ObjectOutputStream序列化的原始数据恢复为对象
final Object readObject()
网络编程
应用层
Https,DNS等
传输层
TCP
直译是一种传输控制协议,是面向连接的通信协议,三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。
使用步骤
1.创建一个客户端对象Socket,构造方法绑定服务器的IP地址和端口号
2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
3.使用网络字节输出流OutputStream对象中的方法write(),给服务端发送数据
4,使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
5.使用网络字节输入流InputStream对象中的read(),读取服务器回写的数据
6.释放资源
模拟B/S,访问本地网页
UDP
容易丢失数据,但是传输快,例如视频电话就是UDP
函数式接口
Lambda表达式
简化代码,其实就是匿名内部类的另一种形式,不过很简洁,
使用Lambda的延迟执行:来解决性能浪费,例如:日志案例
自定义时用@FunctionalInterface声明,只能有一个抽象方法
常用的函数接口
Supplier<T>
T get() 用来获取一个泛型参数指定类型的对象数据。
Consumer<T>
使用accept来消费,或者通过andThen组合消费,即一次消费多个
con1.andThen(con2).accept(str)
Predicate<T>接口
对某种类型的数据进行判断,从而得到一个boolean值结果,可以判断与,或,非
pre1.or(pre2).test("Hello")
pre1.and(pre2).test("HelloWorld")
pre.negate().test("hello")
Function接口
R apply(T t) ,根据类型T的参数获取类型R的结果。也就是根据前面那个T,得到后面那个R
fun1.andThen(fun2).apply(age)
可以做参数,返回值
可简化至:str-> str.contains("H")
Stream流
8新加入的最常用的流接口。(这并不是一个函数式接口。)
8新加入的最常用的流接口。(这并不是一个函数式接口。)
获取
Collection集合所有子类都可通过stream(),转化为Stream流,Map通过keySet(),entrySet()
静态方法Stream.of(T...)
常用方法
延迟方法
返回值类型仍然是 Stream 接口自身
Stream<T> filter(Predicate<? super T> predicate);用来过滤流,形成一个新的流
<R> Stream<R> map(Function<? super T, ? extends R> mapper);//使用map将流中的元素映射到另一个流中,下面是将String转换为Integer类型
Stream<T> limit(long maxSize);只要前几个
Stream<T> skip(long n);不要前几个
<T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b):concat方法把两个流连接起来
终结方法,不返回Stream
Foreach
void forEach(Consumer<? super T> action)
count
long count();
注意事项
Stream流属于管道流,只能被使用一次,流只要被使用了,就会关闭,否则会抛出异常
方法引用
使Lambda内的覆写部分更加简化,我愿称之为减霸JB,但其实看代码不容易看,还不如不简写
使Lambda内的覆写部分更加简化,我愿称之为减霸JB,但其实看代码不容易看,还不如不简写
双冒号 :: 为引用运算符,而它所在的表达式被称为方法引用
通过类名引用静态成员方法类已经存在,静态成员方法也已经存在,就可以通过类名直接引用静态成员方法
使用super引用类的成员方法,super是已经存在的父类的成员方法,所以可以直接使用super引用父类的成员方法
通过this来调用本类方法
构造方法new Person(String name)已知,创建对象已知 new,就可以使用Person引用new创建对象
通过对象名引用成员方法使用前提是对象名是已经存在的,成员方法也是已经存在的,就可以使用对象名来引用成员方法
计算机基础知识
计算及储存单元
位(bit):代表二进制数0&1
字节(byte):1byte = 8bit
KB:1KB = 1024byte
MB: 1MB = 1024KB
生活中常见的网速:1M即1Mb/s(1Mbps)等于125KB/S,
运行商说的100M,其实速度只有12.5MB/S
运行商说的100M,其实速度只有12.5MB/S
1GB : 1GB =1024MB
TB : 1TB = 1024GB
PB: 1PB =1024TB
EB: 1EB =1024PB
ZB: 1ZB=1024EB
命令行cmd
启动
切换盘符:盘符名称:F
进入文件夹:cd 文件夹
进入多级:cd 文件夹\文件夹
返回上一级:cd..
根路径:cd\
当前文件目录:dir
清屏:cls
退出:exit
idea
快捷键
基础语法
入门知识
01_JVM,JRE,JDK三者关系
02_运算符
算术运算符
+, -, *, /, %, ++, --
赋值运算符
=, +=, -=, *=, /=, %=
逻辑运算符
& , &&, |, ||,
一元运算符
正+,负-,否!
三元运算符
int i=true? 1:2
i结果为1
i结果为1
比较运算符
==, <, >, <=, >= , !=
03_数据类型
基本数据类型
byte
int
整数默认int
long
short
float
double
小数默认double
char
引用数据类型
类
接口
数组
数据类型之间的转换
自动转换
1.需要转换后的类型范围要大,小->大
2.需要转换的类型兼容
eg:short i =100;int j =0; j=i
2.需要转换的类型兼容
eg:short i =100;int j =0; j=i
byte/short/char 在运算时,首先被提升成为int类型,然后在计算。
强制转换
大->小
boolean不能转换
有时会造成数据溢出,精度缺失
04_程序结构
顺序,循环,选择
05_java中的内存有哪些
- 栈:方法的运行一定在这里
- 堆,new出来的
- 方法区:储存.class文件,和方法的信息
- 本地方法栈
- 寄存器
06_数组
定义方式
数组长度不可变
数组是被new出来的
07_方法
定义
方法的重载
方法名一样参数个数,参数的数据类型不同,类型顺序不同
面向对象
封装
类
成员方法
成员变量
对象
类的具体
成员变量&局部变量
成员变量属于类,局部变量属于方法
构造方法
匿名对象
this
调用本类方法,变量
构造方法调用
需要有个出口,即不调用构造方法
代表调用当前方法的对象
作为返回值,返回本类的对象
做参数
Static关键字
被声明为Static的属于类,被对象所共享
静态方法不能调用非静态的,除非通过传参,可以调用非静态,这涉及到内存开辟的先后顺序
不能用this调用静态声明的成员
Static声明的成员,内存被先开辟,所以不能调用非静态
非静态需要使用对象调用
静态代码块
优先执行,只执行一次,用于给静态变量一次性赋值
常用类库
Arrays
ArrayList
String
Math
Random
Scanner
继承
特点
单继承,多级继承,多个子类
子类可以覆写,可以新增方法
覆写&重载
覆写不能改形参,方法名,返回值
覆写权限必须比原来大或等
super
调用父类的成员
成员变量,方法,构造方法
抽象方法
特点
有抽象方法必是抽象类
抽象类可以有构造方法
抽象类可以没抽象方法
子类必须全部覆写抽象方法,除非子类是抽象类
接口
特点
所有方法都是抽象方法
所有变量为final static,全局常量
接口能够继承多个接口
类能多实现,单继承
jdk8出来了静态方法,默认方法,jdk9出来了私有方法
静态方法
默认方法
用于接口升级
私有方法
解决多个默认方法之间重复代码
注意事项
没有构造方法,静态代码块
只能有一个父类,但是允许继承多个接口
抽象类可以不覆写完接口所有的抽象方法
父类和接口当中的默认方法同名,优先调用父类的
实现了多个接口,重名了,只用覆写一个
默认方法可以不被覆写,但是实现多个接口时,遇到重复的,需要覆写
多态
类型
向下转型
父 -> 子
1.先要向上转型(有父才有子):Fu f = new Zi( );
2.在向下转型: Zi z = (Zi)f;
2.在向下转型: Zi z = (Zi)f;
向上转型
子 -> 父
Fu f = new Zi( )
特点
访问成员变量
编译看左,运行还是看左
成员
编译看左,运行看右
final关键字
修饰类,那该类不能被继承,方法不能被覆写
修饰方法,不能被覆写
修饰变量,为常量
- 修饰基本数据类型,其内容不能被修改
- 修饰引用数据类型,其地址不能被修改
必须要被手动赋值,因为不手动,就被赋值为初始值0等
权限修饰符
权限从上到下
public
protected
default
private
内部类
成员内部类
1.内用外,随意访问:
2.外用内,露要内部类对象。
外部类名称.内部类名称 对象名= new 外部类名称().new内部类名称();
如果要成员内部类要访问,所在方法的局部变量,那么需要用【final】修饰局部变量
因为方法调用完,局部变量,没了,但是变为常量,在常量池中
匿名内部类
0 条评论
下一页