javase-Thread
定义多线程的三种方式继承Thread类// 1.定义一个类继承自Threadclass MyThread extends Thread { // 2.重写run()方法 @Override public void run() { for (int i = 0; i < 100; i++) { System.out.println(getName()+"run()..."); } }}public class ThreadDemo01 { public static void main(String[] args) { // 3.创建对象 MyThread t1 = new MyThread(); MyThread t2 = new MyThread(); t1.setName("线程1"); ...
javase-不可变集合
JDK9以后才有不可变集合 创建不可变集合的应用场景 如果某个数据不能被修改,可以把他拷贝到不可变集合。 当集合对象被不可信的库调用,不可变形式是安全的。 创建不可变集合的书写方式在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合 这个集合不能添加,不能删除,不能修改。 public class Demo01 { public static void main(String[] args) { // 一旦创建完毕,是无法修改的,只能进行查询操作 List<String> list = List.of("张三", "李四"); // 在Set集合中,里边的参数要保证唯一,否则就会报错 Set<String> set = Set.of("张三", "李四"); // 在Map集合中,键也不能重复 且 参数有上限(最多只能传递10个键值对) Map<String,...
javase-反射
反射允许对成员变量,成员方法、构造方法的信息进行编程访问。反射 = 获取 + 解剖 获取:获取class对象 解剖:解剖class对象的一些方法信息 获取class对象的三种方式 Class.forName(“全类名”):最常用。 类名.class:当作参数进行传递 对象.getClass():当已经有了这个类的对象时可以使用 @Data@AllArgsConstructor@NoArgsConstructorclass Student { private String name; private int age;}public class Demo01 { public static void main(String[] args) throws ClassNotFoundException { // Class.forName("全类名") Class clazz1 =...
javase-方法引用
方法引用:就是把已经有的方法拿过来用,当作函数式接口抽象方法的方法体。条件: 引用处必须是函数式接口 被引用的方法必须已经存在 被引用方法的形参和返回值需要和抽象方法保持一致 被引用的方法要满足当前需求 格式:类名::方法名 引例public class Demo01 { // 被引用的方法:可以是java已经写好的,也可以是第三方工具类 public static int sub(int a, int b) { return a - b; } public static void main(String[] args) { Integer[] arr = {3, 5, 4, 1, 6, 2}; // lambda表达式 Arrays.sort(arr, (o1, o2) -> o1 - o2); System.out.println(Arrays.toString(arr)); // 改进:方法引用...
javase-可变集合
集合的体系结构List:添加的元素是有序、可重复、有索引的。Set:添加的元素是无序、不重复、无索引的。 Collection是单列集合的祖宗接口,它的功能是所有单列集合都可以继承使用。 基本方法 public class Demo01 { public static void main(String[] args) { Collection<String> coll = new ArrayList<>(); /** * 增: * 往List集合里添加数据,方法永远返回true * 往Set集合里添加数据 * 元素已经存在:返回false * 元素不存在:返回true */ coll.add("aaa"); coll.add("bbb"); coll.remove("aaa"); //...
java中的可变参数
可变参数:方法形参的个数可以发生变化 格式:属性类型…名字 public class Demo10 { public static int getSum(int ...args) { int sum = 0; for(int arg : args) { sum += arg; } return sum; } public static void main(String[] args) { System.out.println(getSum()); System.out.println(getSum(1)); System.out.println(getSum(5, 2)); System.out.println(getSum(3, 4, 5)); ...
javase-类和对象
类和对象类:对象共同特征的描述对象:真实存在的东西 定义类一个java文件中可以定义多个类,但是只能一个类是public修饰,public修饰的类名必须是Java代码的文件名。 public class 类名 { 1.成员变量 2.成员方法 3.构造器 4.代码块 5.内部类} JavaBean类在JavaBea类中不写main方法,用来描述一类事物标准的JavaBean: 类名见名知意 成员变量使用private修饰 至少提供两个构造方法(无参、带全部参数) 提供每一个成员变量对应的get和set方法 测试类创建javaBean类的对象并复制调用,带main方法 封装对象代表什么,就得封装对应的数据,并提供数据对应的行为。例:人 画 圆:画圆这个方法应该是定义在圆类里边。【人调用了圆类中画圆的方法】 构造方法在创建对象的时候给成员变量进行初始化的。执行时机:创建对象的时候由虚拟机调用。 public class Stu { 修饰符 类名(参数)...
2379. 得到 K 个黑块的最少涂色次数
【题目】:2379. 得到 K 个黑块的最少涂色次数 class Solution {public: int minimumRecolors(string blocks, int k) { int res = blocks.size(); int curWcount = 0; // 记录窗口内W字符的个数 for(int l = 0, r = 0; r < blocks.size(); ++r) { if(blocks[r] == 'W') { // 滑窗内有字符W curWcount++; } if(r - l + 1 == k) { res = min(res, curWcount); // 缩小窗口 if(blocks[l++] ==...
2090. 半径为 k 的子数组平均值
【题目】:2090. 半径为 k 的子数组平均值 class Solution {public: vector<int> getAverages(vector<int>& nums, int k) { vector<int> res(nums.size(), -1); long curSum = 0; // 记录当前滑窗内的数值和 for(int l = 0, r = 0; r < nums.size(); ++r) { curSum += nums[r]; if(r - l + 1 == k * 2 + 1) { // 窗口长度满足条件 res[r - k] = curSum / (k * 2 + 1); // 当长度满足时,此时对应的半径中心坐标是:r - k curSum -= nums[l++]; // 缩小窗口 ...
1461. 检查一个字符串是否包含所有长度为 K 的二进制子串
【题目】:1461. 检查一个字符串是否包含所有长度为 K 的二进制子串 直接存储滑动窗口内的字符串,这样虽然方便,但是时间复杂度和k相关,如果k = n,此时会达到O(n^2)的复杂度。 class Solution {public: bool hasAllCodes(string s, int k) { unordered_set<string> ss; for(int l = 0, r = 0; r < s.size(); ++r) { if(r - l + 1 == k) { ss.insert(s.substr(l, k)); l++; } } return ss.size() == 1<<k; }}; 时间复杂度: O(n*k) 空间复杂度:...