谈谈java创建对象

  作为一门面向对象的语言,我们学习java,对于对象的学习非常重要。大多的教程上都用抽象的概念驱使着我们理解对象,把现实抽象为对象。然而忽略对创建对象的研究。如果说学习抽象思维,运用抽象思维虚拟现实是走向java顶端的关键,那创建对象可以说是通向成功的垫脚石吧。今天我们就来谈谈创建对象。

  说到创建对象,new 方法是java最常用也是最简单的方式。而恰恰是它的简单,让我们用的那么的随意。

  举个例子:

    

public class Demo {
	private String i;
	private String love;
	private String java;

	public String getDemo(){
		  return i + love + java;
	}
}

  

  编译器如果不为我们优化,调用一次getDemo我们将创建2个对象。而我们都清楚,可以使用stringbuffer和stringbuilder代替。

public class Demo {
	private String i;
	private String love;
	private String java;

	public String getDemo(){
	    StringBuilder builder = new StringBuilder();
	      builder.append(i);
	      builder.append(love);
	      builder.append(java);
	      return builder.toString();
	}
}

 这样是解决了调用一次getDemo创建多个对象,但是调用多次getDemo呢??

public class Demo {
	private String i;
	private String love;
	private String java;

	private final ThreadLocal<StringBuilder> cache = new ThreadLocal<StringBuilder>(); 

	public String getDemo(){
		StringBuilder builder = cache.get();
		if(builder==null){
			builder = new StringBuilder();
			cache.set(builder);
		}else{
			builder.delete(0, builder.length());
		}
		builder.append(i);
		builder.append(love);
		builder.append(java);
		return builder.toString();
	}
}

  

  

public class Demo {
	private String i;
	private String love;
	private String java;

	private final ThreadLocal<StringBuilder> cache = new ThreadLocal<StringBuilder>(); 

	public String getDemo(){
		StringBuilder builder = cache.get();
		if(builder==null){
			synchronized (this) {
				builder = new StringBuilder();
				cache.set(builder);
			}
		}else{
			builder.delete(0, builder.length());
		}
		builder.append(i);
		builder.append(love);
		builder.append(java);
		return builder.toString();
	}
}

  

  我们使用了成员属性来解决多次调用getDemo创建多个stringbuilder类型的变量。熟悉多线程的你应该已经考虑安全的问题了。是的,使用成员属性容易引起线程安全问题。上面代码里的判断非空和set是非安全的。我们做修改后如下:

  我们编写的程序,方法中每个new操作,运行在多线程情况下,最终会产生n个对象。我们知道new 创建的对象存在于堆中,它不会随着线程的执行结束而释放。而对于这些对象的回收,我们需要jvm的垃圾回收来完成,而垃圾回收什么时候开始,回收效果如果,我们往往不会去关注。

  可以确定的是,我们都希望着jvm立刻回收不需要使用的对象,以便我们可以最大限度的使用内存。但是我们为什么不从源头,从创建的时刻,尽量少的使用它呢。

  以上是我个人的理解,如有错误,敬请纠正。   

  

时间: 2024-08-06 11:37:01

谈谈java创建对象的相关文章

谈谈java中静态变量与静态方法继承的问题

谈谈java中静态变量与静态方法继承的问题 学习的中如果遇到不明白或者不清楚的的时候,就是自己做些测试,自己去试试,这次我就做一个关于静态变量的继承和静态方法继承问题的测试. 首先我先建一个父类: 这样我在建一个子类: 这些都准备好以后,我对子类创建对象,然后用  类名.静态变量/静态方法  和  对象名.静态方法/静态变量  对他们输出的结果进行测试. 这样输出种类有: 这样我输出的结果是: 这样来总结一下: 1. 通过类名来调用子类中的静态变量和静态方法,当父类与子类相同时是,子类会隐藏父类

谈谈java中成员变量与成员方法继承的问题

谈谈java中成员变量与成员方法继承的问题 关于成员变量和成员方法的的继承问题,我也可以做一个小测试,来看看结果. 首先我们先创建一个父类: 其次再创建一个子类,子类中要比父类中少一个成员方法: 这样我们对子类创建对象,如果不创建对象,我们是无法访问子类的成员变量和成员方法的,因为“无法从静态上下文中引用非静态方法”.我们要输出有: 从以上的数据中,我们就可以得出的输出结果是 这样我们就可以得出结论. 总结: 1.   在结果中可以看出,子类的成员变量和成员方法,与其父类的相同的时候,子类就会覆

Java创建对象的过程

Java创建对象的过程 Java是一门面向对象的编程语言,在Java程序运行过程中每时每刻都有对象被创建出来.在语言层面上,创建对象通常仅仅是一个new关键字而已,而在虚拟机中,对象的创建又是怎样一个过程呢? 一.检测类是否被加载 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载.解析和初始化过.如果没有,那必须先执行相应的类加载过程. 二.为新生对象分配内存 在类加载检查通过后,接下来虚拟机将为新生对象分配内

Java创建对象的几种方法

有时候,也可能碰到这样面试题,如: Java创建对象有哪几种方法? 除了new之外,java创建对象还有哪几种方式? 本文结合例子,给出几种Java创建对象的方法,Here we go~~~~ 使用new创建 这是最常用的一种.如: Book book = new Book(); 示例如下: package test; import java.io.Serializable; import java.util.List; /** * @author wangmengjun * */ public

谈谈Java的集合组件

让我们一起谈谈Java的集合组件 我们在使用Java的时候,都会遇到并使用到Java的集合.在这里通过自己的理解和网上的资源对Java的集合方面的使用做一个简单的讲解和总结. Java主要分为3个集合组件:Set(集).List(列表).Map(映射). Collection接口:Collection是最基本的集合接口,声明了适用于Java集合的通用方法.Set和List都继承了Collection,Map. Collection接口的方法: boolean add(Object o):向集合中

Java创建对象的4种方式?

 [Java创建对象的4种方式?] 1)通过new语句实例化一个对象 2)通过反射机制创建对象 3)通过clone()方法创建一个对象  (复制) 4)通过反序列化方式创建对象

谈谈java的BlockingQueue

http://www.cnblogs.com/archy_yu/archive/2013/04/19/3018479.html 博客园 首页 新随笔 联系 管理 随笔- 92  文章- 0  评论- 825 谈谈java的BlockingQueue 最近在维护一个java工程,在群里面也就聊起来java的优劣!无奈一些Java的终极粉丝,总是号称性能已经不必C++差,并且很多标准类库都是大师级的人写的,如何如何稳定等等.索性就认真研究一番,他们给我的一项说明就是,在线程之间投递消息,用java已

Java创建对象的动作分析

一.Java创建对象时将对象存放到内存的堆中. 创建对象时先执行类成员的初始化,然后才会调用构造函数初始化对象, package com.test.createsort; public class CreateObjectSort { public static void main(String[] args) { test t = new test("testest"); System.out.println(t); }}class test{ private String name

谈谈java中的构造函数

本篇博文主要是为新手.对java语言感兴趣的人和那些没有系统学习过java基础知识的人进行一个总结,在文章中对构造函数进行了较为详细的说明和讨论,也包含了我个人对于java面向对象中构造函数的一些看法.希望走在java学习道路上的同行者可以有一个较为清晰的认知和理解.当然仅为个人观点,水平有限,不足之处,还请大家多多指出,互相交流学习. 1.构造函数的概念 很多java新手谈到构造函数就会犯晕,我们先来看看什么是构造函数. 首先,构造函数是函数的一种特殊形式,特殊在哪里?构造函数中不需要定义返回