在Java的String类中,trim方法包含:
int off = offset; /* avoid getfield opcode */
char[] val = value; /* avoid getfield opcode */
Run Code Online (Sandbox Code Playgroud)
我对评论"避免getfield操作码"感到有些困惑......
这是什么意思?(我认为这可以避免在字节码中使用getfield,但为什么这是一个Good Thing [TM]?)
难道是防止万一对象创建微调不会做任何事情(因此该返回)或?
请注意,我真的在寻找我的问题的答案.我不是在寻找一些源代码或一些学术论文的链接:我已经使用了源代码,我已经阅读了论文,但仍然没有弄清楚这个问题的最后部分......
我正在研究一些快速屏幕字体OCRing,我正在取得很好的进展.
我已经找到了基线,将角色分开,将每个角色转换为黑白,然后对每个角色进行轮廓处理,以便将Freeman链码应用于它.
基本上它是一个8连接的链码,看起来像这样:
3 2 1
\ | /
4-- --0
/ | \
5 6 7
Run Code Online (Sandbox Code Playgroud)
所以,如果我有一个'a',经过我所有的转换(包括转换为黑白),我最终会得到这样的结果:
11110
00001
01111
10001
10001
01110
Run Code Online (Sandbox Code Playgroud)
然后它的外部计数可能看起来像这样(我可能在这里犯了一个错误,这是ASCII艺术轮廓,我的'算法'可能会使轮廓错误,但这不是我的问题点):
XXXX
X1111X
XXXX1X
X01111X
X10001X
X10001X
X111X
XXX
Run Code Online (Sandbox Code Playgroud)
在Xs之后,我得到了链码,它将是:
0011222334445656677
请注意,这是规范化的链代码,但您始终可以将链式代码规范化,如下所示:您只需保留最小的整数.
(顺便说一句,有一个超级高效的实现来找到链代码,你只需要取一个'X'的8个相邻像素,然后查看256查找表,如果你有0,1,2,3,4, 5,6或7)
不过,我现在的问题是:从那个0011222334445656677链码开始,我怎么发现我有'a'?
因为,例如,如果我的'a'看起来像这样:
11110
00001
01111
10001
10001
01111 <-- This pixel is now full
Run Code Online (Sandbox Code Playgroud)
然后我的链码现在是:0002222334445656677
然而,这也是一个'a'.
我知道这些链代码的重点是能够适应这些微小的变化,但我无法弄清楚我应该如何找到哪个字符对应于一个链代码.
我已经走得那么远了,现在我被卡住了......
(顺便说一下,我不需要100%的效率,将"0"与"O"或"o"区分开来的事情并不是真正的问题)
如何为Java实现并发快速排序或合并排序算法?
我们在16-(虚拟) - 核心Mac上遇到了问题,其中只有一个核心(!)使用默认的Java排序算法工作,并且很好地看到非常好的机器完全未被充分利用.所以我们写了自己的(我写的),我们确实获得了很好的加速(我编写了一个多线程的快速排序,由于它的分区性质,它很好地并行化,但我也可以编写一个mergesort)...但是我的实现只能扩展最多4个线程,它是专有代码,我宁愿使用来自信誉良好的源代码而不是使用我重新发明的轮子.
我在Web上找到的唯一一个例子是如何不用 Java编写多线程快速排序,它使用的是繁忙循环(这非常糟糕):
while (helpRequested) { }
Run Code Online (Sandbox Code Playgroud)
http://broadcast.oreilly.com/2009/06/may-column-multithreaded-algor.html
因此,除了无缘无故地丢失一个线程之外,它确保通过在while循环中忙碌循环来杀死perf(这是令人难以置信的).
因此我的问题是:您是否知道Java中正确的多线程快速排序或mergesort实现将来自信誉良好的来源?
我强调的事实是,我知道复杂性保持为O(n log n),但我仍然非常喜欢看到所有这些核心开始工作而不是空闲.请注意,对于其他任务,在相同的16个虚拟核心Mac上,我通过并行化代码看到了高达x7的加速(我并不意味着并发专家).
所以即使很难复杂性保持O(n log n),我也非常欣赏x7或x8甚至x16加速.
想象一下,我在Emacs下打开的文本文件中有以下内容:
some 34
word 30
another 38
thing 59
to 39
say 10
here 47
Run Code Online (Sandbox Code Playgroud)
我想变成这个,每个2位数字加1:
some 35
word 31
another 39
thing 60
to 40
say 11
here 48
Run Code Online (Sandbox Code Playgroud)
(这是一个简短的例子,我的实际需要是一个更大的列表,而不是我的电话)
我怎么能从Emacs做到这一点?
只要直接从Emacs进行调用并且仅在我想要的标记区域上操作,我不介意调用一些外部Perl/sed /任何魔法.
你会如何从Emacs自动化这个?
我认为我正在考虑的答案包括调用shell-command-on-region并用输出替换该区域......但我不确定如何具体地执行此操作.
在Java中,"二进制代码"是否与"Java字节码"相同?
这是Java中的流程吗?
Java文件(.java) - > [javac] - > ByteCode文件(.class) - > [JVM/Java解释器] - >运行它(首先将其转换为特定于机器的二进制代码)
谢谢!
我不是在寻找通常的"你只能使用System.gc()来回答Java中的GC ",这个问题根本不是什么.
我的问题不是主观的,而是基于现实:GC 可以用Java来强制实现.我们每天使用的许多程序都是这样做的:IntelliJ IDEA,NetBeans,VisualVM.
它们都可以强制 GC发生.
怎么做?
我认为他们都使用JVMTI,更具体地说是ForceGarbageCollection(注意"Force"),但我怎么能为自己尝试呢?
http://java.sun.com/javase/6/docs/platform/jvmti/jvmti.html#ForceGarbageCollection
还要注意,这个问题不是关于"为什么"我想要这样做:"为什么"可能是"好奇心"或"我们正在编写类似于VisualVM的程序"等.
问题是"你如何使用JVMTI的ForceGarbageCollection强制GC"?
是否需要使用任何特殊参数启动JVM?
是否需要任何JNI?如果是这样,究竟是什么代码?
它只适用于Sun VM吗?
任何完整和可编辑的例子都是最受欢迎的.
我想从源BufferedImage到目的地复制(矩形区域)ARGB值BufferedImage.不应该进行合成:如果我复制ARGB值为0x8000BE50(alpha值为128)的像素,则目标像素必须精确为 0x8000BE50,完全覆盖目标像素.
我有一个非常精确的问题,我做了一个单元测试来展示我需要的东西.单元测试功能齐全,设备齐全,传递良好,正是我想要的.
但是,我想要一种更快,更有效的内存方法来替换copySrcIntoDstAt(...).
这就是我的问题的全部要点:我不是在追求如何以更快的方式"填充"图像(我所做的仅仅是进行单元测试的一个例子).我想要的只是知道什么是快速和内存有效的方法(即快速而不是创建不必要的对象).
我所做的概念验证实现显然非常节省内存,但速度很慢(每个像素执行一次getRGB和一次setRGB).
原理上,我有这样的:(其中A表示复制前目标图像的相应像素)
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
Run Code Online (Sandbox Code Playgroud)
我希望有这个:
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAABBBBAAA
AAAAAAAAAAAAABBBBAAA
AAAAAAAAAAAAAAAAAAAA
Run Code Online (Sandbox Code Playgroud)
其中'B'代表src图像中的像素.
请注意,我正在寻找copySrcIntoDstAt(...)方法的完全替代,而不是API链接/引用.
import org.junit.Test;
import java.awt.image.BufferedImage;
import static org.junit.Assert.*;
public class TestCopy {
private static final int COL1 = 0x8000BE50; // alpha at 128
private static final int COL2 = 0x1732FE87; // alpha at 23
@Test
public void testPixelsCopy() {
final …Run Code Online (Sandbox Code Playgroud) 编辑二
为了防止讽刺评论和单行答案错过了重点:IFF它就像调用setDoubleBuffered(true)一样简单,那么如何才能访问当前的离线缓冲区以便我可以开始搞乱BufferedImage的底层像素数据缓冲区呢?
我花时间写了一段正在运行的代码(看起来也很有趣)所以我真的很感激答案实际上回答(多么令人震惊;)我的问题并解释这是什么/如何工作而不是单行和snarky评论 ;)
这是一段可以在JFrame上反弹的代码.我想知道可以用来转换这段代码的各种方法,以便它使用双缓冲.
请注意,我清除屏幕和重绘方块的方式并不是最有效的,但这实际上不是这个问题的关键(在某种程度上,为了这个例子它更好,它有点慢).
基本上,我需要不断修改BufferedImage中的很多像素(因为有某种动画),我不希望看到由于屏幕上的单缓冲而产生的视觉伪像.
我有一个JLabel,其Icon是一个包装BufferedImage的ImageIcon.我想修改那个BufferedImage.
必须做什么才能使其成为双缓冲?
据我所知,当我在"图像2"上画画时,会以某种方式显示"图像1 ".但是,那么一旦我做借鉴"图像2",我该如何"迅速"替换"图像1"的"图像2"?
这是我应该手动做的事情,比如说,自己交换JLabel的ImageIcon吗?
我应该总是绘制相同的BufferedImage,然后在JLabel的ImageIcon的BufferedImage中快速'blit'的BufferedImage像素?(我猜不是,我不知道我怎么能用显示器的"垂直空白线"[或平板屏幕中的等效物]"同步"这个:我的意思是'同步'而不会干扰显示器本身刷新它的时刻像素,以防止剪切]).
"重漆"订单怎么样?我想我自己触发这些吗?哪个/什么时候应该调用repaint()或其他什么?
最重要的要求是我应该直接在图像的像素数据缓冲区中修改像素.
import javax.swing.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
public class DemosDoubleBuffering extends JFrame {
private static final int WIDTH = 600;
private static final int HEIGHT = 400;
int xs = 3;
int ys = xs;
int x = 0;
int y = 0;
final int r …Run Code Online (Sandbox Code Playgroud) 我们有一个OO代码库,在很多情况下hashcode()并且equals()根本不起作用,主要是由于以下原因:
除非您愿意放弃面向对象抽象的好处,否则无法扩展可实例化的类并在保留equals合同的同时添加值组件.
这是Joshua Bloch撰写的"Effective Java"的引用,在这篇伟大的Artima文章中有关于该主题的更多内容:
http://www.artima.com/lejava/articles/equality.html
我们完全没问题,这不是这个问题的意思.
问题是:看到事实上,在某些情况下你无法满足equals()合同,什么是自动制作hashcode()和equals()抛出UnsupportedOperationException 的干净方法?
注释会起作用吗?我正在考虑这样的事情@NotNull:每次@NotNull合同违规都会自动抛出异常,除了用你的参数/返回值注释之外别无他法@NotNull.
它很方便,因为它是8个字符("@NotNull")而不是不断重复相同的验证/抛出异常代码.
在我关注的情况下,在每个hashCode()/equals()没有意义的实现中,我们总是重复同样的事情:
@Override
public int hashCode() {
throw new UnsupportedOperationException( "contract violation: calling hashCode() on such an object makes no sense" );
}
@Override
public boolean equals( Object o ) {
throw new UnsupportedOperationException( "contract violation: calling equals() on such an object makes no sense" );
}
Run Code Online (Sandbox Code Playgroud)
然而,这很容易出错:我们可能会忘记剪切/粘贴此内容,这可能会导致用户滥用此类对象(例如,尝试将它们放入默认的Java集合中).
或者,如果无法创建注释来创建此行为,AOP是否有效?
有趣的是,真正的问题是Java层次结构的存在hashCode()和 …
我有一个关于保证的问题,如果有的话,在下面的场景中(请注意问题不是"如何以不同的方式做到这一点?"),问题实际上是关于以下情况下的类加载顺序(至更好地理解类加载的工作原理).
这是假设的场景......有一个.war文件,它具有以下(部分)目录结构:
WEB-INF/classes/com/acme/Bunny.class
.
.
.
WEB-INF/lib/acme.jar
Run Code Online (Sandbox Code Playgroud)
两个Bunny.class文件都有导入引用acme.jar中的其他类
Bunny.class在WEB-INF /班/ ...是具有相同的名称/路径,一个类从唯一的类acme.jar.
该的.jar文件acme.jar还包含com.acme.Bunny(也有使用没有特殊的类装载器的技巧).
我知道Java规范保证在程序实际使用(或者故意"手动加载")之前不会加载类,这就是为什么如果你填充成千上万的.jar,比如说.war,类加载器不会开始类加载数万个类.
(编辑)
但是上面示例中的两个类的加载顺序又如何呢?
应该措辞:
但是如何确定上面两个类中的哪一个被加载?
或类似的东西 :)
有做一个保证:com.acme.Bunny不得将任何其它类之前,使用com.acme ....
基本上,在维基百科上,写了以下内容:
最复杂的JAR地狱问题出现在利用类加载系统的完全复杂性的情况下.Java程序不需要仅使用单个"平面"类加载器,而是可以由几个(或实际上是无限数量)嵌套的协作类加载器组成.由不同类加载器加载的类可能以复杂的方式进行交互,而开发人员无法完全理解这些类,从而导致无法解释的错误或错误.
所以我想知道:我可以确定/classes/com/acme/Bunny.class是否会在WEB-INF/lib / dir中的.jar之前进行类加载?