杂项2

简介: 本文介绍了Java编程中的多个实用知识点,涵盖集合操作、循环控制、Map遍历、类型安全、多线程等内容。包括不可变列表、集合添加判断、死循环登录验证、Map键值对遍历方式、链式调用的潜在问题、泛型类型擦除处理、增强for循环应用、列表合并与去重方法、输入流读取机制、asList的使用特点以及多线程Callable和FutureTask的协作执行流程,适用于Java开发者提升编码技巧和理解底层机制。

1.h1.stream().toList() 返回的是一个不可变列表(h1是hashset)

2.集合提供的add方法,返回值是boolean类型,所以可以根据返回值类型判断,是否添加成功

3.一般判断用户登录的时候,用while(true)死循环,根据判断结果来终止死循环(可以用"break;"

或者"return;"来终止

4.map是根据键找值,而不是索引(不存在),所有fori循环map是无法使用的;要根据键去找值;或者调用entry方法,切记不可链式调用会容易丢失类型

下面三行均是使用快捷键生成的

示例:

第一行:Map<Integer,String> t=entry.getValue();

第二行:Set<Map.Entry<Integer, String>> s1 = t.entrySet();

  • 作用:先将 entry.getValue() 的结果赋值给变量 t,再调用 t.entrySet()
  • 优势
  • 显式声明 t 的类型,增强代码可读性。
  • 便于后续对 t 进行其他操作(如修改、复用)。

第三行: Set set = entry.getValue().entrySet(); (链式调用)

  • 问题
  • 未指定泛型,set 的类型为 Set(原始类型),失去类型安全。
  • 无法直接获取 Map.Entry<Integer, String> 的类型信息,需要强制转换

形式上第一行+第二行等价于第三行,区别主要在于 类型安全代码可读性,本质上两者的功能是一致的。

5.如果不知道索引,可以用增强for循环(在嵌套中)

6.元素去重合并(两个list类型)

合并:使用stream提供的concat方法或者 l1,add(l2)

去重:(思想转换为set)使用工具类collect方法或者Set<String>s1=new HashSet<>(l3);

7.类型擦除

Set<String>s1 =new TreeSet<>((o1, o2) -> o1.compareTo(o2));

//虽然你显式创建了 TreeSet,但通过匿名 Comparator 赋值给 Set 接口变量时,
// 类型信息被擦除,导致编译器无法识别 TreeSet 的特有方法(如 first()、last())。
  1. 解决思路
  • 方法一:将变量类型声明为 TreeSet,而非 Set
  • 方法二:通过显式类型转换调用 last()

8

针对for循环中嵌套if语句,但是不想else语句先执行,而是在for循环终结时在执行else,操作步骤

int a[]={1,2,3};
    for (int i = 0; i < a.length; i++) {
        if(3==a[i]){
            System.out.println(a[i]);
        }
        else
            System.out.println(1);
    }
}
int a[] = {1, 2, 3};
boolean hasThree = false;
for (int num : a) {
    if (num == 3) {
        hasThree = true;
        System.out.println(num);
    }
}
if (!hasThree) {
    System.out.println(1);  // 仅当数组中无3时执行
}

不使用else语句

针对输入流的read在流没有关闭的时候,调用一次,读取一次

对于指定读取长度的

byte[] byte1 =new byte[6];
in.read(byte1);

一次读取六个字节,in.read(byte1)本身就是6个字节,等价于等于的字节数组长度;含义是,读取6个字符,并把这6个字节存到字节数组中

read调用一次读取一次,如果调用后剩余的字符长度不足数组定义的长度,会进行覆盖,覆盖的是上一次读取的数组,而且是从头开始覆盖

示例

97 100 228 189 160 229 165 189
 a  d   你         好

第一次调用 read (byte1)

java

in.read(byte1); // 读取前6个字节


此时 byte1 数组内容为:


plaintext

[97, 100, 228, 189, 160, 229]
 a   d   你       ?


注意最后一个字节 229 是 "好" 字的第一个字节,单独无法构成完整字符。

第二次调用 read (byte1)

java

System.out.println(in.read(byte1)); // 剩余2个字节,返回2


此时方法会读取剩余的两个字节 [165, 189],并覆盖 byte1 数组的前两个位置


java

byte1[0] = 165;  // 覆盖原有的 'a' (97)
byte1[1] = 189;  // 覆盖原有的 'd' (100)


但数组的后四个位置保持不变,因此最终 byte1 的内容为:


plaintext

[165, 189, 228, 189, 160, 229]
 ?    ?   你       ?


aslist特点

  • List<T> list = Arrays.asList(T... a)
  • 示例java
List<String> list = Arrays.asList("apple", "banana", "cherry");
// 等价于:List<String> list = Arrays.asList(new String[]{"apple", "banana", "cherry"});


  • 特点
  • 返回的 List固定大小的,不支持添加或删除元素(调用 add()remove() 会抛出 UnsupportedOperationException)。

若需要可变大小的 List,可通过 new ArrayList<>(Arrays.asList(...)) 创建副本:

java

List<String> mutableList = new ArrayList<>(Arrays.asList("a", "b"));
mutableList.add("c");  // 正常添加元素

多线程理解:

//创建类l实现接口callable
//创建l的实例化对象
//创建futuretask的实例化对象,并将的l的对象传给futuretesk的构造器即是:FutureTask f1 =new FutureTask(c1);
//创建thread对象,后续步骤同上一步 Thread t1=new Thread(f1);
//thread.start线程启动

