看完SCJP Tip Line的作者Corey McGlone撰写关于javaranch网站的文章后,我感到很困惑.命名为Strings,Literally和SCJP Java 6程序员指南,由Kathy Sierra(javaranch的联合创始人)和Bert Bates撰写.
我将尝试引用Corey先生和Kathy Sierra女士引用的关于String Literal Pool的内容.
1.据Corey McGlone先生说:
String Literal Pool是指向String对象的引用的集合.
String s = "Hello"; (假设Heap上没有名为"Hello"的对象),将"Hello"在堆上创建一个String对象,并在String Literal Pool(Constant Table)中放置对该对象的引用
String a = new String("Bye");(假设Heap上没有名为"Bye" new的对象,操作符将强制JVM在堆上创建一个对象.
现在,"new"对于创建String及其引用的运算符的解释 在本文中有点令人困惑,所以我将文章本身的代码和解释放在下面.
public class ImmutableStrings
{
public static void main(String[] args)
{
String one = "someString";
String two = new String("someString");
System.out.println(one.equals(two));
System.out.println(one == two);
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,由于关键字,我们实际上最终会遇到略微不同的行为."new."
在这种情况下,对两个String文字的引用仍然放在常量表(String Literal Pool)中,但是当你来到关键字时"new,"JVM必须在运行时创建一个新的String对象,而不是使用常量表中的那个.
这是解释它的图表..

那么它是否意味着,String Literal Pool也有对这个Object的引用?
以下是Corey McGlone撰写文章的链接
http://www.javaranch.com/journal/200409/Journal200409.jsp#a1
2. …
我最近经历过volatile关键字这种奇怪的行为.我所知道的,
volatile关键字应用于变量,以将一个线程对变量数据所做的更改反映到另一个线程上.
volatile关键字阻止在线程上缓存数据.
我做了一个小测试........
我使用了一个名为count的整数变量,并在其上使用了volatile关键字.
然后制作2个不同的线程将变量值增加到10000,因此最终结果应为20000.
但事实并非如此,使用volatile关键字我一直没有得到20000,而是18534,15000等......有时候是20000.
但是虽然我使用了synchronized关键字,但它工作得很好,为什么......?
任何人都可以解释我挥发性关键字的这种行为.
我发布带有volatile关键字的代码,以及带有synchronzied关键字的代码.
以下代码与变量计数上的volatile关键字行为不一致
public class SynVsVol implements Runnable{
volatile int count = 0;
public void go(){
for (int i=0 ; i<10000 ; i++){
count = count + 1;
}
}
@Override
public void run() {
go();
}
public static void main(String[] args){
SynVsVol s = new SynVsVol();
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch …Run Code Online (Sandbox Code Playgroud) -我正在使用Parseapi 将视频文件上传并保存到Parse.com服务器以获取应用程序.
- 我目前使用Parse Documentation中的以下代码将视频文件上传到Parse Server:
File f = new File("/sdcard/video-2013-02-21-13-03-24.mp4");
byte[] videoUp = IOUtils.toByteArray( new FileInputStream(f));
ParseFile file = new ParseFile("testVideo1", videoUp);
file.saveInBackground(new SaveCallback() {
public void done(ParseException e) {
e.printStackTrace();
}
}, new ProgressCallback() {
public void done(Integer percentDone) {
System.out.println("Progress :" + percentDone);
}
});
Run Code Online (Sandbox Code Playgroud)
-在第一其打印进度100% ,其是得到的System.out.println声明从done()方法与Integer作为参数,并立即,经过其进入该方法done()与ParseException作为参数打印下列堆栈跟踪.
FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.uploadfileusingparse.MainActivity$1$1.done(MainActivity.java:63)
at …Run Code Online (Sandbox Code Playgroud) -我正在开发一个需要以慢动作播放视频的项目.
-我很清楚Android没有提供这些功能.
-我发现PVPlayer Engine和libVLC拥有这些功能,但我没有找到任何教程或适当的文档将它们包含在android项目中并使用它们.
-所以我尝试通过使用Runnable和这样做Handler,它成功地减慢了视频,但他们在播放期间拥有混蛋.
public class MainActivity extends Activity {
VideoView vx;
Button mbutt;
Handler h ;
int curr = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
h = new Handler();
vx = (VideoView)findViewById(R.id.videoView);
mbutt = (Button)findViewById(R.id.button_Play);
vx.setVideoPath("/mnt/sdcard/you.mp4");
mbutt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
vx.start();
}
});
Runnable r = new Runnable() {
@Override
public void run() {
if (vx != null) …Run Code Online (Sandbox Code Playgroud) 在下面的2个链接中,我发现Object和object是可以互换的:
c#:"System.Object"和"object"之间的区别
但我只是无法理解为什么我不能使下面的代码工作,如果对象和对象是可以互换的:
与"对象"无关的代码:
class A : Object
{
public int x = 5;
}
class B : A
{
static void Main()
{
System.Console.WriteLine(new B().x);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
无法找到类型或命名空间名称"对象"(您是否缺少using指令或程序集引用?)
与"对象"一起使用的代码:
class A : object
{
public int x = 5;
}
class B : A
{
static void Main()
{
System.Console.WriteLine(new B().x);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
五
Calendar c = Calendar.getInstance();
c.set(2019, 12, 29);
Run Code Online (Sandbox Code Playgroud)
我什么时候c.getTime()得到以下输出...
输出:
Wed Jan 29 17:15:27 IST 2020 //应该是2019年
///// --------------------------------------------- ---------------- //////
Calendar c = Calendar.getInstance();
c.set(2019, 11, 29);
Run Code Online (Sandbox Code Playgroud)
我什么时候c.getTime()得到以下输出...
输出:
Sun Dec 29 17:18:23 IST 2019
现在我不知道为什么将月份从12日改为11日给了我正确的日期和时间,如果有人能够简单地解释这个问题并且如果可能的话用一个简单的小例子我真的有义务.
我对C#很新,所以我希望如果我的问题听起来很愚蠢请原谅我的无知.
-我尝试Inheritance用丰达C#,发现它在一些奇怪的行为方式,所以我想用检查出来Java,我得到了我的预期的结果.
-我只是想知道这里有什么我想念的.......
C#代码:
class Animal
{
public void Sound()
{
System.Console.WriteLine("I don't make any sound");
}
}
class Dog : Animal
{
public void Sound()
{
System.Console.WriteLine("barking");
}
}
class InheritTest
{
static void Main()
{
Animal a = new Dog(); // Implicit conversion
Dog d = (Dog) a; // Explicit conversion
a.Sound();
d.Sound();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
I don't make any sound
barking
Run Code Online (Sandbox Code Playgroud)
JAVA代码:
class Animal
{
public void sound()
{ …Run Code Online (Sandbox Code Playgroud)