重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1)尽量指定类、方法的final修饰符。带有final修饰符的类是不可派生的,Java编译器会寻找机会内联所有的final方法,内联对于提升Java运行效率作用重大,此举能够使性能平均提高50%。
我们拥有十年网页设计和网站建设经验,从网站策划到网站制作,我们的网页设计师为您提供的解决方案。为企业提供成都网站制作、成都做网站、微信开发、微信小程序开发、成都做手机网站、H5开发、等业务。无论您有什么样的网站设计或者设计方案要求,我们都将富于创造性的提供专业设计服务并满足您的需求。
2)尽量重用对象。由于Java虚拟机不仅要花时间生成对象,以后可能还需要花时间对这些对象进行垃圾回收和处理,因此生成过多的对象将会给程序的性能带来很大的影响。
3)尽可能使用局部变量。调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中速度较快,其他变量,如静态变量、实例变量等,都在堆中创建速度较慢。
4)慎用异常。异常对性能不利,只要有异常被抛出,Java虚拟机就必须调整调用堆栈,因为在处理过程中创建了一个新的对象。异常只能用于错误处理,不应该用来控制程序流程。
5)乘法和除法使用移位操作。用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,但是移位操作虽然快,可能会使代码不太好理解,因此最好加上相应的注释。
6)尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用 Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销。
尽量在合适的场合使用单例。使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例。
/**
* @author geek
*/
public class Cylinder {
private double radius,
height;
public Cylinder() {
}
public Cylinder(double radius, double height) {
this.radius = radius;
this.height = height;
}
public double getVolume(){
return Math.PI*radius*radius*height;
}
public static void main(String[] args) {
Cylinder c=new Cylinder(3,7);
System.out.println("半径"+c.radius);
System.out.println("高"+c.height);
System.out.printf("体积%.2f",c.getVolume());
}
}
说到代码优化,每个人或多或少都掌握一到两种方法,但是这样的方法对提升代码运行效率效果不大,最重要是对代码的重视和了解,这样才能提升代码的运行效率。在进行代码优化的过程中,方法是非常重要的,多掌握几种方法,根据代码的不同情况选择适合的方法进行优化。下面电脑培训为大家介绍Java代码优化的几种方法。
1、使用指定类、方法的final修饰符
具有final修饰符的类不可派生。在Java核心API中,有许多最终应用程序的例子,例如java.lang.String,整个类都是final。为类指定final修饰符允许继承类,并且为方法指定final修饰符允许覆盖该方法。如果将类指定为final,IT培训认为该类的所有方法都是final。Java编译器将寻找内联所有最终方法的机会。内联对于提高Java操作的效率非常重要。这可以将性能平均提高50%。
2、重用对象
String对象的使用是非常重要的,StringBuilder/StringBuffer并不是字符串连接。由于Java虚拟机需要时间来生成对象,所以将来垃圾收集和处理这些对象可能需要一些时间。因此,生成太多对象将对程序的性能产生很大影响。
3、使用局部变量
调用方法时传递的参数以及在调用中创建的临时变量都保存在堆栈中,速度更快。其他变量(如静态变量和实例变量)在堆中创建并且速度较慢。此外,昆明北大青鸟发现在堆栈中创建的变量,当方法完成运行时,内容消失,不需要进行额外的垃圾收集。
4、及时关闭流
在Java编程过程中,在执行数据库连接和I/O流操作时要小心。使用后,北大青鸟云南嘉荟校区官网建议应及时关闭以释放资源。因为这些大型物体的操作会导致系统的大量开销,稍微粗心会导致严重的后果。
类的实例方法在内存中是只有一份,不过肯定不会是第一个对象中,如果是第一个对象的话,那么当第一个对象被销毁的时候,那么后面的对象就永远无法调用了...
类的实例方法存在一个专门的区叫方法区,事实上类刚装载的时候就被装载好了,不过它们在"睡眠",只是这些方法必须当有对象产生的时候才会"苏醒".(比如,一个输出类的成员变量的方法,如果连对象都没有,何来的输出成员变量).所以,方法在装载的时候就有了,但是不可用,因为它没有指象任何一个对象。
而静态的又不一样了,静态的东西存在静态区,他们和类是一个等级的,就是说只要类被装载,它们就可以直接用.(用类名来调用).他们不依赖与任何对象,所以也不能输出任何对象的成员属性.(除非成员属性也是静态的).
而你最后的一句话也是错的,"类的所有数据在内存中只有静态的才又空间".
当然不是,每个对象在new的时候都会在堆区中开辟内存,用来保存对象的属性和方法.(实际上方法保存的只是方法区的引用,如果保存的是方法本身,那么试想一下,有多少个对象就得有多少个方法,那么又和第一点中"实例方法在内存中只有一份拷贝"相矛盾了)
好了,事实上内存图很复杂和麻烦,算比较深的东西了,很多用JAVA多年的人也不太了解其原理,因为开发也不要用..
更多的问题可以去远标培训去问技术老师。
class Person{//Persion类
String name;//String类变量,未初始化,默认null
int age;//int类变量,默认0
public Person()//Person类的无参构造方法,一般用来初始化变量,如之前的name。 比如有时候需要定义人这个类特有的属性,会说话,那么一般会在无参构造函数里面写上canTalk=true;
{
}
public Person(String name,int age)//Person类的有参构造方法,参数name和age,和类变量name、age无关
{
this.name=name;//this指Persion类,就是把于传过来变量name赋值给之前的类变量name
this.age=age;//同上
}
public String talk(){//具有String返回值的方法,调用它的时候会得到String返回值
return "我是"+this.name+",今年"+this.age+"岁";//调用talk的时候用String a=talk();的形式,a的值就是"我是"+this.name+",今年"+this.age+"岁"
}
}
public class TestObjectArray{//TestObjectArray公共类,java文件的文件名需和公共类值相同,这段代码必须出现在TestObjectArray.java文件中
public static void main(String[] args){//主方法,程序的入口
Person[] p={new Person("张三",25),new Person("李四",30),new Person("王五",35)};//实例化Persion类,用人这个类来举例,每个人都有相同的一些特性,但每个人不同特性的属性值不同,如年龄的大小不同,实例化就相当于产生不同的人。这里是用数组的形式实例化
for(int i=0;ip.length;i++){//根据p的长度循环
System.out.println(p[i].talk());//p[1]时,会调用Persion类里面的talk()函数,并且传入的参数是 "张三",25 ,那么会显示:"我是张三,今年25岁" 。System.out.println()换行显示括号内的内容
}
}
}