示例代码:
modifyMyList(myList);
public void modifyMyList(List someList){
someList.add(someObject);
}
Run Code Online (Sandbox Code Playgroud)
要么:
List myList = modifyMyList(myList);
public List modifyMyList(List someList){
someList.add(someObject)
return someList;
}
Run Code Online (Sandbox Code Playgroud)
我相信还有第三个选项:你可以在modifyMyList方法中创建一个新的List并返回这个新的List ...
(第三个选项在这里,我太懒了但有人已经在答案中加了它:)
List myList = modifyMyList(myList);
public List modifyMyList(List someList){
List returnList = new ArrayList();
returnList.addAll(someList);
returnList.add(someObject);
return Collections.unmodifiableList(returnList);
}
Run Code Online (Sandbox Code Playgroud)
我有什么理由选择一个而不是另一个吗?在这种情况下应该考虑什么?
我正在阅读和研究计算系统的元素,但我一度陷入困境.示例章节跳过下面的5条指令可以在这里找到.
无论如何,我正在尝试实现一个虚拟机(或一个字节代码到汇编转换器),但我坚持跳过下一个5指令一点.
您可以在此处找到装配符号.
目标是实现将特定字节代码转换为此汇编代码的转换器.
我成功完成的一个例子是字节码
push constant 5
Run Code Online (Sandbox Code Playgroud)
这被翻译成:
@5
D=A
@256
M=D
Run Code Online (Sandbox Code Playgroud)
正如我所说,Hack的汇编语言可以在我提供的链接中找到,但基本上是:
@5 // Load constant 5 to Register A
D=A // Assign the value in Reg A to Reg D
@256// Load constant 256 to Register A
M=D // Store the value found in Register D to Memory Location[A]
Run Code Online (Sandbox Code Playgroud)
嗯这很直接.根据定义,存储器位置256是堆栈的顶部.所以
push constant 5
push constant 98
Run Code Online (Sandbox Code Playgroud)
将被翻译为:
@5
D=A
@256
M=D
@98
D=A
@257
M=D
Run Code Online (Sandbox Code Playgroud)
这一切都很好..
我还想再举一个例子:
push constant 5
push …Run Code Online (Sandbox Code Playgroud) 所以我知道存在2个内存区域:Stack和Heap.
我也知道如果你创建一个局部变量,它将存在于堆栈中,而不是堆中.随着我们将数据推入其中,堆栈将会增长,如:

