- 博客(35)
- 收藏
- 关注
原创 Java自定义程序使用Ollama实现本地ai调用
Ollama提供两种核心API接口:/api/generate用于单轮问答,/api/chat支持多轮对话。输入支持三种格式:JSON字符串、Map/Object转JSON和流式SSE输入。输出可选择一次性JSON或流式JSON模式,后者支持逐行解析。常用参数包括temperature、top_p等控制生成效果。示例代码展示了Java中如何调用这两种接口,包括传统JSON拼接和流式处理方式。开发人员可根据业务需求灵活组合这些功能,单轮对话适合简单场景,多轮对话则能保持上下文连续性。
2025-08-28 18:54:29
1733
原创 [盘点错误]为什么Lambda表达式不声明变量不报错
该Java代码演示了使用Lambda表达式和Predicate进行数组过滤。在filter方法中,传入的Lambda表达式e->e>50会被编译器自动推断为Predicate<Integer>类型,因此无需显式声明参数类型。这种类型推断是Java 8的特性,编译器根据目标接口Predicate<Integer>的泛型参数确定e应为Integer类型。代码实现了将大于50的元素筛选出来,展示了Java函数式编程的简洁性和类型推断机制。
2025-08-27 11:41:41
489
原创 [小练习]100行不到使用Java Socket网络编程实现定向聊天
本文介绍了基于Java实现的TCP和UDP网络通信程序。TCP版本包含客户端(Send.java)和服务端(Rece.java),分别通过发送(Sen.java)和接收(Rec.java)线程实现双向通信。UDP版本使用不同端口(8888和8889)实现双向通信,核心类包括客户端(Send.java)、服务端(Rece.java)及对应的收发线程。两种实现都支持通过输入"quit"退出,并解决了套接字关闭、线程同步等关键问题。文章详细说明了程序结构、运行步骤和核心代码,并分享了开发过程中
2025-08-26 20:20:53
1310
原创 [收藏向]Java多线程任务执行方式总结
本文总结了Java创建线程的5种主要方式:1)继承Thread类(不推荐,占用继承资源);2)实现Runnable接口(最经典方式);3)使用Runnable+Lambda(Java8推荐写法);4)Callable+FutureTask(支持返回值和异常处理);5)线程池提交任务(生产环境最佳实践)。其中重点对比了Runnable与Callable的区别,并强调线程池在高并发场景下的优势。文章通过最小示例代码展示了每种方式的实现,并分析了其适用场景,建议开发中优先选择线程池配合Lambda表达式的方式。
2025-08-22 11:53:53
1226
原创 [收藏向]JAVA中synchronized用法
Java中synchronized关键字实现线程同步的方式取决于修饰对象类型:修饰非静态方法时锁定当前实例对象(this),仅同步同一实例的线程访问;修饰静态方法时锁定类对象(Class对象),同步所有实例的线程访问。同步代码块可通过synchronized(this)或synchronized(ClassName.class)灵活指定锁对象。关键在于锁定哪个对象决定了线程互斥范围,而非方法或代码本身。
2025-08-21 20:52:02
833
原创 [盘点错误]A中的run()无法实现Runnable 中的run()
这篇文章讨论了在实现Runnable接口时run()方法抛出异常的问题。作者指出,不能随意修改Runnable接口的标准方法签名(void run()),因为Java重写规则不允许子类方法抛出比父类更多的受检异常。文章提供了两种解决方案:1)在run()内部捕获异常并转换为RuntimeException;2)改用Callable接口配合ExecutorService,通过Future.get()来获取异常信息。这些方法既符合Java规范,又能妥善处理异常情况。
2025-08-20 10:56:13
492
原创 [盘点错误]在使用集合sort()时,类不是抽象的, 并且未覆 盖Comparable中的抽象方法compareTo(Object)
Java中Comparable接口的正确使用方式:1. 无泛型写法需用compareTo(Object)并在方法内强制转型;2. 泛型写法Comparable<T>则直接使用compareTo(T)更安全;3. 混用会导致编译错误。建议统一使用泛型版本Comparable<Card>配合compareTo(Card)以避免类型转换错误。Collections.sort()和List.sort()都遵循此规则,泛型不匹配会导致编译失败。
2025-08-15 11:50:19
164
原创 [收藏向]Map遍历几种方式
本文介绍了Java中遍历Map的8种方法:1)使用keySet()/values()/entrySet()配合迭代器;2)增强for循环遍历keySet;3)Java8的forEach+Lambda表达式;4)Stream API遍历;5)Stream+方法引用;6)Enumeration(仅适用于Hashtable等旧类)。作者比较了各种方法的特点,推荐根据场景选择:简单遍历用增强for或forEach,需要过滤转换时用Stream,需要安全删除时用迭代器。文章还提供了示例代码演示每种遍历方式的使用方法。
2025-08-15 10:02:48
1210
原创 [盘点错误]分割无效字符串引起的字符串越界运行问题
摘要:本文讨论了Java中使用String.split()方法时常见的正则表达式转义问题。重点指出当使用"."分割字符串时,由于"."在正则中表示任意字符,会导致错误的分割结果。建议改用"\."或"\s+"进行分割,并配合trim()处理空格。文中通过"68"解析异常案例,分析了数组越界和数字格式异常的原因,强调正确处理分割符号和空白字符的重要性。最后推荐使用"\s+|\."进行分割以确保
2025-08-15 09:48:04
370
原创 [小练习]生成54张扑克牌,洗牌。
本文介绍了扑克牌游戏的Java实现方法,主要包含以下内容:1. 使用集合存储54张牌(13个数字×4种花色+大小王);2. 通过Cards类封装牌面值和花色,并实现Comparable接口进行排序;3. 采用Collections.shuffle()洗牌;4. 按顺序发牌给3个玩家并保留3张底牌;5. 使用数组优化牌面数字到文字的转换;6. 提出代码改进建议,如使用subList简化发牌逻辑、支持多玩家等。文章比较了两种实现方式:直接在类中实现比较和使用外部比较器+权重Map,并提供了参考代码链接。
2025-08-14 18:14:09
934
原创 [收藏向][小技巧]微软PowerRoys键盘快速重音表
微软QuickAccent插件可快速输入特殊字符,但操作繁琐需多次按键。文章整理了数字键、符号键和字母键对应的特殊字符输入方式,如数字键可输入上标、分数,符号键包含数学符号,字母键支持带变音符号的拉丁字母变体。作者吐槽该插件缺乏官方文档,输入过程较为痛苦。本文为伏琪撰写,更多内容可关注订阅号"伏琪"。
2025-08-13 20:17:21
447
原创 [盘点错误]在写TreeSet写重写比较函数时遇到的错误
Java中Comparable和Comparator的区别:Comparable是类内部实现(compareTo方法),定义自然排序;Comparator是外部实现(compare方法),支持多种排序规则。Comparable适用于单一排序场景(如String、Integer),Comparator则更灵活,可创建多个排序规则。典型用法:Comparable通过Collections.sort(list)调用,Comparator需传入实例(如new TreeSet<>(cmp))。开发时若需多
2025-08-13 19:53:27
712
原创 [盘点错误]为什么Set重新写了equals()和hashCode(),add()时还是会放两个一样的对象
Java中HashSet/HashMap调用equals()方法时需要注意方法签名的正确性。本文通过示例代码说明,当自定义类T的equals()方法签名错误(equals(T b))时,集合类实际调用的是Object.equals()而非自定义方法,导致两个相同对象被错误判定为不同。正确的做法是重写equals(Object obj)方法,并添加@Override注解。这是因为Java集合框架内部强制使用Object.equals()签名进行对象比较,其他重载版本不会被调用。正确修改后,集合能正常识别重复元
2025-08-12 15:53:03
143
原创 [盘点错误]方法不会覆盖或实现超类型的方法 @Override
Java中@Override的正确使用 本文介绍了Java中@Override注解的正确用法和常见错误。@Override用于表明方法覆盖父类或实现接口,编译器会检查方法签名是否正确。常见错误包括:方法签名不一致、拼写错误、试图覆盖final/static方法等。文章通过示例对比展示了正确与错误的写法,并提供了排查方法:检查父类方法是否存在、确认拼写、验证方法修饰符等。建议使用IDE的跳转功能来验证是否成功覆盖。
2025-08-12 15:16:39
779
原创 [盘点错误]加泛型<E>系列
本文总结了Java泛型中需要显式指定类型参数<Integer>的场景。主要内容包括:1.当编译器无法推断类型时(如空参数方法、链式调用中);2.构造泛型类实例时(Java7前需显式指定);3.继承泛型父类时;4.静态导入泛型方法时;5.方法引用/Lambda中需要显式指定的情况。核心原则是:当编译器能正确推断类型时可省略,否则必须显式指定。文章通过具体代码示例对比了必须写和可不写的场景,并提供了快速判断的实用规律。
2025-08-12 09:28:07
873
原创 [小技巧]重写equals()时,顺手重写hashCode()
本文通过Java代码示例说明了ArrayList.remove()方法失效的原因及解决方案。当尝试删除Student对象时,由于未重写equals()方法,导致new Student(1,0)被视为不同对象而删除失败。正确的做法是同时重写equals()和hashCode()方法,确保逻辑相等的对象具有相同的哈希值。文章强调这不仅是编码规范要求,更是为了避免在哈希集合中出现逻辑错误。最后给出了简单的hashCode()实现模板,并建议养成同时重写这两个方法的习惯,以预防未来可能出现的bug。
2025-08-11 15:46:43
509
原创 [收藏向]什么情况String类型不放常量池
Java中字符串常量池的存储规则摘要: 不会存入常量池的情况: 使用new String()创建的对象(存储在堆内存) 运行时拼接的非常量字符串(如变量拼接) StringBuilder/StringBuffer动态生成的字符串 未调用intern()方法的动态字符串 外部来源(文件/网络等)读取的字符串 会存入常量池的情况: 字符串字面量(如"hello") final修饰的常量表达式拼接 显式调用intern()方法的字符串 验证方法:通过==比较引用或使用intern()测试。运行
2025-08-11 15:30:42
1453
原创 一个怪程序让你理解static和final组合和分开的情况
② Sub.java③ FinalMethod.java编译运行把三个文件放在同一目录下:预期输出为什么子类能调用未覆盖的同名语句 调用的是子类 自己定义的那个 ,而不是父类 的同名方法。原因:父类的 是 ,对子类完全不可见,因此不存在“覆盖”关系。子类又写了一个 ,这只是一个恰好同名同参的新方法,与父类的 互不影响。通过 类型的引用 调用 时,编译器只会在 类里找可见的方法;父类的 版本根本不在候选列表里。所以:如果你把 向上转型
2025-08-08 17:47:31
327
原创 [收藏向]String类型与基本数据类型与包装类如何转换?
本文介绍了Java中基本数据类型与包装类、String之间的转换方法:1)基本类型与包装类通过valueOf()和xxxValue()实现装箱拆箱;2)String与基本类型使用parseXxx()方法转换;3)基本类型转String推荐valueOf();4)String与包装类转换应使用valueOf()而非构造器。文中提供了对照速记表,并指出转换时需注意NumberFormatException异常,布尔型仅"true"会解析为true。这些转换技巧对Java开发具有重要意义。
2025-08-07 20:19:57
233
原创 [盘点错误]错误: 无法将父类中的构造器 子类应用到给定类型;
【Java构造方法继承问题解析】 当子类继承父类时,若父类只有有参构造方法,子类构造方法必须显式调用父类的有参构造,否则编译器会报错。解决方法有两种:1)在子类构造方法中使用super()显式调用父类有参构造;2)为父类添加无参构造方法。Java规范规定,子类构造方法默认隐式调用父类无参构造,不会自动匹配有参构造。这种设计体现了Java"显式优于隐式"的哲学,避免编译器猜测参数值带来的不确定性。因此,父类若只有有参构造,子类必须显式调用super(参数)。
2025-08-07 19:17:09
360
原创 [盘点错误] 解析时已到达文件结尾
Java代码中类B缺少闭合括号导致编译错误。示例代码展示了抽象类A和子类B的正确继承关系,但因格式不规范难以发现语法问题。建议保持代码规整的书写格式,便于检查括号匹配等基础语法错误。作者伏琪提醒开发者注意代码规范,避免因小错误耗费大量调试时间。
2025-08-06 18:58:40
299
原创 初识接口,方法可以写到子类里,接口到底有什么用?
接口与抽象类的使用场景解析 本文通过支付系统案例对比了接口与抽象类的应用场景。直接实现支付方式会导致代码耦合,而使用Payment接口定义规范后,只需processPayment(Payment payment)即可处理所有支付类型,新增支付方式也无需修改原有代码。文章指出抽象类表示"is-a"关系(如Dog继承Animal),接口表示"can-do"关系(如Dog实现Pet),二者设计目的不同。同时强调使用Object处理多类型会导致类型爆炸、运行时错误等问题,而接
2025-08-06 15:31:32
868
原创 [收藏向]DecimalFormat格式化数据用法
Java的DecimalFormat类提供了灵活的数字格式化功能,支持保留小数位、千位分隔符、百分比等多种格式。通过模式符号如"#"(不补零)、"0"(补零)、","(千位分隔符)等,可以自定义输出样式。它还支持负数特殊格式(如财务常用的括号表示)和科学计数法。使用时需注意线程安全问题和本地化设置,可通过applyPattern方法动态修改格式。该工具类适合处理各种数字显示需求,是Java开发中常用的格式化工具。
2025-08-05 19:24:13
417
原创 [盘点错误]此处不允许使用修饰符private
本文解释了Java接口中变量定义的规则:接口中的变量默认是public static final的,即使不显式声明也会自动补全。因此不能用private或protected修饰接口变量,否则会编译报错。示例展示了合法和不合法的写法,并强调接口变量只能是public static final的。这一规则是Java接口设计的重要特性,开发者应注意遵守。
2025-08-05 16:29:13
216
原创 [盘点错误]找不到符号和参数列表不同
文章讲述了一个编程中的常见错误:编译器自动补全可能引入错误的包引用。作者提醒遇到问题时,应先检查是否被自动补全误导,而非怀疑自己写错。通过对比原本想调用的包和编译器补全的包,指出删除错误补全即可解决问题,否则会调用JDK中的同名包。文末附作者信息。
2025-08-05 10:59:11
239
原创 [盘点错误] 二元运算符 ‘+‘ 的操作数类型错误
Java字符串拼接时报错"二元运算符'+'的操作数类型错误"的分析与解决。当使用a.getClass()+''+a.toString()时,由于''是char类型,而getClass()返回Class<?>对象,Java无法自动将Class<?>转换为字符串与char拼接。解决方案是将''改为"",因为空字符串会触发Java的自动类型转换,使getClass()和toString()都能正确转换为字符串进行拼接。正确的写法是a.getClass
2025-08-04 15:02:02
312
原创 [盘点错误]类xxx是公共的, 应在名为 xxx.java 的文件中声明
Java文件命名规范问题:当类声明为public时,必须与文件名完全一致。示例中public class Ball需要保存在Ball.java文件中。解决方案:1) 将文件重命名为Ball.java;2) 或去掉Ball类的public修饰符。一个Java文件只能有一个public类,且非public类数量不限。这是Java语言的基本编译规则,违反会导致"类应在对应文件中声明"的错误提示。
2025-08-04 14:54:00
403
原创 [收藏向]format格式化日期语法
Java日期时间格式化示例代码,展示了各种格式符的使用方法。包括日期部分(%tc完整日期、%tB月份全称等)、时间部分(%tH24小时制、%tM分钟等)和综合格式(%tF ISO日期、%tT 24小时制时间等)。代码使用String.format()方法配合Locale.CHINA进行中文环境格式化,并输出当前时间的各种格式表示。虽然示例使用java.util.Date类,但建议在实际开发中使用Java 8+的java.time包(如LocalDateTime和DateTimeFormatter),以获得更
2025-08-04 09:33:54
386
原创 [错误盘点]无法从静态上下文中引用非静态 变量 this
的,这在 Java 中是允许的(内部类可以继承私有类),但会导致。在子类加一个static就可以。关注伏琪订阅号了解更多。事情起因是我写了这样的代码。
2025-07-31 14:39:45
131
原创 为什么在代码块声明类对象不报错?
原因是:实例块不报错:实例初始化块在“每次创建对象”时都会执行,位置在“调用父类构造器”之后、“本类构造代码”之前。在块里再new Test()完全合法,只是会产生递归:这次new→ 进入新对象的实例块 → 再new Test()→ …如果没有任何终止条件,最终是,但它属于运行时错误,编译器不会提前报错。静态块不报错:静态代码块属于“类的初始化”阶段,发生在main要运行,必须先初始化Test此时,静态字段()已经分配好内存并给了默认值(0)。因此在静态块里执行new Test()
2025-07-30 17:50:07
287
原创 [盘点错误]系统执行student[i].name==name时返回0
摘要:作者伏琪分享了一个Java编程中常见的字符串比较问题。在代码中使用"=="比较字符串导致if语句不执行,因为"=="比较的是对象引用而非内容。正确做法是使用equals()方法比较字符串内容。通过将"a[i].name==temp"改为"a[i].name.equals(temp)"解决了问题。文章提醒开发者注意字符串比较的正确方法,避免类似错误。
2025-07-30 11:37:45
159
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