`
huangfeiNetJava
  • 浏览: 41036 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

再释final关键字、浅析java缓存

 
阅读更多

 

      以前总是遇到一些不可思议的事,但是那是没有时间和精力去解决,只是先记着,唉,记着记着,就有去解释一下的冲动了。

 

引例:

public class FinalKeyWordTest {

	public static void main(String[] args) {
		
		final String str1 = "我是"+ 123;
		
		final String str2 = "我是" +String.valueOf(123);
		
		System.out.println(str1 == "我是123");
		
		System.out.println(str2 == "我是123");
		
	}

}

//运行结果:
//true
//false

//乍一看,为何第一句输出真,而后一句输出假呢?刚开始我也极端纳闷,想不通(不过还没到要跳楼的程度),
//资料查啊查才有“一点”眉目

//总结:首先,我们要清楚“.equals()”方法和“==”的区别,第一句说明了str1和后面的字符串是同一个东西。str1和
//str2没有太大的区别,只是定义str2时显式将数值123转换成字符串,但由于该变量的值需要调用String类方法,因
//此编译器无法编译时确定str2的值,str2不会被当成“宏变量”处理。(但str1会被当成宏变量处理,在编译时就会确
//定值。

 

 

很多人遇到过这种情况,在匿名内部类中使用一个内部类外的局部变量时,如果该局部变量不加final关键字修饰,会编译不通过,这是为什么呢?如果你知道答案,以下内容请勿看,免得浪费你宝贵的时间。

public class InlineClassTest {

	public static void main(String[] args) {

		final String str = "Java";

		new Thread(new Runnable() {

			public void run() {

				for (int i = 0; i < 100; i++) {

					System.out.println(str + i);

					try {

						Thread.sleep(1000);

					} catch (InterruptedException e) {

						e.printStackTrace();

					}

				}
			}

		}).start();
		
		// 执行到这里,main方法结束,但启动的线程还在运行
		
	}

}

 

 

 小释:如果str变量没有加final,那么当main方法执行结束后,str变量会被回收或被销毁,那么子线程用的str就不存在了,所以Java是不允许这些矛盾出现的,所以此时final关键字就起作用了,该关键字允许内部类产生隐式的“闭包”,闭包将使得局部变量脱离它所在的方法继续存在。

 

 

 

 

附:java缓存小实例:

public class BufferMemory {

	public static void main(String[] args) {

		String str1= "改变世界,下一个就是U";
		
		String str2 = "改变世界,下一个就是U";
		
		System.out.println(str1 == str2);
		
	}

}

 

运行结果:

true

小释:Java会缓存曾经用过的字符串直接量(本人估计这样的机制是想提高运行速度和节省空间吧)。

 

总结:以上都是一些很小的细节,但是,见叶知秋,我们可以从一些小小的细节去窥探java运行机制,其实还是蛮有意思的。

 

计划:研究java集合的实现细节。

1
3
分享到:
评论
4 楼 feargod 2011-09-27  
支持,原来觉得很基础的东西,深究下去大有文章。
3 楼 蜜团甜 2011-09-26  
package com.huawei.it.support.docfeedback.actions;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFHyperlink;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

2 楼 z276356445t 2011-09-25  
引用
小释:Java会缓存曾经用过的字符串直接量(本人估计这样的机制是想提高运行速度和节省空间吧)。

这并不是缓存,而是String本身在Java体系中被归为基本类型,所以会对同样的常量做相同的引用,建议看下http://www.iteye.com/topic/774673对String类有个了解.
1 楼 jyjava 2011-09-25  
第一个demo的理解有点牵强了,是否作为宏处理,就决定了是否相同了吗?

相关推荐

    浅析Java中的final关键字Java开发Java经验技

    在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被广泛用于定义不可变对象、常量以及固定行为。本篇文章将深入探讨`final`关键字在Java中的使用和重要性,帮助开发者更好地理解和应用这一关键特性。 ...

    22.final关键字.zip

    22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22.final关键字.zip22...

    Java final关键字

    在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来声明一个变量、方法或类为不可变的。在这个学习demo中,我们将深入理解`final`关键字的各种用法及其背后的原理。 首先,`final`关键字用于变量...

    深入理解Java中的final关键字_动力节点Java学院整理

    Java 中的 `final` 关键字是一个至关重要的概念,它被用来声明类、方法和变量,以确保它们在程序执行过程中不可更改。深入理解 `final` 关键字可以帮助开发者写出更加安全、高效的代码。 首先,`final` 关键字可以...

    final关键字的使用.mp4

    final关键字的使用f

    final关键字详细解读

    final关键字是Java语言中的一个基本概念,它用于限制类、变量、方法以及引用的修改和扩展。final关键字的主要作用是告诉编译器该元素是最终的,不可变的。对于初学者来说,掌握final关键字的使用可以帮助编写出更加...

    Java编程中static和final关键字的陷阱.pdf

    Java编程中static和final关键字的陷阱.pdf Java编程中static和final关键字的陷阱是Java开发中两个重要的关键字,但是它们的使用也存在一些陷阱,需要开发者注意掌握。 static关键字可以用于修饰属性、方法和类。...

    Java零基础-final关键字.md

    ### Java零基础-final关键字 #### 内容概要 本文主要介绍了Java中final关键字的概念及其在实际编程中的应用。读者将能够理解final关键字的基本定义、用途及作用范围,并且掌握如何在不同的编程场景中合理使用它。...

    Java基础教程之final关键字浅析

    【Java基础教程之final关键字浅析】 在Java编程语言中,`final`关键字是一个非常重要的关键字,它有多个用途,可以用于修饰类、方法和变量,确保它们在程序执行过程中保持不可变性或不可重写性。理解并熟练运用`...

    Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口

    Java中的`final`关键字、抽象类和接口是面向对象编程中的核心概念,它们共同构建了类的层次结构和多态性。以下是对这些概念的详细解释: 1. **final关键字** - `final`关键字用于确保变量的值一旦被赋值后就不能...

    final 关键字用法

    java程序设计中,final 关键字用法,通过代码演示java程序设计中,final 关键字用法,

    Java中final关键字详解

    另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。 主要介绍:一.final关键字的基本用法。二.深入理解final关键字 一.final关键字的基本用法  在Java中,final关键字可以用来...

    【Java语言基础】final关键字

    【Java语言基础】final关键字 修饰词:final 最终的最后的 final关键字可用于修饰符,变量和方法,用于表示它修饰的类,方法和方法不可改变。 final 最终的最后的 final修饰变量时,表示该变量一旦获得了初始值之后...

    Java中的final关键字

    在Java编程语言中,`final`关键字扮演着一个至关重要的角色,它被用来定义不可变性和唯一性。这个关键字可以应用于变量、方法和类,分别赋予它们不同的特性。以下是对`final`关键字在不同场景下使用的详细介绍: 1....

    Java中的final关键字详解及实例

    Java中的final关键字 1、修饰类的成员变量 这是final的主要用途之一,和C/C++的const,即该成员被修饰为常量,意味着不可修改。   上面的代码对age进行初始化后就不可再次赋值,否则编译时会报类似上图的错误。 ...

    Java关键字大全 Java关键字

    Java关键字大全 Java关键字大全是Java编程语言中最基本和最重要的组成部分。这些关键字是Java语言的基础构建块,用于定义类、方法、变量、控制流、异常处理等。了解和掌握Java关键字是每一个Java开发者必备的技能。...

    深入解析Java编程中final关键字的作用

    在Java编程中,final关键字扮演着至关重要的角色,它用于声明不可变的变量、方法以及类,以确保代码的稳定性和安全性。以下是关于final关键字的深入解析: 1. **final类**: 当一个类被声明为final时,这意味着这...

    java中final关键字和static关键字详细用法

    Java中的`final`和`static`关键字是编程中非常重要的两个修饰符,它们分别用于不同的场景,以确保代码的稳定性和高效性。 首先,`final`关键字主要用于表示不可变性。它可以用来修饰类、方法和变量。对于类,如果一...

    day11 05 final关键字用于修饰成员变量

    day11_05_final关键字用于修饰成员变量

Global site tag (gtag.js) - Google Analytics