一、双括号初始化语法(DoubleBraceInitialization)(这里指的是大括号{})
主要指的是集合类(List,Map,Set等),我们创建一个常量集合或传递一个常量集合作为参数,往往都会这么做(以Set为例):
1
2
3
4
5
6
|
Set<String> validCodes = new HashSet<String>(); validCodes.add( "XZ13s" ); validCodes.add( "AB21/X" ); validCodes.add( "YYLEX" ); validCodes.add( "AR2D" ); removeProductsWithCodeIn(validCodes); |
1
|
或在类中初始化一个常量集合: |
1
2
3
4
5
6
7
|
private
static final Set<String> VALID_CODES = new HashSet<String>(); static { validCodes.add( "XZ13s" ); validCodes.add( "AB21/X" ); validCodes.add( "YYLEX" ); validCodes.add( "AR2D" ); } |
1
|
会不会觉得每次都这样很费时费力,其实,有更好的办法,那就是双括号语法,像下面这样: |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
private
static final Set<String> VALID_CODES = new HashSet<String>() {{ add( "XZ13s" ); add( "AB21/X" ); add( "YYLEX" ); add( "AR2D" ); }}; // Or: removeProductsWithCodeIn( new HashSet<String>(){{ add( "XZ13s" ); add( "AB21/X" ); add( "YYLEX" ); add( "AR5E" ); }}); |
这里解释下这两个括号:第一个括号创建了一个新的匿名内部类,相信这个大家都知道;第二个括号声明了匿名内部类实例化时运行的实例初始化块。
使用双括号语法需要注意两点:
1. 如果要在匿名内部类中要建立匿名子类,那么只能用于非final的类,这很明显,且不仅局限于集合类,可以用来实例化任何对象,例如用于GUI对象,如下:
1
2
3
4
5
6
|
add( new JPanel() {{ setLayout(...); setBorder(...); add( new JLabel(...)); add( new JSpinner(...)); }}); |
1
|
2 . 这种语法与常用的equals( Object o)方法不兼容。例如Example类有这样的方法: |
1
2
3
4
5
6
7
8
9
10
|
public
boolean equals( final Object o) { if (o == null ) { return false ; } else if (!getClass().equals(o.getClass())) { return false ; } else { Example other = (Example) o; // Compare this to other. } } |
那么,使用双括号初始化语法创建的任何对象都不会与未使用双括号语法创建的对象相等。因此,建议大家:如果类中需要equals(Object o)方法,那就老老实实不要使用这种语法了。不过集合类没有这种问题,应该是因为集合内部优化了的原因。
那么什么时候建议大家使用双括号语法呢?
如果你只是要创建并初始化一个实例而不是创建一个新类,或者创建任何不添加字段属性或重载方法的匿名类时,用双括号语法就很nice了。
3. 如果你用的是集合类且该类有构造器参数接受另一个集合生成该集合的实例,那么有个更好的更惯用的替代方法,如大家都知道的List初始化可以用Arrays.asList(),如下:
1
|
List<String> myList = new ArrayList<String>(Arrays.asList( "One" , "Two" , "Three" )); |
1
|
<strong>但需要注意:asList返回的是一个长度不可变的列表。数组是多长,转换成的列表是多长,
ava保留两位小数问题:
方式一:
四舍五入 方式二:
java.text.DecimalFormat df =new java.text.DecimalFormat("#.00"); 例:new java.text.DecimalFormat("#.00").format(3.1415926) #.00 表示两位小数 #.0000四位小数 以此类推... 方式三: double d = 3.1415926; String result = String .format("%.2f"); %.2f %. 表示 小数点前任意位数 2 表示两位小数 格式后的结果为f 表示浮点型 方式四: NumberFormat ddf1=NumberFormat.getNumberInstance() ;
void setMaximumFractionDigits(int digits)
import java.text.* ;
格式化时间new Date(String str).format("Y-m-d") 2013-01-24
Java Math的 floor,round和ceil的总结floor :返回小于它的最大整数 ceil :返回大于它的最小整数
Calendar的使用 获取星期 Calendar now =Calendar.getInstance(); 获取多少天后的时间 Calendar now =Calendar.getInstance();
在eclipse中配置jvm(提高环境配置的迁移性)在eclipse.ini文件第一行(注意一定要插入到第一行) -vm |