Questions tagged «java»

Java是一种流行的高级编程语言。如果您在使用或理解语言本身时遇到问题,请使用此标签。这个标签很少单独使用,最常与[spring],[spring-boot],[jakarta-ee],[android],[javafx],[gradle]和[maven]结合使用。

4
为什么在编译时不检查lambda返回类型?
使用的方法引用具有返回类型Integer。但是String在下面的示例中,允许不兼容。 如何解决方法with声明以确保方法引用类型安全而无需手动强制转换? import java.util.function.Function; public class MinimalExample { static public class Builder<T> { final Class<T> clazz; Builder(Class<T> clazz) { this.clazz = clazz; } static <T> Builder<T> of(Class<T> clazz) { return new Builder<T>(clazz); } <R> Builder<T> with(Function<T, R> getter, R returnValue) { return null; //TODO } } static public interface MyInterface …

3
中级流操作未按计数进行评估
似乎我很难理解Java如何将流操作组合到流管道中。 执行以下代码时 public static void main(String[] args) { StringBuilder sb = new StringBuilder(); var count = Stream.of(new String[]{"1", "2", "3", "4"}) .map(sb::append) .count(); System.out.println(count); System.out.println(sb.toString()); } 控制台仅打印4。该StringBuilder对象仍然具有价值""。 当我添加过滤器操作时: filter(s -> true) public static void main(String[] args) { StringBuilder sb = new StringBuilder(); var count = Stream.of(new String[]{"1", "2", "3", "4"}) …
33 java  java-stream 

6
您是否应该在生产代码中使用assert语句断言不为null?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便可以通过编辑此帖子以事实和引文回答。 上个月关闭。 我已经看到了这个问题,但是关于assert关键字的用法还有其他一些问题。我正在和其他一些编码员讨论使用assert。对于此用例,有一种方法可以在满足某些先决条件的情况下返回null。我编写的代码调用该方法,然后断言它不会返回null,并继续使用返回的对象。 例: class CustomObject { private Object object; @Nullable public Object getObject() { return (object == null) ? generateObject() : object; } } 现在想象一下我是这样使用它的: public void useObject(CustomObject customObject) { object = customObject.getObject(); assert object != null; // Do stuff using object, which would throw a NPE if …
32 java  assert  nullable 

4
<和有什么区别?扩展Base>和<T扩展Base>?
在此示例中: import java.util.*; public class Example { static void doesntCompile(Map&lt;Integer, List&lt;? extends Number&gt;&gt; map) {} static &lt;T extends Number&gt; void compiles(Map&lt;Integer, List&lt;T&gt;&gt; map) {} static void function(List&lt;? extends Number&gt; outer) { doesntCompile(new HashMap&lt;Integer, List&lt;Integer&gt;&gt;()); compiles(new HashMap&lt;Integer, List&lt;Integer&gt;&gt;()); } } doesntCompile() 无法编译为: Example.java:9: error: incompatible types: HashMap&lt;Integer,List&lt;Integer&gt;&gt; cannot be converted to …

1
HashSet代码的意外运行时间
因此,最初,我有以下代码: import java.util.*; public class sandbox { public static void main(String[] args) { HashSet&lt;Integer&gt; hashSet = new HashSet&lt;&gt;(); for (int i = 0; i &lt; 100_000; i++) { hashSet.add(i); } long start = System.currentTimeMillis(); for (int i = 0; i &lt; 100_000; i++) { for (Integer val : hashSet) { …

5
如何避免重复代码初始化hashmap的hashmap?
每个客户都有一个ID,以及许多带有日期的发票,这些日期按ID存储为客户的Hashmap,即按日期的发票哈希图: HashMap&lt;LocalDateTime, Invoice&gt; allInvoices = allInvoicesAllClients.get(id); if(allInvoices!=null){ allInvoices.put(date, invoice); //&lt;---REPEATED CODE }else{ allInvoices = new HashMap&lt;&gt;(); allInvoices.put(date, invoice); //&lt;---REPEATED CODE allInvoicesAllClients.put(id, allInvoices); } Java解决方案似乎是要使用的getOrDefault: HashMap&lt;LocalDateTime, Invoice&gt; allInvoices = allInvoicesAllClients.getOrDefault( id, new HashMap&lt;LocalDateTime, Invoice&gt; (){{ put(date, invoice); }} ); 但是,如果get不为null,我仍然希望执行put(日期,发票),并且仍然需要将数据添加到“ allInvoicesAllClients”。因此,它似乎并没有太大帮助。
27 java  java-8  hashmap 

1
没有静态方法元工厂
我的应用程序有一个问题,当我登录时,该应用程序崩溃并且出现错误: java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; in class Ljava/lang/invoke/LambdaMetafactory; or its super classes (declaration of 'java.lang.invoke.LambdaMetafactory' appears in /apex/com.android.runtime/javalib/core-oj.jar) at okhttp3.internal.Util.&lt;clinit&gt;(Util.java:87) at okhttp3.internal.Util.skipLeadingAsciiWhitespace(Util.java:321) at okhttp3.HttpUrl$Builder.parse(HttpUrl.java:1313) at okhttp3.HttpUrl.get(HttpUrl.java:917) at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:492) at com.example.usub.Remote.RetrofitClient.getClient(RetrofitClient.java:14) at com.example.usub.Common.Common.getGoogleAPI(Common.java:10) at com.example.usub.Welcome.onCreate(Welcome.java:208) at android.app.Activity.performCreate(Activity.java:7825) at android.app.Activity.performCreate(Activity.java:7814) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) at …
26 java  android 

4
自动拆箱需要三元if-else
这段代码可以正常工作:- Integer nullInt = null; if (1 &lt;= 3) { Integer secondNull = nullInt; } else { Integer secondNull = -1; } System.out.println("done"); 但这会引发空指针异常,而Eclipse警告需要自动拆箱:- Integer nullInt = null; Integer secondNull = 1 &lt;= 3 ? nullInt : -1; System.out.println("done"); 为什么会这样,请有人指导吗?

5
应用程序速度慢,频繁的JVM因单CPU设置和Java 12+而挂起
我们有一个客户应用程序(经过10多年的发展)。其JDK最近从OpenJDK 11升级到OpenJDK 14。与Java 11相比,在单CPU(禁用超线程)的Windows 10设置(以及仅具有一个可用CPU的VirtualBox机器中)中,应用程序启动速度非常慢。此外,该应用程序大多数时候都使用100%CPU。我们还可以通过将处理器关联性设置为仅一个CPU(c:\windows\system32\cmd.exe /C start /affinity 1 ...)。 在VirtualBox机器上启动应用程序并以最少的手动交互进行查询的一些测量: OpenJDK 11.0.2:36秒 OpenJDK 13.0.2:〜1.5分钟 OpenJDK 13.0.2与 -XX:-UseBiasedLocking:46秒 OpenJDK 13.0.2与 -XX:-ThreadLocalHandshakes:40秒 OpenJDK 14:5-6分钟 OpenJDK 14与 -XX:-UseBiasedLocking:3-3.5分钟 OpenJDK 15 EA Build 20:约4.5分钟 仅更改了使用的JDK(以及上述选项)。(-XX:-ThreadLocalHandshakes在Java 14中不可用。) 我们已经尝试记录JDK 14的功能-Xlog:all=debug:file=app.txt:uptime,tid,level,tags:filecount=50。 使用OpenJDK 11.0.2每秒计数日志行似乎相当平稳: $ cat jdk11-log/app* | grep "^\[" | cut -d. -f 1 | cut …
23 java  hang  java-14 

1
为什么不使用自定义比较器从TreeSet中删除,则会删除较大的项集?
同时使用Java 8和Java 11,将以下内容TreeSet与String::compareToIgnoreCase比较器一起考虑: final Set&lt;String&gt; languages = new TreeSet&lt;&gt;(String::compareToIgnoreCase); languages.add("java"); languages.add("c++"); languages.add("python"); System.out.println(languages); // [c++, java, python] 当我尝试删除中存在的确切元素时TreeSet,它起作用:所有指定的元素均被删除: languages.removeAll(Arrays.asList("PYTHON", "C++")); System.out.println(languages); // [java] 但是,如果我尝试删除的内容超过了中的所有内容TreeSet,则该调用根本不会删除任何内容(这不是后续调用,而是被调用了,而不是上面的代码段): languages.removeAll(Arrays.asList("PYTHON", "C++", "LISP")); System.out.println(languages); // [c++, java, python] 我究竟做错了什么?为什么会这样呢? 编辑:String::compareToIgnoreCase是有效的比较器: (l, r) -&gt; l.compareToIgnoreCase(r)

3
什么是java.security.egd选项?
在我正在处理的项目中,该应用程序是使用类似于以下命令的启动的: java -Djava.security.egd=file:/dev/urandom -jar app.jar 我从未见过该java.security.egd选项。进行一点搜索,似乎可以用来配置Java应用程序中的随机数生成。 这样对吗?应该什么时候使用?
22 java  jvm 

7
如何在Java 8中创建阻止后台加载程序?
题 如何在Java 8中创建合适的后台加载程序?条件: 数据应在后台加载 加载后应显示数据 加载数据时,不应接受其他任何请求 如果在加载数据时有请求,则应在某个超时(例如5秒)后安排另一次加载 目的是例如使重载请求被接受,但数据库不被请求所淹没。 MCVE 这是MCVE。它由一个后台任务组成,该任务通过简单地调用Thread.sleep 2秒钟来模拟加载。每秒安排一次任务,这自然会导致后台加载任务重叠,应避免。 public class LoadInBackgroundExample { /** * A simple background task which should perform the data loading operation. In this minimal example it simply invokes Thread.sleep */ public static class BackgroundTask implements Runnable { private int id; public BackgroundTask(int id) …

1
Spring中的作用域代理是什么?
正如我们所知道Spring使用代理来增加功能(@Transactional和@Scheduled举例)。有两种选择-使用JDK动态代理(该类必须实现非空接口),或使用CGLIB代码生成器生成子类。我一直认为proxyMode允许我在JDK动态代理和CGLIB之间进行选择。 但是我能够创建一个示例,说明我的假设是错误的: 情况1: 单身人士: @Service public class MyBeanA { @Autowired private MyBeanB myBeanB; public void foo() { System.out.println(myBeanB.getCounter()); } public MyBeanB getMyBeanB() { return myBeanB; } } 原型: @Service @Scope(value = "prototype") public class MyBeanB { private static final AtomicLong COUNTER = new AtomicLong(0); private Long index; public MyBeanB() { …

2
定义记录的默认构造函数
我有一条记录,想要向其添加默认构造函数。 public record Record(int recordId) { public Record{ } } 但是它创建了带有int参数的构造函数。 public final class Record extends java.lang.Record{ private final int recordId; public Record(int); //other method } 我们如何向记录添加默认构造函数?

1
Paths.get与Path.of
据我所知,Paths.get并且Path.of似乎做着完全相同的事情,是将一个或多个字符串变成一个Path对象。文档https://docs.oracle.com/javase/8/docs/api/java/nio/file/Paths.html#get-java.lang.String-java.lang.String...-和https: //docs.oracle.com/zh-CN/java/javase/13/docs/api/java.base/java/nio/file/Path.html#of(java.lang.String,java.lang.String ... )使用相同的措词。它们实际上是否相同? Path.of稍后介绍。猜想:引入它是为了保持一致的Foo.of样式。在那种情况下,从一致性/美学角度考虑是否更可取?
20 java  java-11 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.