Java反射
反射机制 Java反射机制是Java提供的一种在运行时动态获取类信息并操作类或对象的机制。通过反射,可以在程序运行时获取类的构造方法,成员变量,方法等信息,并调用他们。
反射的优点与缺点
优点:可以动态地创建和使用对象(也是框架底层核心),使用灵活,没有反射机制,框架技术就失去底层支撑
缺点:使用反射基本是解释执行,对执行速度有影响
反射的核心类
Class类:表示类的元数据,表示某个类加载后在堆中的对象,是反射的入口
Constructor类:表示类的构造方法
Field类:表示类的成员变量
Method类:表示类的方法
底层运作
反射的主要功能
获取类的信息:
获取类的名称,修饰符,父类,接口,注解等
获取类的构造方法,成员变量,方法等信息
动态创建对象:
通过 Class.newInstance() 或 Constructor.newInstance() 动态创建对象
动态调用方法:
通过 Method.invoke() 动态调用对象的方法。
动态访问和修改字段:
通过 Field.get() 和 Field.set() 访问和修改对象的字段。
操作数组:
通 ...
题解_每日一题24.12.29
题目
思路根据示例1,我们遍历votes,统计得到:
A:下标0出现5次,下标1出现0次,下标2出现0次
B:下标0出现0次,下标1出现2次,下标3出现3次
C:下标0出现0次,下标1出现3次,下标2出现2次
将以上的数据添加到一个哈希表(或数组)中,得到记录如下:
123'A' : [5, 0, 0]'B' : [0, 2, 3]'C' : [0, 3, 2]
将A,B,C排序:
按照字母出现次数的列表,字典序大的排在前面
根据字母的ASCII值,小的排在前面
答案1234567891011121314151617181920212223242526class Solution { public String rankTeams(String[] votes) { int m = votes[0].length(); int[][] cnts = new int[26][m]; for (String vote : votes) { ...
IO流
IO流字节流字节输出流FileOutputStream的作用:
可以把程序中的数据写到本地文件上,是字节流的基本流
步骤:
创建字节输出流对象
参数是字符串表示的路径或者File对象都是可以的
如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
如果文件已经存在,则会清空文件
写数据
write方法的参数是整数,但是实际写到本地文件中的是整数再ASCII上对应的字符
释放资源
每次使用完流之后都要释放资源
先开的最后关闭
123456789101112//创建对象的第二个参数是续写打开的开关//默认false:关闭续写,创建对象会清空文件//手动传递true:开启续写,创建对象不会清空文件FileOutputStream fos = new FileOutputStream("myio\\a.txt", false);//一次写一个字节数据fos.write(97);//一次写一个字节数组数据byte[] bytes = {97, 98, 99};fos.write(bytes);//一次写一个字节数组的部分数据// ...
方法引用
方法引用方法引用的作用:把已经存在的方法拿过来用,当作函数式接口中的抽象方法的方法体
使用方法引用应该满足的条件:
需要有函数式接口
被引用方法必须已经存在
被引用方法的形参和返回值需要跟抽象方法保持一致
被引用方法的功能要满足当前的需求
引用静态方法格式:类名::静态方法
范例:Integer::parseInt
1234ArrayList<String> list = new ArrayList<> ();list.stream() .map(Integer::parseInt) .forEach(s -> System.out.println(s));
引用成员方法格式:对象::成员方法
其他类:其他类::方法名
本类:this::方法名
父类:super::方法名
12345678910111213141516public class Main { public static void main(String[] args) { ArrayList<String> list = new ArrayList ...
Stream流
Stream流作用结合了Lambda表达式,简化集合,数组的操作
步骤
先得到一条Stream流(流水线),并把数据放上去
使用中间方法对流水线上的数据操作
使用终结方法对流水线上的数据操作
获取Stream流
单列集合 -> Collection中的默认方法
1234ArrayList<String> alist = new ArrayList<> ();Collections.addAll(alist, "a","b","c");alist.stream() .forEach(s -> System.out.println(s));
双列集合 -> 无法直接使用stream流
第一种获取stream流
123HashMap<String, Integer> hm = new HashMap<> ();hm.keySet().stream() .forEach(s -> System.out.println(s));
第 ...
不可变集合
不可变集合特点定义完成后不可以修改,或者添加,删除
创建不可变集合List,Set,Map接口中,都存在of方法可以创建不可变集合
1static<E> List<E> of(E...elements)
1static<E> Set<E> of(E...elements)
1static<K,V> Map<K,V> of(E...elements)
方法的特点
List:直接用
Set:元素不能重复
Map:元素不能重复,键值对数量最多是10个;超过10个用ofEntries方法
12345678910111213141516171819HashMap<String, String> hm = new HashMap<> ();//当Map中的键值对对象超过10个时,采用以下的方法获取一个不可变的集合//获取到所有的键值对对象(Entry对象)Set<Map.Entry<String, String>> entries = hm.entrySet();//把e ...
计算机组成
计算机组成第一章 计算机系统概论冯诺依曼型计算机特点
1.计算机由运算器,控制器,存储器,输入和输出设备5部分组成
2.采用存储程序的方式,程序和数据放在同一个存储器中,并以二进制表示。
3.指令由操作码和地址码组成
操作码:表示执行何种操作
地址码:表示操作数在存储器中的位置
4.指令在存储器中按执行顺序存放,由指令计数器(即程序计数器PC)指明要执行的指令所在的储存单元地址,一般按顺序递增,但可按运算结果或外界条件而改变
5.机器以运算器为中心,输入输出设备与存储器间的数据传送都通过运算器
区别以运算器为中心的计算机还是存储器的方法
看输入设备能否直接与存储器相连,是的话就是以存储器为中心
计算机系统
硬件
结构
主机
cpu
ALU运算器
CU控制器
存储器
主存
辅存
I/O
输入设备
输出设备
主要技术指标
机器字长
CPU一次能处理的数据位数
存储容量
存储容量=存储单元个数×存储字长
运算速度
单位时间执行指令的平均条数,MIPS
软件
系统软件
用来管理整个计算机系统
语言处理程序
操作系统
服务性程 ...
java多线程浅谈
多线程多线程的概念多线程是一种用于实现并发执行的计算机编程技术,这允许单个程序创建和管理多个线程,以同时执行多个任务或执行块。
并发:在同一时刻,有多个指令在单个CPU上交替执行
并行:在同一时刻,有多个指令在CPU上同时执行
线程的生命周期
新建(New):创建后尚未启动的线程处于这个状态
就绪(Runnable):调用start()方法后,线程进入就绪状态,此时线程只是开辟了内存空间,正在等待被线程调度器选中获得对CPU的使用权
运行(Running):线程获得CPU权限进行执行
阻塞(Blocked):线程在等待监视器锁(即等待 synchronized 锁)时,会进入阻塞状态
等待(WAITING):线程等待另一个线程通知或中断时,会进入等待状态。进入这个状态的线程需要等待其他线程调用notify()或notifyAll()方法
超时等待(TIME_WAITING):线程在指定的等待时间内等待另一个线程的通知时,会进入超时等待状态。这通常发生在调用了带有指定等待时间的wait(long timeout)、join(long millis)、sleep(long millis ...
正则表达式
正则表达式正则表达式在搜索,替换,检查和解析字符串方面有着高效且简洁的优点
基本概念和用法
普通字符
普通字符就是普通字符,例如,正则表达式abc会匹配包含“abc”的字符串
特殊字符(元字符)
.(点):匹配任意单个字符(除了换行符)。
^(脱字符号):匹配输入字符串的开始位置。
$(美元符号):匹配输入字符串的结束位置。
[](方括号):匹配方括号内的任意字符(字符集)。
|(竖线):匹配两项之间的任意一项(或)。
\(反斜杠):转义特殊字符或表示特殊序列。
字符类
[abc]:匹配任何一个字符a、b或c。
[^abc]:匹配除了a、b、c之外的任何字符。
[a-z]:匹配任何一个小写字母。
[A-Z]:匹配任何一个大写字母。
[0-9]:匹配任何一个数字。
预定义字符类
\d:匹配任何一个数字(等同于 [0-9])。
\D:匹配任何非数字字符(等同于 [^0-9])。
\w:匹配任何字母数字字符(等同于 [a-zA-Z0-9_])。
\W:匹配任何非字母数字字符(等同于 [^a-zA-Z0-9_])。
\s:匹配任何空白字符(空格、制表符、换行符等)。
\ ...
快速幂
快速幂为了高效地计算一个数的幂,在计算a^b^时候,可以将时间复杂度由O(b)降低至O(logb)
快速幂算法的原理快速幂算法的核心思想是利用指数的二进制展开和乘法的结合律。当我们计算 a^b^ 时,我们可以将指数 b分解为多个2的幂的和,例如:
其中 bi 要么是0,要么是1(因为这是二进制表示)。因此,我们可以将 a^b^ 分解为:
1234567891011121314public static long fastPower(long a, long b, long modulus) { long res = 1; //1.将指数b转换为二进制表示 while (b > 0) { //2.从b的最低位开始,对于每一位: //如果这一位是1,那么将当前的底数a乘到结果中 if ((b & 1) == 1) res = (res * a) % modulus; //将底数a自乘(a = a * a) a = (a * a) % modulus; //继续处理下一位,直到处理完所有 ...