Questions tagged «java»

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

2
如何安全地复制收藏集?
过去,我曾说过要安全地复制集合,请执行以下操作: public static void doThing(List<String> strs) { List<String> newStrs = new ArrayList<>(strs); 要么 public static void doThing(NavigableSet<String> strs) { NavigableSet<String> newStrs = new TreeSet<>(strs); 但是,这些“复制”构造函数,类似的静态创建方法和流是否真的安全?在哪里指定规则?所谓安全,是指Java语言和针对恶意调用者强制执行的集合提供的基本语义完整性保证,并假设有合理的支持SecurityManager且没有缺陷。 我很高兴与方法投掷ConcurrentModificationException,NullPointerException,IllegalArgumentException,ClassCastException,等,或者甚至挂起。 我选择String了一个不可变类型参数的示例。对于这个问题,我对具有自己陷阱的可变类型集合的深层副本不感兴趣。 (很明显,我已经看过了OpenJDK的源代码,并有某种形式的答案为ArrayList和TreeSet。)

2
尽管使用了WeakHashMap,但仍发生OutOfMemoryException
如果不调用System.gc(),系统将抛出OutOfMemoryException。我不知道为什么需要System.gc()显式呼叫;JVM应该gc()自称对吧?请指教。 以下是我的测试代码: public static void main(String[] args) throws InterruptedException { WeakHashMap<String, int[]> hm = new WeakHashMap<>(); int i = 0; while(true) { Thread.sleep(1000); i++; String key = new String(new Integer(i).toString()); System.out.println(String.format("add new element %d", i)); hm.put(key, new int[1024 * 10000]); key = null; //System.gc(); } } 如下所示,添加-XX:+PrintGCDetails以打印出GC信息;如您所见,实际上,JVM尝试执行完整的GC运行,但是失败;我仍然不知道原因。如果我取消注释该System.gc();行,结果是肯定的,这很奇怪: add new element …

2
如何避免有关原始类型的代码重复?
背景 位输入流由字节数组支持。有几种方法可以从该字节数组读取各种强制的原始数组。 问题 有重复的代码。Java缺少原始类型的泛型,因此重复是不可避免的。 码 重复的代码在以下方法中显而易见: @Override public long readBytes(final byte[] out, final int offset, final int count, final int bits) { final int total = offset + count; assert out != null; assert total <= out.length; final long startPosition = position(); for (int i = offset; i < total; …

1
ViewModel状态的ViewPager2 / Tabs问题
我正在遵循MVVM模式-意味着每个片段都有一个ViewModel。 我使用ViewPager2 添加了两个选项卡。 我的适配器如下所示: @Override public Fragment createFragment(int position) { switch (position) { case 0: return new MergedItemsFragment(); case 1: return new ValidatedMergedItemsFragment(); } return new MergedItemsFragment(); } 选项卡正在工作。但是,我注意到我的MergedItemsFragment的ViewModel行为异常。在添加选项卡之前,我像这样导航到片段: NavHostFragment.findNavController(this).navigate(R.id.action_roomFragment_to_itemsFragment); 当我将该片段留给NavHostFragment.findNavController(this).popBackStack()以后再返回该片段时,我将得到一个新的空ViewModel。这是有意的。 使用新方法,我正在使用return new MergedItemsFragment()。当我离开该片段并稍后返回时,我得到一个包含旧数据的ViewModel 。这是一个问题,因为旧数据不再相关,因为用户在另一个片段中选择了不同的数据。 更新#1 我意识到他实际上将所有旧的Fragments保留在内存中,因为同一打印语句被多次调用。它的调用时间随着我离开并返回该屏幕的次数而增加。因此,如果我离开并返回10次并旋转设备,他实际上将执行10次一行。有人猜测如何以与ViewModels一起使用的方式来实现带有导航组件的Tabs / ViewPagers吗? 更新#2 我将ViewModels设置如下: viewModel = new ViewModelProvider(this, providerFactory).get(MergedItemViewModel.class) 我得到相同的结果: viewModel = ViewModelProviders.of(this).get(MergedItemViewModel.class); …

3
JMS消息侦听器调用程序失败,原因:标识符包含无效的JMS标识符字符“-”:“ x-request-id”
我是第一次使用JMS和队列(Azure队列)。我需要做一个队列,Rubi服务器将在其中写入一些数据,而Java将从队列中读取数据并将进行进一步的执行。此过程在我的计算机上本地正常运行。我创建了一个REST端点,该端点将数据写入队列中,一旦将数据写入队列中,侦听器将接管并读取数据并执行。当我们将其部署到Azure时,我在日志中看到的错误是不允许队列启动 Setup of JMS message listener invoker failed for destination 'queue' - trying to recover. Cause: Identifier contains invalid JMS identifier character '-': 'x-request-id' Zipkin还作为分布式跟踪系统出现在Azure服务器上,我想这x-request-id与Zipkin有关,后者正在造成问题。我已经在Google上搜索了此问题,但不知道为什么会这样。 以下是详细的错误消息: [36mc.m.s.l.NextGenRequestLoggingFilter [0;39m [2m:[0;39m Before request [uri=/services/deal-service/api/v2/deals/ack;headers= [x-request-id:"2d8d86d7-4fbf-9db6-8e95-28813f21a85c", x-envoy-internal:"true", x-b3-parentspanid:"a209cdc649b0b890", content- length:"575", x-forwarded-proto:"http", postman-token:"ad074595- 76a5-474b-9711-7e071b12b3b0", x-b3-sampled:"1", x-forwarded- for:"10.244.2.1", accept:"*/*", authorization: "some-token-YJc4tg--34jPRziJNSACqNQ", x-b3- traceid:"6b40ff22781be67ba209cdc649b0b890", x-b3- spanid:"702684ddb62cfe6b", …

1
removeIf实现细节
我有一个小的实施细节问题,我在中无法理解ArrayList::removeIf。我认为我不能简单地将它放在没有任何先决条件的情况下。 如此:实现基本是散装 remove,不像ArrayList::remove。一个例子应该使事情更容易理解。假设我有以下列表: List<Integer> list = new ArrayList<>(); // 2, 4, 6, 5, 5 list.add(2); list.add(4); list.add(6); list.add(5); list.add(5); 我想删除所有偶数元素。我可以做: Iterator<Integer> iter = list.iterator(); while (iter.hasNext()) { int elem = iter.next(); if (elem % 2 == 0) { iter.remove(); } } 或: list.removeIf(x -> x % 2 == 0); 结果将是相同的,但是实现是非常不同的。由于iterator是的视图,因此ArrayList每次调用时remove,ArrayList都必须将基础层置于“良好”状态,这意味着内部数组实际上会发生变化。同样,每次调用时remove,都会在System::arrayCopy内部进行调用。 …
9 java  java-8  iterator 

2
用Java重写的JavaScript函数产生不同的结果
我正在尝试用Java重写以下Javascript函数: function normalizeHash(encondindRound2) { if (encondindRound2 < 0) { encondindRound2 = (encondindRound2 & 0x7fffffff) + 0x80000000; } return encondindRound2 % 1E6; } 我的Java适应: public long normalizeHash(long encondindRound2) { if (encondindRound2 < 0) { encondindRound2 = (((int) encondindRound2) & 0x7fffffff) + 0x80000000; } return (((int) encondindRound2) % 1_000_000); } 当我通过时-1954896768,Javascript版本返回70528,而Java返回-896768。我不知道为什么。区别似乎始于if条件:在if后面的Javascript函数中encodingRound2 = …

2
找不到Synology Scheduler .sh Java命令
我有一个bash脚本,那就是唯一的任务就是执行一个jar文件。 短信 java -jar /volume1/homes/jar/smssender.jar 使用Synology NAS设置任务。 添加命令以执行bash脚本。添加日志输出。 执行我的新任务。 检查日志以查看以下错误: /volume1/homes/jar/sms.sh:第1行:java:找不到命令 检查Java版本/安装: 手动检查sh脚本的执行(有效): 有人遇到同样的奇怪情况吗?任何解决方法/想法? 我试过了 重新启动我的NAS 卸载/安装Java8软件包 但没有一个有效。
9 java  bash  synology 

5
基本的Spring Boot应用程序无法正常工作,显示:无法刷新来自进程xxxx的实时数据
我是春季靴的初学者。我初始化了一个新项目并尝试运行它,但是它无法成功运行。当我将其作为spring boot应用程序运行时,它开始执行。在底部的编译器/状态栏中,它显示处理和重试。它最多上升10次并引发以下错误: 无法刷新来自进程xxxx的实时数据 在这里更多细节 TanmayTestApplication.java package com.example.tanmay_test; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class TanmayTestApplication { public static void main(String[] args) { SpringApplication.run(TanmayTestApplication.class, args); } } DemoControler.java package com.example.cntr; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RequestMapping; @RestController public class DemoControler { @RequestMapping(path = "/index") public String index() { return "By Tanmay!"; } } …

3
Java Stream:过滤多个范围
我正在尝试过滤资源并基于字段排除一些元素。要排除,我有一个集合(其中包含一个需要排除的ID)和一个列表(其中包含多个范围的需要排除的ID)。我写了下面的逻辑,但对第二个过滤器逻辑不满意。有没有更好的方法可以用Java 8做到这一点?对于包含范围,我也需要这样做。 Set<String> extensionsToExclude = new HashSet<>(Arrays.asList("20","25","60","900")); List<String> rangesToExclude = new ArrayList<>(Arrays.asList("1-10","20-25","50-70","1000-1000000")); return directoryRecords.stream() .filter((directoryRecord) -> !extensionsToExclude.contains(directoryRecord.getExtensionNumber())) .filter((directoryRecord -> { Boolean include = true; for(String s : rangesToExclude) { String [] rangeArray = s.split("-"); Integer extension = Integer.parseInt(directoryRecord.getExtensionNumber()); if(extension <= Integer.parseInt(rangeArray[0]) && extension >= Integer.parseInt(rangeArray[1])) { include = false; } …

2
WebView何时准备好使用snapshot()?
JavaFX的文档状态,一个WebView当准备Worker.State.SUCCEEDED达到但是,除非你稍等片刻(即Animation,Transition,PauseTransition等等),一个空白页面的呈现方式。 这表明在WebView内部发生了一个事件,准备将其捕获,但这是什么? GitHub上SwingFXUtils.fromFXImage有7,000多个使用的代码片段,但其中大多数似乎与无关WebView,是交互式的(人为掩盖种族条件)或使用任意的Transitions(从100ms到2,000ms的任何地方)。 我试过了: 在的尺寸changed(...)范围内进行监听WebView(height和width属性DoubleProperty实现ObservableValue,可以监视这些东西) 🚫不可行。有时,该值似乎与绘制例程分开更改,从而导致部分内容。 盲目地告诉runLater(...)FX应用程序线程上的所有内容。 techniques许多技术都使用此方法,但是我自己的单元测试(以及其他开发人员的一些反馈)解释说,事件通常已经在正确的线程上,并且此调用是多余的。我能想到的最好的办法就是通过排队,对某些人起作用而增加了足够的延迟。 将DOM侦听器/触发器或JavaScript侦听器/触发器添加到 WebView despite SUCCEEDED尽管捕获了空白,但在调用JavaScript和DOM时似乎都正确加载了。DOM / JavaScript侦听器似乎无济于事。 使用Animation或Transition来有效地“休眠”而不会阻塞主FX线程。 This️这种方法行之有效,如果延迟足够长,则可以产生高达100%的单元测试,但是过渡时间似乎是我们猜测和设计不佳的未来时刻。对于高性能或关键任务应用程序,这迫使程序员在速度或可靠性之间进行权衡,这两者都是用户的潜在不良体验。 什么时候可以打电话WebView.snapshot(...)? 用法: SnapshotRaceCondition.initialize(); BufferedImage bufferedImage = SnapshotRaceCondition.capture("<html style='background-color: red;'><h1>TEST</h1></html>"); /** * Notes: * - The color is to observe the otherwise non-obvious cropping that occurs * with some techniques, such as `setPrefWidth`, `autosize`, etc. …

2
为什么EnumMap不是Java中的SortedMap?
EnumMap<K extends Enum<K>, V> Java中的Java显然是按相关枚举的定义排序的,正如您在Javadoc中也可以看到的那样: 枚举映射按其键的自然顺序(声明枚举常量的顺序)进行维护。这反映在集合视图返回的迭代器中(keySet(),entrySet(),和values())。 我需要的是SortedMap使用枚举作为键类型。我想使用诸如headMap()或的方法firstKey(),但是我想从的cpu +内存性能中受益EnumMap s的。一个TreeMap听起来像是太多的开销在这里。 问题:这只是在实现中遗漏了吗?AbstractMap是懒惰(源自)还是有充分的理由为什么EnumMap不是SortedMap?

1
用反射打破JIT优化
当为高度并发的单例类研究单元测试时,我偶然发现了以下奇怪的行为(在JDK 1.8.0_162上进行了测试): private static class SingletonClass { static final SingletonClass INSTANCE = new SingletonClass(0); final int value; static SingletonClass getInstance() { return INSTANCE; } SingletonClass(int value) { this.value = value; } } public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { System.out.println(SingletonClass.getInstance().value); // 0 // Change the instance to a …

4
使用Java流从员工列表中获取在特定加入日期之前和之后的员工
我List的Employees的不同加入日期。我想在使用流从List加入特定日期之前和之后获取员工。 我尝试下面的代码, List<Employee> employeeListAfter = employeeList.stream() .filter(e -> e.joiningDate.isAfter(specificDate)) .collect(Collectors.toList()); List<Employee> employeeListBefore = employeeList.stream() .filter(e -> e.joiningDate.isBefore(specificDate)) .collect(Collectors.toList()); class Employee{ int id; String name; LocalDate joiningDate; } 有没有办法在单个流中做到这一点?

5
如何为每个请求项创建多个线程
我正在尝试在订单级别使用多线程处理以下代码。 List<String> orders = Arrays.asList("order1", "order2", "order3", "order4", "order1"); 当前顺序执行: orders.stream().forEach(order -> { rules.forEach(rule -> { finalList.add(beanMapper.getBean(rule) .applyRule(createTemplate.apply(getMetaData.apply(rule), command), order)); }); }); 我尝试使用: orders.parallelStream().forEach(order -> {}} // code snippet. 但是它正在更改rules.forEach(rule-> {}}的顺序。 例如: 输入: List<String> orders = Arrays.asList("order1", "order2", "order3", "order4", "order1"); List<String> rules = Arrays.asList("rule1", "rule2", "rule3"); 预期产量: order1 with …

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.