代码执行流程

  1. 主线程创建了 MyCallable 对象和 FutureTask 对象,并且启动了新线程。
  2. 新线程开始执行 FutureTask.run() 方法,该方法会调用 MyCallable.call() 方法。
  3. 主线程调用 futureTask.get() 方法后被阻塞,等待子线程计算结束。
  4. 子线程完成计算后,get() 方法返回结果,主线程继续执行后续操作。


  • 不要手动调用 call() 方法:要是手动调用了 call() 方法,就相当于在主线程里直接执行计算任务,这就失去了多线程并行执行的意义。
  • get() 方法的阻塞特性get() 方法会使当前线程暂停执行,直到子线程完成任务。如果你希望主线程和子线程能够并发执行其他任务,可以在调用 get() 方法之前先执行一些操作。
  • 对于get阻塞特性的理解:一旦使用thread.start,则子线程就在和主线程并行的运行,在主线程运行到子线程的get方法时,如果子线程处理完成,会立即返回,否则会阻塞主线程;实质上,一旦子线程启动,子线程会在后台运行,主线程也在同时运行,只有主线程遇到get()时才会阻塞检查子线程是否运行结束
相关文章
|
24天前
|
存储 算法 Sentinel
熔断降级
本内容介绍了微服务中熔断降级的实现原理及Sentinel的底层机制。通过OpenFeign集成Sentinel,利用断路器统计异常和慢请求比例,触发熔断并降级,提升系统稳定性。还讲解了Sentinel使用的限流算法,如滑动窗口、令牌桶和漏桶算法,以应对不同场景下的流量控制需求。
|
24天前
|
负载均衡 Java Nacos
微服务架构中的服务注册与发现流程
本内容介绍了微服务架构中的服务注册与发现流程,包括服务注册中心(如Nacos)、服务提供者和调用者的角色分工。服务启动时自动注册信息至注册中心,调用者通过客户端负载均衡(如Spring Cloud Loadbalancer)选取服务实例进行远程调用。同时,内容还讲解了OpenFeign的工作原理,其作为HTTP客户端集成负载均衡,通过接口定义、代理生成、请求发送与结果解析,实现服务间的高效通信。
|
24天前
|
负载均衡 Java 应用服务中间件
杂项10
Spring Cloud Alibaba 与 Spring Cloud 均基于 Spring Boot 构建微服务,遵循相同规范且组件可协同使用。区别在于,Spring Cloud Alibaba 使用 Nacos 实现服务发现与配置管理,推荐 Sentinel 作为断路器,并支持 Dubbo 与 Feign 远程调用。Nginx 可通过配置 upstream 实现负载均衡,作为反向代理,其“反向”体现在外网通过 Nginx 访问内部服务器。
|
25天前
|
XML Java Maven
@Bean`注解的使用方法及其作用
本文介绍了Spring框架中`@Bean`注解的使用方法及其作用,包括如何将第三方类库加入Spring容器,配置类与`@Configuration`的配合使用,以及通过`@ConditionalOnClass`、`@ConditionalOnMissingBean`等条件注解控制Bean的加载。同时讲解了Maven父子模块间的依赖关系及配置方式,帮助开发者更好地管理项目结构与依赖注入。
|
24天前
|
消息中间件 网络性能优化
了解MQ
消息堆积处理核心在于平衡生产与消费速度,可通过限流生产、优化消费者处理能力及异步机制缓解。RabbitMQ通过持久化、确认机制保障消息可靠性,MQTT则依赖QoS等级确保传输。延迟消息常用死信队列实现,而幂等性可通过唯一ID避免重复消费。MQ广泛用于异步处理、系统解耦及分布式事务等场景。
|
24天前
|
安全 Java 应用服务中间件
spring基础
本文介绍了 Spring 与 SpringMVC 常用注解、RESTful 风格、IOC/DI 原理、Bean 作用域、自动装配流程及事务失效场景,帮助开发者深入理解 Spring 框架核心机制与常见问题。
spring基础
|
24天前
|
JSON 前端开发 Java
杂项6
本文介绍了软件开发中的多个关键技术点,包括数据回显、分页查询、AOP操作、文件上传、自增ID获取以及单表与多表更新的区别。内容涵盖了从前端到后端的完整流程,重点解析了分页实现、数据一致性处理及复杂表操作的优化方法,适用于Java Web开发场景。
|
24天前
|
存储 JSON 前端开发
初始前端2
本文介绍了前端开发中的几个关键技术点,包括使用`layout-&gt;router-&gt;view`结构实现页面渲染、利用`ref`定义动态响应模型、通过`axios`及`el-upload`实现文件上传、以及使用`localStorage`进行数据持久化存储等内容。重点解析了各组件间的数据传递、异步请求处理、前后端数据格式适配及数据序列化/反序列化操作,帮助开发者更好地理解前后端交互及组件协作机制。
|
24天前
|
SQL 数据库
sql了解2
本文介绍了SQL中多表连接查询的核心概念,包括内连接(取交集)、左外连接和右外连接(交集+单表全集)的用法及结果特征。同时讲解了子查询的不同形式(标量、列、行、子表),以及IN和BETWEEN操作符的区别和应用场景。此外,还说明了一对多关系中以“一”或“多”表为主对查询结果条数的影响,并通过示例展示了如何正确使用连接条件和子查询。