Java高新技术1---增强for循环 ---装箱与拆箱享元设计模式--自己写枚举--可变长度的参数

其实这些知识是我在 看张孝祥老师的Java视频的时候记录的 ,我可以负责任的说 对于 入门人员来说 这部视频 是 精粹 ,可以 3天内 带你 进入 Java的 另一个 境界 。

话不多说 ,不信 自己去看吧 。。

1、可变长度的参数

Java 中允许以 ...代替可变长度的参数,从而减少方法的重载次数 例如

void add(int a ,int ... args) //JVM自动把参数 args 当做一个 数组进行处理 可以很方便的 减少增加数据所花费的时间


代码示例
package me.Test ;
public class ImportTest
{
public static void main(String []agrs)
{
System.out.println(add(1,2,3,45,56,3,2,4,5,3,2,4,5));
System.out.println(add(1,2,3,4,5,6,7,8));
}
static int add(int a,int ... args)
{
int sum=a ;
for (int i=0 ;i<args.length;i++ )
sum+=args[i] ;
return sum ;

}
}

2、增强for语句来迭代集合

JDK1.5之后增加了 新的 for语句 增强for语句 可以实现对一个 实现了 Iterable 接口的集合进行 迭代操作
例如
for (int arg:args)
{
...迭代for语句 其中args可以是数组 也可以是 集合

}

代码示例

public class ImportTest
{
public static void main(String []agrs)
{
System.out.println(add(1,2,3,45,56,3,2,4,5,3,2,4,5));
System.out.println(add(1,2,3,4,5,6,7,8));
}
static int add(int a,int ... args)
{
int sum=a ;
// for (int i=0 ;i<args.length;i++ )
// sum+=args[i] ;
for(int arg:args)
{
sum+=arg ;
}
return sum ;

}
}

3、装箱与拆箱 Java的 享元模式

在java中有一种 模式叫做 装箱 和拆箱 flyweight 享元模式

例如

Integer i= 55 ; //那么自动把55 装箱成 Integer 对象
System.out.println(i) ; //自动拆箱 将Integer对象拆箱成 int型变量 输出

Integer i1= 55 ;
Integer i2= 55 ;
Integer j1= 355 ;
Integer j2= 355 ;

i1==i2 ;//结果为 true
j1==j2 ;//结果为false

原因是Java的享元模式 ,-128-127之间的数值 会存在 一个 缓存池中,下次使用的时候 先从缓存池中 取出 这个数据 ,而不会去分配它的内存 。
只有 一个字节以内的 数据才会存在缓存池中 。
比如word中 我们输入 多个 aaaaa那么 如果为每个a分配一个 内存空间 那么 内存的浪费 很严重 ,这种享元模式
就是在使用的地方引用 同一个 数据 ,就是属性相同的 一字节以内的小对象 引用同一个对象


不仅在自动拆箱和装箱中会有上述结果 就算我们自己手工创建的对象也有 享元模式

Integer i1=Integer.valueOf(333);
Integer i2=Integer.valueOf(333) ;
i1==i2 ;//false 只有-128-127之间的数据才可以利用享元模式

4、手动来写一个 枚举类

Java在最初开始设计的时候没有引入 C中的枚举 但是 在JDK1.5之后 把枚举加到了 Java语言规范中

枚举就是我们提定义好的变量 ;

比如我们在c中
enum Day={one,two,three} ;

我们可以用Day 进行枚举常理的定义
如果我们赋值的时候 值 不是 one two three 也就是 0 1 2 那么编译器就会报错处理

Day Monday=Day.one ; //如此来使用

1、利用 内部类 枚举 和 我们自己的类 来实现 枚举的简单实现
package me.Test;
//利用 我们自己的类实现枚举的功能 ,同一个包中的类是可以相互引用的 每一个java文件中只能有一个 声明为public的类
abstract class MyEnumration //只要有一个抽象方法的类 我们就要声明抽象类 我们不能直接实现这个类 但是可以通过匿名内部类来实现这个 抽象的 类
{
private MyEnumration() {} ; //定义一个私有构造函数 那么别人就不能定义对象了
public static final MyEnumration Mon=new MyEnumration()
{
public MyEnumration nextDay()
{

return Sun ; //因为是静态的所以不要用 this.来调用
}

} ;//利用内部类来返回抽象类对象
public static final MyEnumration Sun =new MyEnumration()
{
public MyEnumration nextDay()
{

return Mon ;
}

};//同上
public abstract MyEnumration nextDay();//抽象的方法是不应该指定一个 方法体的
public String toString() //重载toString方法 这是object基类的一个方法 所有类在输出地时候 自动调用这个方法 我们现在对这个方法进行重写
{
return this==Sun?"Sun":"Mon" ;
}


}


public class EnumTest
{
public static void main(String []agrs)
{
MyEnumration em=MyEnumration.Mon ; //返回静态成员
System.out.println(em);
System.out.println(em.nextDay());
}
}

你可能感兴趣的:(for循环)