一、静态导入
为什么要搞个静态导入呢?
目的: 为了减少字符输入量,提高代码的可阅读性,以便更好地理解程序。
但不可滥用,滥用时会造成代码可阅读性不高,若代码出错要调试时,由于去掉了类名修饰,还需要猜测此方法哪个类的。
可以遵循以下两个规则:
1>不使用*(星号)通配符,除非是导入静态常量类(只包含常量的类或接口)。
2>方法名是具有明确、清晰表象意义的工具类。
如下面的代码:
package com.enhance;
import static java.lang.Math.max; //静态导入
public class StaticImport {
public static void main(String[] args){
int x = 4 , y = 5;
int z = max(x,y);
System.out.println(z); // 静态导入了某个类中所有静态方法,见import static,最后不要使用*的。
}
}
二、可变参数
可变参数的由来,要从函数的重载说起了,当函数具有相同的功能描述,但由于参数个数不同时。可以使用函数重载来实现。
若参数个数不是固定,可以使用参数类型数组来实现。但依然需要在调用此方法之前,new一个数组。
为了简化代码和减少代码输入量,从jdk1.5引入了可变参数。使得当参数个数不确定时,不用再new数组传入了,依然可以直接把参数扔入此方法中。
可变参数的具有如下两个特点:
1> 只能出现在参数列表中的最后一个参数中。
2> 编译器是把可变参数当成一个数组来处理的。
小发现,可变参数的三个.,...可以在两个出现空格也可以不出现空格。
如下面的代码:
package com.enhance;
public class VariableChangable {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int sum = sum(3,4);
System.out.println(sum);
sum = sum(3,4,5);
System.out.println(sum);
}
/**
可变参数的特点:
1> 只能出现在参数列表中的最后一个参数中。
2> 编译器是把可变参数当成一个数组来处理的。
* */
public static int sum(int x , int... args){
int sum = x;
/**
* 增强的for循环,特点:
* for(Type 变量名 : 可迭代的集合)
* Type前可加final来修饰
*
*/
for(int arg : args){
sum += arg ;
}
return sum;
}
}
三、增加for循环
它的出现,使得在打印输出或仅对数组或实现了Iterable集合中,取出元素的处理不用再用数组角标或hasNext,next之类繁重的代码输入量了。使得代码更短小精简。
那么使用增加for循环(foreach)必须要满足以下条件之一:
1> 是数组
2> 是集合且实现了Iterable接口
如上的例子。
格式是 for(TYPE 变量名 : 数组或可迭代的集合) 且TYPE类型前面可以加final修饰的。
当然对集合实现Iterable接口,此接口仅一个方法iterator()返回Iterator接口。但不可在foreach中,使用remove等方法。
四、基本数据类型的自动装箱与拆箱
在jdk1.5之前,若需要创建如Integer实例,则必须new一个出来或使用Integer等相关类的方法来获得一个Integer实例。
1.5之后,对于此应用可以更简单了,因为支持了自动装箱。
如以下:
Integer a = 123 ; //装箱
int b = a -10 ; //拆箱
具体示例代码如下:
package com.enhance;
public class AutoBinning {
/**
* @param args
*/
public static void main(String[] args) {
Integer x = 120 ;
Integer y = 120;
System.out.println("x==y::"+(x==y));//为true
x = 128;
y = 128;
System.out.println("x==y::"+(x==y)); //为false
//因为自动装箱中,Integer有byte范围 -128~127之间都有缓存的,也只是这个范围内只new一个对象。
Integer a = Integer.valueOf(3);
Integer b = Integer.valueOf(3);
System.out.println("a==b::"+(a==b)); //为true
a = Integer.valueOf(128);
b = Integer.valueOf(128);
System.out.println("a==b::"+(a==b)); //为false
}
}
从上发现一个现象,即当Integer值的范围是-128~127之前时, new 出来或装箱出来的同一值时,产生的对象是同一个。这里来到了缓存池的概念,
即当取值是一个byte表示的范围时,会缓存此值在缓冲池中,下次再来一个byte范围的值时会在缓冲池中找是否存在,存在则不再创建新的对象了。这个处理方法的原则其实也就是享元设计模式了。
享元设计模式概念:
简单的说是:运用共享技术有效的支持大量细粒子对象。
利用共享来避免大量具有相同内容的开销,这种开销最常见及最常观的就是内存的开销。
Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度.应用场合很多:比如你要从一个数据库中读取一系列字符串,这些字符串中有许多是重复的,那么我们可以将这些字符串储存在Flyweight池(pool)中.
具体的示例代码如下:
package com.pattern.flyweight;
import java.util.HashMap;
public class Client {
public static void main(String[] args){
int innr = 22 ;
FlyweightFactory factory = new FlyweightFactory();
Flyweight xf = factory.getFlyweight("x");
xf.operation(--innr);
Flyweight yf = factory.getFlyweight("y");
yf.operation(--innr);
Flyweight xxf = factory.getFlyweight("x");
xxf.operation(--innr);
int extr = 22 ;
UnsharedConcreteFlyweight uf = new UnsharedConcreteFlyweight();
uf.operation(--extr);
System.out.println("count:"+factory.getStanceCount());
}
}
class FlyweightFactory{
//常用Map 来缓存具体相同对象的实例
private HashMap<String,Flyweight> map = new HashMap<String,Flyweight>();
public Flyweight getFlyweight(String key){
Flyweight f ;
if(null==map.get(key)){
f = new ConcreteFlyweight();
map.put(key, f);
}else{
f = map.get(key);
}
return f ;
}
public int getStanceCount(){
return map.size();
}
}
abstract class Flyweight{
public abstract void operation(int innr);
}
class ConcreteFlyweight extends Flyweight{
public void operation(int innr) {
System.out.println("具体的flyweight:"+innr);
}
}
class UnsharedConcreteFlyweight extends Flyweight{
public void operation(int extr){
System.out.println("具体的不flyweight:"+extr);
}
}
分享到:
相关推荐
转载 jdk1.5的一些新特性,希望能帮助大家!
JDK1.5新特性
JDK1.5新特性泛型_深入研究JDK1.5新特性泛型_深入研究JDK1.5新特性泛型_深入研究
“JDK1.5”(开发代号猛虎)的一个重要主题就是通过新增一些特性来简化开发,这些特性包括泛型,for-else 循环,自动装包/拆包,枚举,可变参数, 静态导入
JDK 1.5新特性及应用JDK 1.5新特性及应用JDK 1.5新特性及应用
jdk1.5新特性 泛类型和泛型方法是Java5.0 中的新特性。一种泛类型用一个或多个泛型变量定义,可以有一个或多个,泛型变量做参数占位符或做返回值 的方法。
博文链接:https://weibaojun.iteye.com/blog/70284
jdk 1.5新特性笔记,泛型,注释等程序
关于jdk1.5新特性的书,值得拥有,不错的资料
jdk1.5.exe jdk1.5 jdk1.5下载
包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)
JDK1.5,JDK1.5
1.增强的for循环【foreach{}...2.静态导入(这样调用一个静态方法的时候就不需要【类名.方法名】去调用了,直接写静态方法名就可 以了) 格式:import static java.lang.Math.* 注意:这时候的导入就需要加类名了
jdk1.5 tiger java5 新特性
jdk1.5新特性,泛型,for:each
绝版jdk1.5,非常不错的资源。用起来很好。是 Java语言对Bean类属性、事件的一种缺省处理方法。例如类A中有属性name,那我们可以通过getName,setName来得到其值或者设置新 的值。通过getName/setName来访问name属性,...
JDK1.5JDK1.6各自的新特性
测试可用的linux版jdk1.5,jdk-1_5_0_19-linux-i586-rpm.bin