您的位置 首页 java

Java中的数据类型(3)

严格来说,数组是一种数据结构。但是由于它几乎在任何语言中都存在,而且在大量场合中刷存在感,出现得过于普遍,过于频繁,所以我宁可认为它其实是一种伪装成数据结构的基础数据类型。

Java 对于数组的声明也很简单,这几种方式都是合法的:

int [] a1 = { 1 , 2 , 3 };
int [] a2 = new int [] { 1 , 2 , 3 };
int [] a3 = new int [ 3 ];
int [] a4 = { new Integer( 1 ), new Integer( 2 ), 3 };
int [] a5 = new int [] { new Integer( 1 ), new Integer( 2 ), 3 };

Integer [] a6 = { 1 , 2 , 3 };

把上面的基本类型int和包装类型Integer换成其他的基本类型和包装类型也都是合法的( void 类型除外)。

Java数据有如下的几个特点:

  • 数组一旦被创建,它的大小就是不可以改变的,长度是确定的
  • 其元素必须是相同类型,不允许出现混合类型
  • 数组中的元素可以是任何数据类型,包括基本类型和包装类型
  • 数组本身就是对象
  • Java数组的下标(也就是起始序号),默认是从0开始的,所以数组最后一个元素的下标 = 数组长度 – 1
  • 读取数组元素是通过下标完成的,比如array[0]、array[10],如果读取数组中不存在元素,比如array[11],Java就会抛异常:ArraylndexOutOfBounds Exception
  • 多维数组与一维数组性质一样

关于数组,有一个并不明显的事实是:并行数组并不比普通数组快,不仅执行效率相差无几,而且并行数组还容易引发 内存泄漏 。例如:

public static void intArray () {
int [] arr = new int [ 1_000_000_000 ];
Arrays . setAll ( arr , i -> i + 1 );
}
public static void intArrayParallel () {
int [] arr = new int [ 1_000_000_000 ];
Arrays . parallelSetAll ( arr , i -> i + 1 );
}
public static void main ( String [] args) {
// intArray();
intArrayParallel
();
}

当不断调大数组元素数量时,并行数组运算很快崩溃:

Java中的数据类型(3)

当然,有些同学的机器配置很好,怎么弄都没事,那只能说性能杠杠滴!这个bug之前在Java8中容易出现,貌似高版本的 JDK 已经修复了。

由于数组和Java中的 泛型 (这个后面会讲)并不能很好地协同工作,所以在开发中,使用集合的频率还是更高一些。

最后来啰嗦一个比较好玩的东西:枚举 enum

枚举也是Java中一种较为特殊的类型,自JDK1.5引入,它除了不能继承之外,就是一个普通的类。

可以使用接口来组织枚举:

public interface Country {
enum Asia implements Country {
CHINA, JAPAN, KOEAN;
}


enum EUROPE implements Country {
ENGLISH, BRANCH, GERMANY;
}

public static void main(String[] args) {
Country country = Country.Asia.CHINA;
country = Country.EUROPE.ENGLISH;
}
}

枚举也可以嵌套:

public enum ProductCategory {
Android(Phone.Android.
class ),
iPhone (Phone.iPhone.
class );

Phone[] values;

ProductCategory(Class<? extends Phone> kind) {
values = kind.getEnumConstants();
}

interface Phone {
enum Android implements Phone {
SAMSUNG, HUAWEI, XIAOMI
}

enum iPhone implements Phone {
IPHONE4 , IPHONEX
}
}
}

有一种枚举叫常量特定方法,它在运行时方法会出现多态的行为:

public enum ConstantSpecificMethod {
DATE_TIME {
@Override
String getInfo () {
return DateFormat . getDateInstance ().format( new Date());
}
},
CLASSPATH {
@Override
String getInfo () {
return System . getenv ( “CLASSPATH” );
}
},
VERSION {
@Override
String getInfo () {
return System . getProperty ( “java.version” );
}
};

abstract String getInfo ();

public static void main ( String [] args) {
for ( ConstantSpecificMethod csm : values ()) {
System . out .println( csm .getInfo());
}
}
}

Java中还有一些比较“稀奇古怪”的语法特性,但这并不妨碍80/20原则:只需要掌握20%的知识,就能解决80%的问题。尽管Java即使没有枚举也能很好地运行,但多了解一些它们特性,一方面可以更优雅地开发。另一方面,在求职面试、技术分享、经验交流时,也能够拿得出更多的“干货”。

如果你还有其他问题,欢迎发表评论或私信留言。如果我不在,就跟机器先聊会~

文章来源:智云一二三科技

文章标题:Java中的数据类型(3)

文章地址:https://www.zhihuclub.com/182944.shtml

关于作者: 智云科技

热门文章

网站地图