数组(Array):相同类型数据的集合。
定义数组
方式1(推荐,更能表明数组类型)
type[] 变量名 = new type[数组中元素的个数];
比如:
int[] a = new int[10];
数组名,也即引用a,指向数组元素的首地址。
方式2(同C语言)
type变量名[] = new type[数组中元素的个数];
如:
int a[] = new int[10];
方式3 定义时直接初始化
type[] 变量名 = new type[]{逗号分隔的初始化值};
其中红色部分可省略,所以又有两种:
int[] a = {1,2,3,4};
int[] a = new int[]{1,2,3,4};
其中int[] a = new int[]{1,2,3,4};的第二个方括号中不能加上数组长度,因为元素个数是由后面花括号的内容决定的。
数组运用基础
数组长度
Java中的每个数组都有一个名为length的属性,表示数组的长度。
length属性是public final int的,即length是只读的。数组长度一旦确定,就不能改变大小。
equals()
数组内容的比较可以使用equals()方法吗?
如下程序:
{
public static void main(String[] args)
{
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a.equals(b));
}
}
输出结果是false。
所以证明不能直接用equals()方法比较数组内容,因为没有override Object中的实现,所以仍采用其实现,即采用==实现equals()方法,比较是否为同一个对象。
怎么比较呢?一种解决方案是自己写代码,另一种方法是利用java.util.Arrays。
java.util.Arrays中的方法全是static的。其中包括了equals()方法的各种重载版本。
代码如下:
public class ArrayEqualsTest
{
//Compare the contents of two int arrays
public static boolean isEquals(int[] a, int[] b)
{
if( a == null || b == null )
{
return false;
}
if(a.length != b.length)
{
return false;
}
for(int i = 0; i < a.length; ++i )
{
if(a[i] != b[i])
{
return false;
}
}
return true;
}
public static void main(String[] args)
{
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(isEquals(a,b));
System.out.println(Arrays.equals(a,b));
}
}
数组元素不为基本数据类型时
数组元素不为基本原生数据类型时,存放的是引用类型,而不是对象本身。当生成对象之后,引用才指向对象,否则引用为null。
如下列程序:
{
public static void main(String[] args)
{
Person[] p = new Person[3];
//未生成对象时,引用类型均为空
System.out.println(p[0]);
//生成对象之后,引用指向对象
p[0] = new Person(10);
p[1] = new Person(20);
p[2] = new Person(30);
for(int i = 0; i < p.length; i++)
{
System.out.println(p[i].age);
}
}
}
class Person
{
int age;
public Person(int age)
{
this.age = age;
}
}
sqlMap文件中的resultMap:
<result column="ID" property="id" jdbcType="DECIMAL" />
<result column="NAME" property="name" jdbcType="VARCHAR" />
<result column="DISCTRIPTION" property="disctription" jdbcType="VARCHAR" />
<result column="DURATION" property="duration" jdbcType="DECIMAL" />
<result column="STATUS" property="status" jdbcType="DECIMAL" />
<result column="AD_COUNT" property="adCount" jdbcType="DECIMAL" />
<result column="BEGIN_TIME" property="beginTime" jdbcType="DATE" />
<result column="END_TIME" property="endTime" jdbcType="DATE" />
<result column="MARKET_PRICE" property="marketPrice" jdbcType="DECIMAL" />
<result column="PRICE" property="price" jdbcType="DECIMAL" />
<result column="RELEASE_TEL_NUM" property="releaseTelNum" jdbcType="DECIMAL" />
<result column="RELEVANCE_TEL_NUM" property="relevanceTelNum" jdbcType="DECIMAL" />
<result property="productPackageList" column="{productId=ID,areaId=areaId,status=status}"
select="ProductPackageSQL.getByProductId"/>
</resultMap>
注意productPackageList字段是,利用了select="ProductPackageSQL.getByProductId"来实现的。
getByProductId的select是这样的:
select * from TB_PRODUCT_PACKAGE where
PRODUCT_ID = #productId#
<isNotNull property="areaId" prepend="and">
AREA_ID = #areaId#
</isNotNull>
<isNotNull property="status" prepend="and">
STATUS = #status#
</isNotNull>
</select>
productAndPackageResult 用到的地方:
select ID,NAME,DISCTRIPTION,DURATION,STATUS,PRICE,AD_COUNT,BEGIN_TIME,END_TIME,
MARKET_PRICE,PRICE,RELEASE_TEL_NUM,RELEVANCE_TEL_NUM ,#areaId# as areaId,#status# as status
from TB_PRODUCT
<dynamic prepend="where">
<isNotEmpty prepend="and" property="productId">
ID = #productId#
</isNotEmpty
Nagle算法的规则(可参考tcp_output.c文件里tcp_nagle_check函数注释):
(1)如果包长度达到MSS,则允许发送;
(2)如果该包含有FIN,则允许发送;
(3)设置了TCP_NODELAY选项,则允许发送;
(4)未设置TCP_CORK选项时,若所有发出去的小数据包(包长度小于MSS)均被确认,则允许发送;