JavaSE知识点总结
2022-10-17 11:27:11 17 举报
AI智能生成
coco博
作者其他创作
大纲/内容
概述与环境搭建
概述:JavaSE,Java platform standard edtion(Java平台标准版)
JavaEE Java platform enterprise edtion(Java平台企业版)
JVM:Java虚拟机(内置垃圾回收机制,自动完成空间管理)
JRE:Java运行环境(包含JVM,和解释器)
JDK:Java开发环境(包含JRE,类库,编译器、调试工具)
语言基础
变量
计算机内存的一块存储空间
组成
数据类型
变量名
值
声明方式
先声名,后赋值
声明并赋值
多个同类型变量同时声明并赋值
数据类型
基本数据类型
整数
byte
1个字节
-2^7~2^7-1
short
2个字节
-2^15~2^15-1
int
4字节
long
8字节
小数
float
double
布尔
boolean
字符
char
引用 数据类型
字符串
String
数组
对象
类型转换
自动类型转换
两种类型兼容,目标类型大于原类型
两种类型兼容,目标类型小于原类型
强制类型转换
整数长度完整,数据完整
整数长度不够,数据截断
小数转换整数,数据截断
字符整数互转,数据完整
boolean不可与任何类型转换
类型提升
数字 间的常规类型提升
字符串发的特殊类型提升
运算符
算数运算符
+-*、++--
赋值运算符
= += -=*=、=
关系运算符
<><=>===!=
逻辑运算符
&&||!
三元运算符
布尔表达式 ?结果1:结果2
控制台录入
引入工具包:import java.util.Scanner;
声明Scanner input=new Scanner(System.in);
int a=input.nextInt();<font color="#388e3c" data-darkreader-inline-color="" style="--darkreader-inline-color:#3d8b41;">//控制台输入的值付给a</font>
String str =input.next();
char car=input.next().charAt(0);
选择结构与分支结构
选择结构
基本if选择结构
if else 选择结构
多重if选择结构
嵌套if选择结构
.equals()方法
比较引用类型值是否相等
“是”.equals("是");
.random(int值);
获取一个随机数
math.random();:获得一个小数随机数(乘10,强转int,达到获得一个随机数1~9)
3: 0,1,2
分支 结构
switch
byte short int char string(jdk7)
case 值不可相同
default: (最后)
追加break;
局部变量
函数内部的变量
从定义行到所在代码快结束
重合范围内不可重名
循环结构
while循环
while(boolean){}
特点:首次有入口条件,先判断后执行,适用于循环次数明确的的条件
do{}while(boolean)
先执行后判断,适用于循环次数不明确
for循环
for(;;){}
首次有入口条件,先判断,再执行
break
终止,跳出,switch分支语句,以及循环结构
扩展:outer:循环体 break outer; 跳出指定循环
contiune
结束本次进入下一次循环
嵌套循环结构
在一个循环中完整嵌套另一个循环
函数
概念:实现特定功能的一段代码,可以反复使用。
定义语法:public static void 函数名(形式参数){函数主体 }
函数调用:函数名称(实际参数);
自己调用自己(递归)
形参与实参:函数定义中是形参,函数调用中为形参赋值为实参。
返回值与返回值类型
返回值类型:基本数据类型,引用数据类型,void
return value;返回值类型应该与函数定义的返回值一致(兼容)
return;void 函数中,直接结束函数。
数组
概述:一组连续的存储空间,存储一组类型相同的数据
数组的创建
数据类型[] 数组名; 数组名=new 数据类型[长度];
数据类型[] 数组名=new 数据类型 [长度];
数组的赋值
数据类型[] 数组名=new 数据类型 []{value,value2,value3}
数据类型[] 数组名={value,value,value}不可换行
数组的遍历
普通for循环遍历
增强for循环遍历---for(数据类型 变量名:数组名){System.out.print(变量名)}
增强for循环,专为遍历而存在,解决了数组下标越界异常,//将数组的每个元素赋值给变量
数组的扩充
创建一个新数组,将原来数组上的值,用循环逐一复制过来
System.arraycopy(<font color="#ff0000">原数组,原数组起始下标,新数组,新数组的起始村存储下标,需要赋值的个数或长度</font>);
int[] newnum=java.util.Arrays.copyOf(原数组,新长度);
引入工具包 import java.util.Arrays;
copyOf(原数组,新长度);<font color="#388e3c">//同时完成对新数组的创建</font>
数组的增删改查
数组的参数,返回值
public static 数据类型[] 方法名(数据类型[] 形式参数);
可变长参数 <font color="#ff0000">数据类型...形式参数</font> 与<font color="#ff0000">数据类型[] 形式参数</font> 等同
可变长参数只能有一个,并且只能在形参列表的最后
数组的排序
冒泡排序(交换排序):相邻的两个元素比较大小互换位置。外层:length-1;内层:length-1-i;
选择排序: 固定值与其他值依次比较。外层:length-1;内层:length
jdk排序:Java.util.Array.sort(数组名);//升序
<font color="#ff0000">冒泡、选择</font>、插入、希尔、归并、快速、堆、计数、稳定、
二维数组
概念一维数组中的一维数组。数组中的元素还是数组。
语法: int[][] 数组名=new int[行数][列数];
不规则二维数组int[][] arr =new int[3][];
arr[0]= new int[3];
arr[1]=new int[5];
arr[2]=new int[4];
面向对象
类;
一组相同或者类似的对象中抽取出共性的行为和特征
类的定义 public class 类名{}
对象
具有一定的特征和行为
对象的定义 类名 对象名=new 类名();
实例变量、实例方法
实例变量定义在类的内部,方法的外部。<font color="#ff0000">可以不赋值</font>
实例方法的定义 <font color="#ff0000"> public void 方法名(参数){可以实现的行为}</font>
方法重载
方法名相同,参数列表不同---与访问修饰符和返回值类型无关
构造的方法
构造方法与类名完全相同,用来创建对象的方法。
public 类名(){} <font color="#ff0000">没有返回值</font>
可以进行<font color="#ff0000">重载</font>增加参数,<font color="#ff0000">为实例变量赋值,</font>重写后无参的构造方法将不在起作用
this关键字
<font color="#ff0000">this.属性名 调用实例属性 /this.方法名()调用实例方法 </font><font color="#000000">可以省略隐式存在</font>
<font color="#ff0000">this() </font>调用本类中的其他<font color="#ff0000">构造方法</font>
必须在构造方法中,并且只能在首行
三大特征
封装
<font color="#000000">概念</font><font color="#ff0000">:实例变量</font>和<font color="#ff0000">实例方法</font>的访问修饰符设置为<font color="#ff0000"> private</font>
仅本类可见,只能通过<font color="#ff0000">get\set </font>方法访问
public int getAge(){return this.age}
public void setAge(int age){this.age=age;}
外界不可以直接访问private修饰的属性,公开的set和get方法是唯一的途径
继承
概念:类与类之间行为和特征的一种赠与和获得
满足 <font color="#ff0000">is a</font> 的关系
<font color="#ff0000">class 子类 extend 父类{子类的内容}</font>
子类继承父类以后可以使用父类的方法和属性,也可以定义自己的
一个类只能继承<font color="#ff0000">一个父类</font>,但是可以<font color="#ff0000">多级继承</font>
不能继承父类的<font color="#ff0000">构造方法</font>和<font color="#ff0000">private</font>修饰的方法
当父类和子类不在一个包时, default修饰的属性
<font color="#ff0000">夸包继承只能继承protected,和public 修饰的属性和方法</font>
方法的重写
返回值类型、方法名、参数列表与父类方法相同
访问修饰符比父类方法更广泛
重写后优先执行重写后的方法
@override,重写关键字
super关键字
super关键字,当子类的实例成员与父类的实例成员重名时,super区分
super.属性名/super.方法名(); 调用<font color="#ff0000">父类的属性和方法</font>;
super();/super(参数); 调用<font color="#ff0000">父类的无参有参的构造方法</font>
<font color="#ff0000" style="">子类的构造方法中默认提供super()</font>;<font color="#ff0000">调用父类的无参构造方法</font>
多态
概念:父类引用指向子类对象,从而产生多种形态(二者具有直接或间接的继承关系)
父类名 对象名=new 子类名();
如果<font color="#ff0000">子类中重写的父类的方法</font>,则<font color="#ff0000">多态对象</font>调用方法时优先调用<font color="#ff0000">子类重写后的方法</font>
多态的应用
向上转型(装箱)
父类名 对象名=new 子类名();
向下转型(拆箱)
父类名 对象名=new 子类名();
子类名 对象名2=(子类名)对象名;
只有<font color="#ff0000">转换回子类</font>的对象类型才能访问<font color="#ff0000">子类特有的属性</font>
类型转换异常
类型向下转型时,转回类型与向上转型子类名不一致
instanceof关键字
判断一个向上转型的对象是否与一个子类对象相同
if(多态对象名 instanceof 子类)
根据是否相同返回一个<font color="#ff0000">布尔类型</font>的值
三个修饰符
abstract(抽象的)
<font color="#ff0000">定义方式</font> public abstract class 类名{实例属性 <font color="#ff0000">public abstract void 抽象方法名();</font>}
被abstract修饰的类称为抽象类,<font color="#ff0000">无法实例化</font>
作用,可以被子类继承,更自然的使用<font color="#ff0000">多态</font>
abstract 修饰的<font color="#ff0000">类</font>不能new对象,但是可以<font color="#ff0000">声明引用</font>
abstract 修饰的<font color="#ff0000">方法</font>,只有方法声明,<font color="#ff0000">没有方法实现</font>
子类继承抽象类后,必须重写父类中所有的抽象方法,否则子类还是抽象类
static(静态的)
static修饰的<font color="#ff0000">类属性</font>和<font color="#ff0000">类方法</font>,称为静态~
静态成员是本类所有对象共享的成员
只有一份,其他类不必创建对象,可以通过类名直接访问;本类直接通过方法名访问
特点:
静态方法允许直接访问静态成员
静态方法不允许直接访问非静态成员
静态方法中不允许使用this 和super 关键字
静态方法可以继承,<font color="#ff0000">不可以重写,没有多态</font>
静态代码块和动态代码块
动态代码块 class 类名 实例变量<font color="#ff0000">{ 动态代码 }</font>构造方法
创建对象时,触发,在实例属性之后,构造方法之前
动态代码块不存在,编译时将代码块重的内容合并到构造方法中
静态代码块 class 类名 静态属性 <font color="#ff0000">static{静态代码} </font> 静态方法
静态代码块加载类时执行,只触发一次
局部代码块(放在方法内,缩小变量的使用范围,基本不用)
final(最终的)
可修饰,类,属性,方法
final修饰的类不可以被继承
final修饰的方法不可以被覆盖
final修饰的变量只能被赋值一次
实例常量不提供默认值,只能手动赋值
注意:如果要在构造方法中为其赋值,必须要保证所有的构造方法都能正确赋值
局部常量:显示初始化
实例常量:显示初始化、动态代码块、构造方法
静态常量: 显示初始化、静态代码块
基本类型常量值不可比变、引用类型常量地址不可变
接口
概念:特殊的抽象类,类中只能定义<font color="#ff0000">公开静态常量属性,和公开抽象方法</font>
<font color="#ff0000">定义方式</font>:public<font color="#ff0000"> interface</font> <font color="#388e3c">MyInterface</font> {public static final value; public abstract void 方法名();}
实现类
“<font color="#ff0000">继承</font>”了某个<font color="#ff0000">接口</font>的类,称为<font color="#ff0000">实现类(重写接口中的抽象方法)</font>
创建实现类
class <font color="#388e3c">Impl</font> <font color="#ff0000">implement</font> <font color="#388e3c">MyInterface</font>{<font color="#ff0000">重写接口中的公开抽象</font>方法}
创建实现类对象
MyInterface <font color="#388e3c">myInterface=new 实现类名Impl();</font>
myInterface.方法名();
接口与抽象类的区别
相同点
可以编译成字节码文件
不可以创建对象
可以作为引用类型
具备object类中所定义的方法
不同点
所有属性为公开静态常量,隐式用public static final修饰
所有方法是公开抽象方法,隐式用 public abstract修饰
没有构造方法,没有静态代码块,动态代码块
微观接口(能力)
接口的定义:接口的定义代表类某种能力,方法的定义代表了能力的具体要求
一个实现类实现多个接口(不同于类的单继承)
class 实现类 implement 接口1,接口2,接口3,{重写1,2,3的抽象方法}
接口规范
接口声明引用,创建实现类对象,<font color="#ff0000">只能调用接口中所定义的方法,不能调用实现类独有的方法</font>
可强转回实现类自身类型,才可以调用实现类独有的方法
实现类在实现接口时,必须实现接口中所有的抽象方法,否则此类还是抽象类
接口实现多态
通过<font color="#ff0000">继承+实现的</font>方式创建是<font color="#ff0000">实现子类</font>
只能通过子类名 对象名=new 子类名();的方式使用接口方法和此类独有方法
接口的关系
类与类:单继承
类与接口:1 implements n
接口与接口:1 extends n
宏观接口(标准)
接口回调:先有接口的使用者,后有接口的实现者
常用类
内部类:类的内部再定义一个完整的类(<font color="#ff0000">为外部类提供功能组件)</font>
成员内部类
类的内部与实例变量和实例方法同级
外部类的一个实例部分, 创建内部类对象时依赖外部类对象
Outer outer =new Outer();
Outer.Inter=outer.new Inter();
内部类可以直接访问外部类的实例属性和方法,诶不破坏封装(类似get()方法)
成员内部类<font color="#ff0000">不能创建静态属性方法(成员内部类可以用任何访问修饰符修饰)</font>
静态内部类
类的内部与静态实例变量和静态实例方法同级
创建内部类对象不依赖外部类对象,可以直接创建
Outer.Inter inter=new Outer.Inter();
静态内部类可以创建,<font color="#ff0000">静态属性方法</font>
静态内部类不能直接访问外部类的实例属性和方法,可以直接访问静态属性和方法
局部内部类、
定义外部类的<font color="#ff0000">实例方法</font>和<font color="#ff0000">静态实例方法</font>中
类的适用范围也和局部变量一样,从定义行到所在代码块结束<font color="#ff0000">(当前方法)(不能使用任何访问修饰符)</font>
局部类访问外部类了当前方法中的局部变量,<font color="#ff0000">变量必须用final</font>修饰,因为不能保证变量的<font color="#ff0000">生命周期</font>与自身相同
匿名内部类
<font color="#ff0000">没有类名的局部内部类</font>,其他特性与局部类相同
继承式匿名内部类 方法{<font color="#ff0000">Animal a =new Animal(){实现类};加分号</font>}
接口式匿名内部类 方法{Interface<font color="#ff0000"> a =new interface(){实现类};加分号</font>}
扩展拉姆达表达式
接口中只有一个方法(条件)
接口名 对象名=()->{方法实现}
参数式匿名内部类 定义一个接口参数的方法,调用方法时方法{Interface<font color="#ff0000"> a =new interface(){实现类};加分号</font>}
匿名内部类不能有构造方法暗,一次只能创建一个对象
object类
.getClass() :返回一个类对象Class class=对象名.getClass();
.getName();
.hashCode() :返回该对象的10进制哈希值 (int类型)
.toString(); :返回类对象名+@+16进制哈希吗值(可以重写覆盖)
.equas(对象); :返回一个boolean类型的值(覆盖重写)
包装类
int Iinterage
String类
字符串常量池池;
String s1="abc";
String s2="abc";
相同方式创建对象,相同值,会放到字符串池 ,<font color="#ff0000">两个对象同地址</font>
方法
字符串其实就是字符数组
.charAt(int ) 取字符
.contains(str)匹配串
.toCharArray();转化为字符数组
.indexOf(char,int)通过字符查找首次出现的下标,int 决定从下标int开始查找
String 类
string和stringBuilderde 区别
String 长度不可变
StringBuilder 长度可变
StringBuilder
构造方法
StringBuilder()
StringBuilder("")
append()方法 返回对象自身,所以可以反复使用方法
相互转换
builder转换为string
String s=str.toString()
string转换为builder
StringBulider str=new StringBuilder(s);带参构造方法
可变字符串BigDecimal
Date
Calender
SimpleDateFormat
System
集合
Collection(接口)<font color="#9d3e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#9a3e3e;">(无序、无下标、元素可以重复)</font>
List(接口)(有序,有下标,元素可以重复)
ArrayList(基于数组)
有序,有下标,元素可以重复
查询快、增删慢,jdk1.2版本,执行效率高,线程不安全。
Vector(基于数组)
jdk1.0版本执行效率低、线程安全。
LinkedList(基于链表)
增删快,查询慢
双链表
Set(接口)(无序,无下标,元素不可重复)
HashSet
基于<font color="#b63d3d" data-darkreader-inline-color="" style="--darkreader-inline-color:#ad3d3d;">hashCode</font>和<font color="#ad3d3d" data-darkreader-inline-color="" style="--darkreader-inline-color:#a63d3d;">equals</font>实现元素不重复(仅重写equals方法不能实现去重)
当哈希吗相同时会用那个equals确认,如果为true则<font color="#ff0000">拒绝存入</font>
表面无序,实则以哈希值为序
LinkedHashSet
链表实现的 Hashset类,按照链表进行储存,<font color="#b63d3d" data-darkreader-inline-color="" style="--darkreader-inline-color:#ad3d3d;">保留了元素的插入顺序</font>
SortedHashSet(接口)
TreeSet
基于排列顺序实现元素不重复
实现了<font color="#ff0000">SortedHashSet</font>接口,对元素<font color="#ff0000">自动排序</font>
<font color="#ff0000">对象类型必须实现Comparable接口</font>,指定排序规则
通过重写<font color="#ad3d3d" data-darkreader-inline-color="" style="--darkreader-inline-color:#a63d3d;">compareTo(obj)</font>方法确定是否为<font color="#a63d3d" data-darkreader-inline-color="" style="--darkreader-inline-color:#a03e3e;">相同元素</font>,<font color="#a03e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#9d3e3e;">和排序规则</font>
方法2:通过匿名内部类的方式,实现<font color="#a03e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#9d3e3e;">Comparator</font>接口,并重构<font color="#a63d3d" data-darkreader-inline-color="" style="--darkreader-inline-color:#a03e3e;">compare(s1,s2)</font>
匿名内部类
Map(映射)(接口)
HashMap(线程不安全,效率快,允许插入null)
可以插入<font color="#ff0000">重复Key,</font>但value也会被覆盖
被<font color="#ff0000">remove</font>的value,再次<font color="#ff0000">get时</font>结果会是<font color="#ff0000">null</font>
键值视图
键:<font color="#ff0000">Set</font><键泛型> s= 对象名.keySet();
for(String str : 对象名.keySet()){System.out.println(str)}
值:<font color="#ff0000">Collection</font><值泛型> s= 对象名.values();
for(String str : 对象名.value()){System.out.println(str)}
键+值:<font color="#ff0000">Set </font><<font color="#ff0000">Map.Entry</font><泛型,泛型>> entrys=类名.对象名.entrySet();
<ul><li>for(Map.Entry<泛型,泛型> entry : entrys){<font color="#ff0000">entry.getKey(); entry.getValue();</font> }</li></ul>
Hashtable(线程安全,效率慢,不允许插入null)
Properties类
要求key,和value都是string 类型
不安全,继承了一个不该继承的类<font color="#ff0000">Hashtable</font>(可以使用put(key,value)方法)
只能使用<font color="#ff0000"> 对象名.setProperties(</font>"String"<font color="#ff0000">)</font>方法和<font color="#ff0000">对象名.getProperties("String")</font>方法
子主题
SortedMap(接口)
TreeMap
可以对<font color="#ff0000">key</font>自动排序,必须实现<font color="#ff0000">comparable接口</font>
匿名类
存储任意键值对(Key-value)
键:无序,无下标,不允许元素重复
值:无序,无下标,允许元素重复
底层实现<font color="#9a3e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#983e3e;">数组+单向链表</font>
遍历方式
keySet()遍历
entrySet()遍历
异常
概念
程序在运行过程中出现的特殊情况
分类
Throwable可抛出的
Error<br>硬件、jvm、执行逻辑的错误,不能处理
Exception<br> 程序在运行和配置过程中产生的,可处理
RuntimeException<br>运行时异常、可处理、可不处理
NullPointerException空指针异常
ArrayIndexOutOfBoundsException数组下标越界异常
Class CastException 类型转换异常
NumberFormatException数字格式化异常
ArithmeticExecption 算数异常
CheckedException<br>检查时异常,必许处理
产生
自动抛出异常: 当程序运行时遇到不规范的代码和结果时
手动抛出 : throw new 异常类型("实际参数")
<font color="#ff0000">相当于遇到 System.exit(0),导致程序因异常而终止</font>
传递
按照方法调用链反向传递
处理
<font color="#ff0000">try{</font><br>可能会出现异常的代码<br><font color="#ff0000">}catch{</font><br>//捕获异常<br>//处理异常<br><font color="#ff0000">}finally{</font><br>//无论异常是否发生都会执行的代码<br><font color="#ff0000">}</font>
处理异常的三种方式
自定义处理()
e.printStackTrace()
e,Message();
声明,抛出异常
throws :声明异常
throw : 抛出异常
自定义异常
异常类 extends Exception(或子类){<br>重写父类的构造方法<br>}<br><br>
多线程
基本多线程
概念
运行的程序被称为进程<br> 线程是<font color="#983e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#973e3e;">轻量级的进程</font>
cpu的基本执行调度单位
JVM就是一个进程,<font color="#973e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#963e3e;">main方法是主线程,</font><font data-darkreader-inline-color="" style="--darkreader-inline-color:#2a2e2f;" color="#181a1b">通过代码创建多个线程与</font><font data-darkreader-inline-color="" style="--darkreader-inline-color:#953e3e;" color="#963e3e">主线程并行运行</font>
组成
时间片:OS 为每个线程分配的执行时间
运行数据:
堆空间:存储线程所需要使用的对象
存储线程使用的局部变量,<font color="#953e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">每个线程有各自独立的栈</font>
线程的逻辑代码
创建线程
方法一: extends Thread
方法二: <font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">implements Runable</font>
Runnable接口
线程状态
初始
就绪
运行
等待
阻塞
终止
线程安全
同步代码块
同步方法
线程通信
wait(); 等待
notify(); 唤醒
生产者消费者问题
子主题
高级多线程
线程池
Executor(顶级接口)<br><font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">execute(Runnable)方法</font>
ExecuterService(线程池接口)<br><font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">submit(Runnable)<br>submit(Callable)</font>
Executors(实现类)
创建线程池<br><font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">ExecutorService es=Executors.newFixeThreadPool(线程数量)//指定数量线程池<br><br>newCachedThreadPool()//动态数量的线程池<br><br> newSingleThreadExecutor() //单线程池<br><br> ExecutorService es = Executors.newScheduledThreadPool(4);// 延时线程池**<br><br><br></font>
Callable接口
相当于带有返回值的Runnable接口
Future<T> submit(Callable);
Future接口
<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">异步</font>计算结果
用于接收submit(Callable)的返回值
.get()方法获得future的值//原理future进入无限期等待<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">异步</font>计算结果的完成
Lock接口
比synchronized更加高级,显式定义,结构更加灵活
重入锁<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">ReentrantLock</font>:Lock的实现类,与synchornized用相同的排斥锁功能
<ol><li>lock();开启锁</li></ol>
unlock();释放锁<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">(处理异常时,写在finally中)</font>
ReentrantReadWriteLock:读写锁
//创建读写锁对象<br>ReentrantReadWriteLock rw=new ReentrantReadWriteLock();
//创建读锁对象<br>ReadLock readlock= rw.readLock();
//创建写锁对象<br>WriteLock writelock= rw.writeLock();
线程安全的集合
Collections类方法将一个集合转换成线程安全的集合
CopyOnWriteArrayList
CopyOnWriteArraySet
ConcurrentHashMap
初始容量默认为16段
通过分段锁确保线程安全
1.8之后采用CAS算法(乐观锁) ----悲观锁:synchornized<br>(compare安定swap 比较交换算法)
ThreadLocal
<font color="#a73d3d" data-darkreader-inline-color="" style="--darkreader-inline-color:#a13e3e;">在JDBC中存储连接对象</font>
Queue(接口)
ConcurrentLinkedQueue底层使用CAS算法,线程安全
BlockingQueue(接口)
ArrayBlockingqueue
LinkedBlockingQueue
IO框架
文件类
File file=new File("文件路径")(路径必须存在)
file.creatNewFile();//创建文件
文件夹操作
File dir=new File("多级文件夹")
dir.mkdirs();//创建多级文件夹
流的概念:内存与存储设备之间传输数据的通道
流的分类
输入流:从存储设备向内存传输
输出流:从内存向存储设备传输
字节流:以字节为单位,能读写所有数据
InputStream
FileInputStream<br>字节节点输入流(文件字节输入流)
一次读一个字节
一次读一组字节
OutputStream
FileOutputStream<br>字节节点输出流
字符流:以字符为单位,只能读写字符数据
Reader
FileReader<br>字符节点输入流(文件字符输入流)
Writer
FileWriter<br>字符节点输出流(文件字符输出流)<br>
节点流:具有直接传输数据的读写功能
过滤流(装饰类):在节点流的基础上增强功能
InputStream
BufferedInputStream()<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">没啥意义</font><br>字节过滤输入流
ObjectInputStream<br>对象过滤输入流
读取文件中存入的Java数据
OutputStream
BufferedOutputStream(字节节点流对象)<br>字节过滤输出流
.flush();//刷新缓冲池
.close();//关闭缓冲池,级联刷新
ObjectOutputStream(字节节点流对象)<br>对象过滤输出流(序列化)
输出Java中的数据类型(将<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">数据</font>写入文件,并非<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">文本</font>)
将一个Object类型写入文件,该类必须实现<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">可序列化接口(Serializable)</font>
字节打印流
PrintSteam(.print(97)
Reader
BufferedReader(字符节点流对象)<br>字符节点过滤输入流
转换流
将文件字节流转换为文件字符流
Writer
BufferedWriter<br>字符节点过滤输出流
打印流
PrintWriter (.print(97))
序列化:从内存中将一个对象写入文件中(反之叫做<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">反序列化</font>)
对象必须实现Serializable接口
必须保证类的所有属性都可以序列化
transient修饰的属性为临时属性,不能序列化
静态属性不能序列化
读到文件末尾会抛出EOF异常,不是-1
网络编程
反射
反射技术
反射:<font color="#9d3e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#9a3e3e;">通过反射机制获取类对象,并使用类对象的方法,获得类的个方法和属性等</font>
类对象:封装了一个类的全部信息(<font color="#a13e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#9d3e3e;">属性,方法,构造方法等</font>)
获取类对象
通过类的对象: s.getClass();
通过类名: 类名.class;
通过静态方法获取: <font color="#973e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#963e3e;">Class.forName("包名.类名")</font>
获取类对象的方法
构造方法
类对象.constructors();--全部构造方法
<font color="#3dad3d" data-darkreader-inline-color="" style="--darkreader-inline-color:#3da63d;">Construct<?> con</font>=类对象.constructor();---获取无参构造方法
类对象.constructor(参数类型.class,参数类型.class);---获取带参构造方法
实例方法
类对象.getMethods();-----全部方法
<font data-darkreader-inline-color="" style="--darkreader-inline-color:#3dad3d;" color="#3db63d">Method method</font><font color="#963e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#953e3e;">=类对象.getMethod("方法名");------无参方法</font>
<font color="#953e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">类对象.getMethod("方法名",参数类型.class);------带参方法</font>
获取私有方法
类对象.getDeclareMethod("方法名")
使用前 <font color="#3d3db6" data-darkreader-inline-color="" style="--darkreader-inline-color:#3d3dad;">method.setAccessible(true);</font>
使用实例方法<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">(非私有,非静态)</font>
method.invoke(对象)-----无参方法
method.<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">invoke(对象,实参)-----带参方法</font>
<font color="#983e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#973e3e;">获得一个对象</font>
(拆箱,向下转型)构造方法对象.newInstance();<br>
<font color="#9a3e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#983e3e;">(Student)类对象.newInstance();<br>(Student)类对象.newInstance(实参,实参);<br></font>
获取属性
类对象.getFields();---全部属性
<font color="#3da63d" data-darkreader-inline-color="" style="--darkreader-inline-color:#3ea03e;">Field field</font>=<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">类对象.getField();</font>----公开属性
类对象.getDeclareField()----私有属性
为属性赋值
field.set(对象,实参);---公开
field.setAccessible(true);--可修改的<br>field.set(对象,实参)-----私有属性<br><font color="#3d3dad" data-darkreader-inline-color="" style="--darkreader-inline-color:#3d3da6;">会破会类的封装行----解决方法(内省技术)</font>
内省
<font style=""><font style=""><font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">内省:采用反射机制实现</font><font color="#3e9d3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#3e9a3e;">对</font></font><font style="--darkreader-inline-color:#3e9a3e;" color="#3e9d3e" data-darkreader-inline-color="">属性进行操作</font><font style="color: rgb(148, 62, 62); --darkreader-inline-color:#943e3e;" data-darkreader-inline-color="">的一种机制。<br> PropertyDescriptor</font></font><font color="#3ea03e" data-darkreader-inline-color="" style="--darkreader-inline-color:#3e9d3e;">:属性描述符 ,代表一个属性<br> </font><font data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;" color="#943e3e">BeanInfo:</font><font color="#3ea03e" data-darkreader-inline-color="" style="--darkreader-inline-color:#3e9d3e;">实体类信息 ,包含类的信息<br> </font><font data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;" color="#943e3e">Introspector</font><font color="#3ea03e" data-darkreader-inline-color="" style="--darkreader-inline-color:#3e9d3e;">:工具类</font>
<font data-darkreader-inline-color="" style="--darkreader-inline-color:#3e983e;" color="#3e9a3e">PropertyDescriptor</font><font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;"> pd1=new PropertyDescriptor("属性名",类对象);----属性描述器</font>
Method<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;"> method=pd1.getWriteMethod();</font>----获得设置方法<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">(实则调用set方法)</font>
method.invoke(对象,实参)-----赋值操作
工厂设计模式(负责创建对象)
开闭原则:扩展开放,修改关闭
通过<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">反射</font>进行工厂模式的设计
单例设计模式
饿汉式:类加载时创建,天生线程安全
懒汉式:使用时创建,线程不安全,加同步
枚举
枚举是一个引用类型,规定了取值范围的数据类型
<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">enum关键字---创建枚举<br> public enum Gender{<br> male,female,男,女;<br>}</font>
本质
<font color="#3e983e" data-darkreader-inline-color="" style="--darkreader-inline-color:#3e973e;">终止类,继承了Enum抽象类</font>
枚举中的常量时当前类型的<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">静态常量</font>
注解<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">Annotation</font>
一般代替配置文件
常见注解@Override,@Deprecated
定义注解使用@interface关键字---注解中<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">只能包含属性。</font>
jdk8新特性
lambda表达式
实质:特殊的<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">匿名内部类</font>,语法更简洁<br>允许把一个<font color="#943e3e" data-darkreader-inline-color="" style="--darkreader-inline-color:#943e3e;">函数作为方法的参数</font>。
子主题
函数式接口
方法引用
Stream流
新时间API
0 条评论
下一页