Java容器深入浅出之数组
写在前面
关于Java的学习,特别是对于非计算机专业的同学来说,我总是主张从实践中来,到实践中去的学习方法。Java本身是一门应用性特别强的高级编程语言,因此如果能在基于实际开发的经验基础上,对JavaSE的核心知识做总结和梳理,将非常有利于沉淀自身的技术知识,并且为进一步的深入研究打好基础。
JavaSE的知识层次,基于我的经验,可以分为4点:
1. 基础知识:包括基本数据类型、语法规范、运算符、流程控制和异常。
2. 面向对象:包括封装、继承和多态的Java实现及相关语言特性。
3. 基础进阶:包括常用类、容器、JDBC、IO等。
4. 高阶深入:包括多线程、反射、JMM、JVM及网络编程等。
Java企业级开发,包括Web应用、分布式及大数据等高可靠、高并发和高可用的系统均来自于这些基础的实现。
关于容器
容器在日常开发中的地位不言而喻,小到链表的实现,大到消息队列的框架,都与容器息息相关。当完成了Java基础知识和面向对象知识的学习之后,就可以开始学习容器并深入理解Java基本数据结构的底层实现原理。
Java的容器大致可以分为数组、字符串对象和集合;
数组的基本使用
Java数组的要点:
1. 数组完成初始化,在内存中的长度固定,不可改变;
2. 数组可以存放基本数据类型和对象的引用,但只能保存同一种类型的数据。
数组的定义:
type[] arrayName;
数组的初始化:
1. 静态初始化:显式指定每个数组元素的初始值
arrayName = new type[]{element1, element2, element3...};
arrayName = {element1, element2, element3...};
2. 动态初始化:只给定数组长度,由系统指定元素的默认初始值
arrayName = new type[length];
数组的使用:
1. 查:通过索引获取数组某个元素的值
2. 改:通过索引对数组某个元素的值更新(典型的如循环赋值)
Java8增强的Array类
Array类的若干static方法可以方便对数组进行操作:
1. 查找
int binarySearch(type[] a, type key) --- 数组按升序排列,通过二分法查找key在a中的索引,没有则返回负数。
int binarySearch(type[] a, int from, int to, type key) --- 数组按升序排列,通过二分法查找key在a的from和to中的索引,没有则返回负数。
2. 排序
void sort(type[] a) --- 排序
void sort(type[] a, int from, int to) --- from到to之间的元素进行排序
3. 复制
type[] copyOf(type[] original, int length) --- 把original复制成一个新数组:
3.1 如果length等于original的长度,全部复制;
3.2 如果length小于original的长度,只复制前length位
3.3 如果length大于original的长度,余下的系统默认初始值赋值
type[] copyOfRange(type[] original, int from, int to) --- 把original的from到to复制成一个新数组
4. 转换
void fill(type[] a, type val) --- 将a的所有元素赋值为val
void fill(type[] a, int from, int to, type val) --- 将a的从from到to的元素赋值为val
String toString(type[] a) --- 转换为一个字符串
5. 判断
boolean equals(type[] a, type[] b) --- 长度和元素均相等的两个数组则返回true
Arrays类Demo如下:
package org.leo.demo.arrays;
import java.util.Arrays;
public class TestArrays {
public static void main(String[] args) {
int[] a = new int[] {3,4,5,6};
int[] a2 = {3,4,5,6};
System.out.println("a equals a2? " + Arrays.equals(a, a2));
int[] b = Arrays.copyOf(a, 6);
System.out.println("a equals b? " + Arrays.equals(a, b));
System.out.println("b array is: " + Arrays.toString(b));
Arrays.fill(b, 2, 4, 1);
System.out.println("b array is: " + Arrays.toString(b));
Arrays.sort(b);
System.out.println("b array is: " + Arrays.toString(b));
System.out.println("the index of number 1 in b is:" + Arrays.binarySearch(b, 1));
}
}
Java容器深入浅出之数组的更多相关文章
- Java容器深入浅出之Collection与Iterator接口
Java中用于保存对象的容器,除了数组,就是Collection和Map接口下的容器实现类了,包括用于迭代容器中对象的Iterator接口,构成了Java数据结构主体的集合体系.其中包括: 1. Co ...
- Java容器深入浅出之Map、HashMap、Hashtable及其它实现类
在Java中,Set的底层事实上是基于Map实现的,Map内部封装了一个Entry内部接口,由实现类来封装key-value对,当value值均为null时,key的集合就形成了Set.因此,Map集 ...
- Java容器深入浅出之List、ListIterator和ArrayList
List是Collection接口的子接口,表示的是一种有序的.可重复元素的集合. List接口的主要实现类ArrayList和Vector,底层都是维护了一套动态的,可扩展长度的Object[]数组 ...
- Java容器深入浅出之String、StringBuffer、StringBuilder
对字符串的花式处理一直是现代应用系统的主要操作之一,也是对Java基础知识考察的重要方面.事实上,Java字符串类的底层是通过数组来实现的.具体来说,String类是固定长度的数组,StringBuf ...
- Java容器深入浅出之HashSet、TreeSet和EnumSet
Java集合中的Set接口,定义的是一类无顺序的.不可重复的对象集合.如果尝试添加相同的元素,add()方法会返回false,同时添加失败.Set接口包括3个主要的实现类:HashSet.TreeSe ...
- Java容器深入浅出之PriorityQueue、ArrayDeque和LinkedList
Queue用于模拟一种FIFO(first in first out)的队列结构.一般来说,典型的队列结构不允许随机访问队列中的元素.队列包含的方法为: 1. 入队 void add(Object o ...
- Java 容器源码分析之ConcurrentHashMap
深入浅出ConcurrentHashMap(1.8) 前言 HashMap是我们平时开发过程中用的比较多的集合,但它是非线程安全的,在涉及到多线程并发的情况,进行put操作有可能会引起死循环,导致CP ...
- 【Java心得总结七】Java容器下——Map
我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...
- 【Java心得总结六】Java容器中——Collection
在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...
随机推荐
- JQuery补充——获取与设置表单值
//写jQuery代码时注意前面一定要记得加$(function(){});,在文档加载完成后进行代码的编写 使用jQuery的表单对象属性来选择被选中的项::checked,详见文档选择器部分 根据 ...
- 20155210潘滢昊 2016-2017-2 《Java程序设计》第2周学习总结
20155210潘滢昊 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 %%:表示字符串中的%. %d:以十进制整数格式输出 %f:以十进制浮点式格式输出 % ...
- GBDT为什么不能并行,XGBoost却可以
传统的GBDT是以CART作为基分类器,xgboost还支持线性分类器,这个时候XGBOOST相当于带L1和L2正则化的逻辑斯蒂回归(分类问题)或者线性回归(回归问题).传统的GBDT在优化的hih只 ...
- Angular ng-include 学习实例
ng-include 可以引入外部的文件到当前视图中.这样可以增强复用性. 最简单的用法 <div ng-include src="'/public/template/tpl.htm ...
- javaweb(三十八)——mysql事务和锁InnoDB(扩展)
MySQL/InnoDB的加锁分析,一直是一个比较困难的话题.我在工作过程中,经常会有同事咨询这方面的问题.同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题.本文,准备就My ...
- 教你thinkphp5怎么配置二级域名
有些项目要将移动端和PC端分离开来,比如访问xxx.com,展示的是PC端的页面.而访问m.xxx.com,展示的是移动端的页面.thinkphp源码需要多多学习,这里记录一下知识点,顺便分享给需要的 ...
- Winrar去广告图文教程
一.前言 1.1 Winrar 解压缩工具 市场上有很多优秀的压缩工具,常用的有Winrar 和360 压缩工具.Winrar是免费压缩工具,特色是每次使用都会弹出广告.影响用户体验和工作效率,当然最 ...
- Tree Traversals Again(根据前序,中序,确定后序顺序)
题目的大意是:进行一系列的操作push,pop.来确定后序遍历的顺序 An inorder binary tree traversal can be implemented in a non-recu ...
- Office 365 Powershell 连接命令
国内版 第一步: Import-Module msonline Connect-MsolService 输入用户名密码 第二步: Get-MsolUser" 第三步: Set-Executi ...
- 算法笔记(c++)-使用递归函数逆序一个栈
---恢复内容开始--- 使用递归函数逆序一个栈 题目:使用递归函数,不借助其他数据结构逆序一个栈. 我的思路:使用递归函数保存栈中变量. 递归函数分两个,一个获取并移除栈底元素,另一个负责逆序.其实 ...