现在我将尝试通过我对你的困惑:
例如,这个简单的Java代码:
public class TestClass {
public static void main(String[] args) {
Object foo = null;
Object bar = null;
}
}
Run Code Online (Sandbox Code Playgroud)
被翻译成这个字节码:
public static void main(java.lang.String[]);
Code:
Stack=1, Locals=3, Args_size=1
0: aconst_null
1: astore_1
2: aconst_null
3: astore_2
4: return
LineNumberTable:
line 5: 0
line 6: 2
line 7: 4
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 args [Ljava/lang/String;
2 3 1 foo Ljava/lang/Object;
4 1 2 bar Ljava/lang/Object;
Run Code Online (Sandbox Code Playgroud)
根据定义,acons_null …
所以Java中的'char'是2个字节.(可以从这里验证.)
我有这个示例代码:
public class FooBar {
public static void main(String[] args) {
String foo = "€";
System.out.println(foo.getBytes().length);
final char[] chars = foo.toCharArray();
System.out.println(chars[0]);
}
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
3
€
Run Code Online (Sandbox Code Playgroud)
我的问题是,Java如何将3字节字符装入char数据类型?顺便说一句,我正在使用参数运行应用程序:-Dfile.encoding = UTF-8
此外,如果我进一步编辑代码并添加以下语句:
File baz = new File("baz.txt");
final DataOutputStream dataOutputStream = new DataOutputStream(new FileOutputStream(baz));
dataOutputStream.writeChar(chars[0]);
dataOutputStream.flush();
dataOutputStream.close();
Run Code Online (Sandbox Code Playgroud)
最终文件"baz.txt"将只有2个字节,即使我将其视为UTF-8文件,它也不会显示正确的字符.
编辑2:如果我用UTF-16 BE编码打开文件"baz.txt",我会在文本编辑器中看到€字符就好了,我觉得这很有道理.
这是我的代码:
class HelloWorld {
char[] foo = {'a', 'b'};
// This will compile
void foo() {
for (char foo : foo) {
}
}
// This will not compile
void bar() {
for (char foo = 0; foo < foo.length; foo++) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
如何foo编译但编译bar失败:
Error: char cannot be dereferenced
Run Code Online (Sandbox Code Playgroud)
在foo编译中使循环失败的两个循环声明之间有什么区别?
这是我在maven项目中的目录布局:
.
??? pom.xml
??? src
??? main
??? java
? ??? biz
? ??? tugay
? ??? web
? ??? servlet
? ??? MainServlet.java
??? resources
? ??? log4j.properties
??? webapp
??? WEB-INF
??? web.xml
Run Code Online (Sandbox Code Playgroud)
pom.xml相关部分如下:
</dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<finalName>bare-webapp</finalName>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.2.1.v20140609</version>
</plugin>
</plugins>
</build>
<properties>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<log4j.version>2.8.2</log4j.version>
</properties>
Run Code Online (Sandbox Code Playgroud)
这是我的web.xml
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"> …Run Code Online (Sandbox Code Playgroud) 我的Windows 7机器上有IntelliJ Idea 12和Jetty 9.
我还有一个示例JSF项目,它在Tomcat 7.0上运行良好.当我尝试使用Jetty添加运行时,我收到错误:
找到重复的配置文件路径
当我删除
等\码头,jmx.xml
从这个屏幕上的Jetty服务器设置,我没有得到这个错误但是当我尝试启动项目时,我得到:
2013-03-27 17:50:42.076:警告:oejx.XmlParser:main:FATAL @ file:/ D:/Jetty-9/start.d/ line:1 col:1:org.xml.sax.SAXParseException; systemId:file:/ D:/Jetty-9/start.d/; lineNumber:1; columnNumber:1; 序言中不能有内容.Sun.reflect.DeativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)的java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Method.java:601)atg.eclipse.jetty.Mart.invokeMain(Main.java:453)org.eclipse.jetty.start.Main.start(Main. java:595)atg.eclipse.jetty.start.Main.main(Main.java:96)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:601)at com.intellij.rt.execution.application.AppMain.main(AppMain.java) :120)引起:org.xml.sax.SAXParseException; systemId:file:/ D:/Jetty-9/start.d/; lineNumber:1; columnNumber:1; 序言中不能有内容.at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177) at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368) at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1388)at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl $ PrologDriver.next(XMLDocumentScannerImpl.java: 996)at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607)at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java: 116)at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488)at com.sun.org.apache.xerces.in 在com.sun.org.apache.xerces的com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764)中的ternal.parsers.XML11Configuration.parse(XML11Configuration.java:835). internal.sparsers.XMLParser.parse(XMLParser.java:123)位于com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210)的com.sun.org.apache.xerces. internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse(SAXParserImpl.java:568)位于org.eclipse.jetty.xml的com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:302).位于org.eclipse.jetty.xml.XmlConfiguration.(XmlConfiguration.java:138)的org.eclipse.jetty.xml.XmlParser.parse(XmlParser.java:220)中的XmlParser.parse(XmlParser.java:204). eclipse.jetty.xml.XmlConfiguration $ 1.run(XmlConfiguration.java:1209)位于org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1160)的java.security.AccessController.doPrivileged(Native Method)中..还有12个
用法:java -jar start.jar [options] [properties] [configs] java -jar start.jar --help#获取更多信息
那么,如何在IntelliJ 12上正确配置Jetty?
首先是一些背景知识,这是本书:Linux系统编程:直接与内核和C库交谈
信号是单向异步通知的机制.信号可以从内核发送到进程,从进程到另一个进程,或从进程发送到自身.
Linux内核实现了大约30个信号.
信号中断执行过程,使其停止正在执行的操作并立即执行预定操作.
好的,进一步,从这里我将引用这部分:
在Intel系列微处理器上,例如Pentium,int 80h是用于中断80h的汇编语言操作码.这是典型的基于Intel的Unix系统上的系统调用中断,例如FreeBSD.它允许应用程序编程人员从Unix内核获取系统服务.
我真的无法完全理解我的想法.所以,当我例如使用
write
Run Code Online (Sandbox Code Playgroud)
在Posix中定义的方法,当它被编译成程序集时,然后进一步组装成目标代码并链接到运行Linux的给定体系结构中的可执行文件...... 系统调用是正确的吗?
我假设编译后的代码看起来像这样:
mov eax,4 ;code for system_write
mov ebx,1 ;standard output
mov ecx, memlocation; memlocation is just some location where a number of ascii is present
mov edx, 20; 20 bytes will be written
int 80h;
Run Code Online (Sandbox Code Playgroud)
好的,我的问题正是在这一点上.int 80h会向内核发送信号/中断内核吗?内核只是一个进程吗?(它是init进程吗?)当cpu执行int 80h时,究竟发生了什么?寄存器已经充满了信息,(在我的例子中是eax,ebx,ecx和edx ..),但这些信息是如何使用的?
我不能完全建立CPU之间的连接 - 内核以及CPU执行int 80h时的确切操作.
我可以想象一些代码驻留在内存中某处实际上将所需信息发送到设备驱动程序但该代码属于哪个进程?(我假设内核但内核只是一个进程?)int 80h指令如何跳转到该代码?是Linux必须以某种方式实现的吗?
这是我的代码:
public enum Modification {
NONE, SET, REMOVE;
}
boolean foo(){
for (S s : sList) {
final Modification modification = s.getModification();
switch (modification) {
case SET:
case REMOVE:
return true;
/*
case NONE:
break;
*/
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
当代码如上所示时,IntelliJ会说:
'for'语句不会循环更少...()报告其机构保证最多执行一次的for,while和do语句的任何实例.通常,这是一个错误的指示.
只有当我做出以下更改时,IntelliJ才会满意:
for (S s : sList) {
final Modification modification = s.getModification();
switch (modification) {
case SET:
case REMOVE:
return true;
case NONE:
break;
}
}
Run Code Online (Sandbox Code Playgroud)
如果case NONE: 不包含在switch语句中,为什么我的for循环不循环?