Java语法
2020-07-31 14:28:29 3 举报
AI智能生成
Java语法
作者其他创作
大纲/内容
Java语法
进阶语法
常用API
Object
toString
不覆写,返回地址
System
static long currentTimeMillis()`:返回以毫秒为单位的当前时间。
equals
与等号的差别
ide有覆写好的equals方法,可以判断类和其内容是否相同
Objects
7出来的工具类
null-save(空指针安全的)或null-tolerant(容忍空指针的)
DateFormat和simpleDateFormat
1.String format(Date date)将Date对象格式化为字符串。2.Date parse(String source)将字符串解析为Date对象。
Date
long getTime( )把日期对象转换成对应的时间毫秒值。
Calender
static Calendar getInstance()返回日历类的实例
int get(int field): int year = cal.get(Calendar.YEAR);
Date getTime()
StringBuilder
StringBuilder append(...)
String toString()
包装类
自动装箱
Integer i = 1
自动拆箱
int i = new Integer(10)
Collection集合
特点
数组的长度是固定的。集合的长度是可变的。
常用方法
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的子接口
①有索引、②可以保证存取顺序、③可以存储重复元素
特有方法
E get(int index) :返回集合中指定位置的元素。
ArrayList
元素增删慢,查找快
数组结构
使用
使用最多的功能为查询数据、遍历数据
LinkedList
链表结构。
方便元素添加、删除的集合。
Set
①不允许存储重复的元素。
因为add()方法调用了hashCode()和equals()方法
②没有索引,没有带索引的方法,也不能使用普通的for循环遍历。
HashSet
③是一个无序的集合,存储元素和取出元素的顺序有可能不一致。
④(查询的速度非常的快)底层是一个哈希表的结构
原理
1.8之前:哈希表 = 数组 + 链表;1.8之后:哈希表 = 数组 + 链表/红黑树;
把元素按哈希值分组,储存到数组中,再把哈希值相同的用链表链接,如果超过8个,转换为红黑树
哈希值:
是一个十进制的整数,由系统随机给出(就是对象的一个逻辑地址,不是数据实际存储的物理地址)
Object类的:public native int hashCode()返回对象的哈希值。native:代表该方法调用的是本地操作系统的方法。
LinkedHashSet
哈希表(数组+链表/红黑树)+链表
多了一条(记录元素的存储顺序),保证元素有序。
jdk9的一个新特性
static <E> List<E> of (E...elements)
注意
集合中存储的元素的个数已经确定了,不在改变时使用。
of方法只能List,Set,Map用,实现类不能使用
Set和Map在调用of方法时,不能有重复的元素,否则会抛出异常
可变参数
可变参数底层是一个数组。
一个方法的参数列表,只能有一个可变参数
如果方法的参数有几个,那么可变参数必须写在参数列表的末尾。
Collections
java.utils.Collections 是集合工具类,用来对集合进行操作。
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是一 一 对应的。
V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
V get(Object key) 根据指定的键,在Map集合中获取对应的值。
Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
利用Set<K> keySet(),获取Set集合,遍历Set,在get(key)获得Value
HashMap
是一个线程不安全的集合,是多线程集合,速度快,可以存<null,null>
底层是一个哈希表,查询速度特别快。
hashMap是一个无序集合,存储元素和取出元素的顺序可能不一致
自定义类作为key时,需要覆写equals()和hashCode(),保证key不重复
LinkedHashMap
LinkedHashMap集合底层是一个哈希表+链表(保证迭代顺序)
这个集合是一个有序集合,存储元素和取出元素的顺序都是一致的。
HashTable
底层也是一个哈希表,是一个线程安全的结合,是单线程,速度慢不能存null
泛型
好处
避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型。
把运行器异常(代码运行之后会抛出的异常),提升到了编译器(写代码的时候会报错)
定义、使用含有泛型的类
class Person<T>Person<String> per = new Person<>();
定义、使用含有泛型的接口,抽象方法用法一样
interface Person<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 代码块,处理异常部分
JDK7的处理还可以使用JDK7优化后的 try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。
JDK9的改进JDK9中 try-with-resource 的改进,对于引入对象的方式,支持的更加简洁。被引入的对象,同样可以自动关闭,无需手动close
Throw
自定义异常类
父类方法的抛出异常是什么,子类就抛出什么异常,或者不抛出异常。父类没有异常,子就不能写throws
多线程
Thread
构造方法
String getName() :获取当前线程名称。
static void sleep(long millis) :使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
static Thread currentThread() :返回对当前正在执行的线程对象的引用。
Runnable
public Thread(Runnable target)
Thread和Runnable区别
Runable接口的话,可以实现资源共享。多个Thread线程不能。
可以避免java中的单继承的局限性。
增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立。创建线程任务和启动线程独立。
线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类。
同步
同步代码块
synchronized(同步锁){ 需要同步操作的代码}
同步方法
public synchronized void method(){ 可能会产生线程安全问题的代码}
锁机制
public void lock() :加同步锁。public void unlock() :释放同步锁。
同步锁
线程间的通信
wait和notify
线程池
Executors类
public Future<?> submit(Runnable task) :获取线程池中的某一个线程对象,就直接run了,并执行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字节从指定的字节数组写入此输出流。
子类
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
注意事项
close( )释放资源(会先把内存缓冲区中的数据刷新到文件中),关闭输出流。
close&&flush
flush:刷新缓冲区,流对象可以继续使用。
close :先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
Properties类
继承于 Hashtable ,它使用键值结构存储数据,每个键及其对应值都是一个字符串。他是唯一 一个和IO流结合的集合。利用Properties可以向文件输出键值对,从文件输入键值对
String getProperty(String key) :使用此属性列表中指定的键搜索属性值。
Set<String> stringPropertyNames() :所有键的名称的集合。
void load(InputStream inStream) : 从字节输入流中读取键值对
缓冲流
字节缓冲流
BufferedInputStream(InputStream in) :创建一个 新的缓冲输入流。
BufferedOutputStream(OutputStream out) : 创建一个新的缓冲输出流。
字符缓冲流
BufferedReader(Reader in) :创建一个 新的缓冲输入流。
BufferedWriter(Writer out) : 创建一个新的缓冲输出流。
BufferedReader: public String readLine() : 读一行文字。
转换流
字符编码
编码:自然语言的字符->二进制:根据字符集,知道对应的数字,在把数字化成二进制
解码:二进制->自然语言的字符
字符集
ASCII字符集
ISO-8859-1字符集
GBxxx字符集
GB2312
GBK
双字节编码方案
GB18030
Unicode字符集
UTF-8
一至四个字节为每个字符编码
常用字(含中文),使用三个字节编码
UTF-16
UTF-32
InputStreamReader类
是Reader的子接口
OutputStreamReader类
打印流
可以改变输出目的地,例如文件,而不是像Console中输入,System.setOut(ps)
System有三个字段:out,in,
static PrintStream out “标准”输出流。
static InputStream in “标准”输入流。
static PrintStream err “标准”错误输出流。
对象的序列化和反序列化
ObjectOutputStream类
使用集合,可以向文件序列化对象集合
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对象
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接口
fun1.andThen(fun2).apply(age)
可以做参数,返回值
可简化至:str-> str.contains(\"H\")
Stream流
8新加入的最常用的流接口。(这并不是一个函数式接口。)
静态方法Stream.of(T...)
延迟方法
返回值类型仍然是 Stream 接口自身
Stream<T> filter(Predicate<? super T> predicate);用来过滤流,形成一个新的流
Stream<T> limit(long maxSize);只要前几个
Stream<T> skip(long n);不要前几个
终结方法,不返回Stream
Foreach
void forEach(Consumer<? super T> action)
count
long count();
Stream流属于管道流,只能被使用一次,流只要被使用了,就会关闭,否则会抛出异常
方法引用
使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
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:2i结果为1
比较运算符
03_数据类型
基本数据类型
byte
int
整数默认int
long
short
float
double
小数默认double
char
引用数据类型
类
接口
数组
数据类型之间的转换
自动转换
1.需要转换后的类型范围要大,小->大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
String
Math
Random
Scanner
继承
单继承,多级继承,多个子类
子类可以覆写,可以新增方法
覆写&重载
覆写不能改形参,方法名,返回值
覆写权限必须比原来大或等
super
调用父类的成员
成员变量,方法,构造方法
抽象方法
有抽象方法必是抽象类
抽象类可以有构造方法
抽象类可以没抽象方法
子类必须全部覆写抽象方法,除非子类是抽象类
所有方法都是抽象方法
所有变量为final static,全局常量
接口能够继承多个接口
类能多实现,单继承
jdk8出来了静态方法,默认方法,jdk9出来了私有方法
静态方法
默认方法
用于接口升级
私有方法
解决多个默认方法之间重复代码
没有构造方法,静态代码块
只能有一个父类,但是允许继承多个接口
抽象类可以不覆写完接口所有的抽象方法
父类和接口当中的默认方法同名,优先调用父类的
实现了多个接口,重名了,只用覆写一个
默认方法可以不被覆写,但是实现多个接口时,遇到重复的,需要覆写
多态
类型
向下转型
父 -> 子
1.先要向上转型(有父才有子):Fu f = new Zi( );2.在向下转型: Zi z = (Zi)f;
向上转型
子 -> 父
Fu f = new Zi( )
访问成员变量
编译看左,运行还是看左
成员
编译看左,运行看右
final关键字
修饰类,那该类不能被继承,方法不能被覆写
修饰方法,不能被覆写
修饰变量,为常量
修饰基本数据类型,其内容不能被修改修饰引用数据类型,其地址不能被修改
必须要被手动赋值,因为不手动,就被赋值为初始值0等
权限修饰符
权限从上到下
public
protected
default
private
内部类
成员内部类
1.内用外,随意访问:
2.外用内,露要内部类对象。
外部类名称.内部类名称 对象名= new 外部类名称().new内部类名称();
如果要成员内部类要访问,所在方法的局部变量,那么需要用【final】修饰局部变量
因为方法调用完,局部变量,没了,但是变为常量,在常量池中
匿名内部类
0 条评论
回复 删除
下一页