为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的数据类型(3)

标签:
Java

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

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就会抛异常ArraylndexOutOfBoundsException

多维数组与一维数组性质一样

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

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();
}


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

https://img1.sycdn.imooc.com//633ced0a0001128c10560134.jpg


当然有些同学的机器配置很好怎么弄都没事那只能说性能杠杠滴这个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即使没有枚举也能很好地运行,但多了解一些它们特性,一方面可以更优雅地开发另一方面,在求职面试、技术分享、经验交流时,能够拿得出更多的“干货”

 

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

 


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消