Java数组扩容算法及Java对它的应用

Java数组扩容的原理

1)Java数组对象的大小是固定不变的,数组对象是不可扩容的。

2)利用数组复制方法可以变通的实现数组扩容。

3)System.arraycopy()可以复制数组。

4)Arrays.copyOf()可以简便的创建数组副本。

5)创建数组副本的同时将数组长度增加就变通的实现了数组的扩容。

源码展示:

1 public classArrays {2 /**

3 *@paramoriginal: the array to be copied4 *@paramnewLength: the length of the copy to be returned5 *@returna copy of the original array, truncated or padded with zeros6 * to obtain the specified length7 */

8 public static int[] copyOf(int[] original, intnewLength) {9 int[] copy = new int[newLength];10 System.arraycopy(original, 0, copy, 0,11 Math.min(original.length, newLength));12 returncopy;13 }14 /**

15 *@paramoriginal the array from which a range is to be copied16 *@paramfrom the initial index of the range to be copied, inclusive17 *@paramto the final index of the range to be copied, exclusive.18 * (This index may lie outside the array.)19 *@returna new array containing the specified range from the original array,20 * truncated or padded with zeros to obtain the required length21 */

22 public static int[] copyOfRange(int[] original, int from, intto) {23 int newLength = to -from;24 if (newLength < 0)25 throw new IllegalArgumentException(from + " > " +to);26 int[] copy = new int[newLength];27 System.arraycopy(original, from, copy, 0,28 Math.min(original.length -from, newLength));29 returncopy;30 }31 }

示例说明:

1 importjava.util.Arrays;2

3 /**数组变长算法!4 * 数组对象长度不可改变5 * 但是很多实际应用需要长度可变的数组6 * 可以采用复制为容量更大的新数组, 替换原数组, 实现变长操作7 **/

8 public classArrayExpand {9 public static voidmain(String[] args) {10 //数组变长(扩容)算法!

11 int[] ary={1,2,3};12 ary=Arrays.copyOf(ary, ary.length+1);13 ary[ary.length-1]=4;14 System.out.println(Arrays.toString(ary));//[1, 2, 3, 4]15 //字符串连接原理

16 char[] chs = { '中', '国'};17 chs = Arrays.copyOf(chs, chs.length + 1);18 chs[chs.length - 1] = '北';19 chs = Arrays.copyOf(chs, chs.length + 1);20 chs[chs.length - 1] = '京';21 //字符数组按照字符串打印

22 System.out.println(chs);//中国北京23 //其他数组按照对象打印

24 System.out.println(ary);//[I@4f1d0d

25 }26 }

实现案例:

案例1 : 统计一个字符在字符串中的所有位置.

字符串: 统计一个字符在字符串中的所有位置

字符: '字'

返回: {4,7}

1 public classCountCharDemo {2 public static voidmain(String[] args) {3 char key = '字';4 String str = "统计一个字符在字符串中的所有位置";5 int[] count=count(str,key);6 System.out.println(Arrays.toString(count));//[4, 7]

7 }8 public static int[] count(String str,charkey){9 int[] count={};10 for(int i=0;i

14 count=Arrays.copyOf(count, count.length+1);15 //添加序号i

16 count[count.length-1]=i;17 }18 }19 returncount;20 }21 }

char[]、String、StringBuilder

char[]:字符序列, 只有字符数据, 没有操作, 如果算法优秀, 性能最好。

String: char[] + 方法(操作, API功能)

StringBuilder: char[] + 方法(操作char[] 的内容)

String:内部包含内容不可变的char[],表现为String对象不可变。String包含操作(API方法),是对char[]操作,但不改变原对象经常返回新的对象,很多String API提供了复杂的性能优化算法,如:静态字符串池。

StringBuilder:内部也是一个char[],但是这个数组内容是可变的,并且自动维护扩容算法,因为数据内容可变,所以叫:可变字符串。StringBuilder API方法,是动态维护char[]内容,都可以改变char[]内容。

1 public abstract classAbstractStringBuilder {2 /**The value is used for character storage.*/

3 charvalue[];4 /**The count is the number of characters used.*/

5 intcount;6 /**Returns the length (character count).*/

7 public intlength() {8 returncount;9 }10

11 publicAbstractStringBuilder append(String str) {12 if (str == null)13 str = "null";14 int len =str.length();15 if (len == 0)16 return this;17 int newCount = count +len;18 if (newCount >value.length)19 expandCapacity(newCount);20 str.getChars(0, len, value, count);21 count =newCount;22 return this;23 }24

25 /**

26 * 自动实现Java数组扩容27 */

28 void expandCapacity(intminimumCapacity) {29 int newCapacity = (value.length + 1) * 2;30 if (newCapacity < 0) {31 newCapacity =Integer.MAX_VALUE;32 } else if (minimumCapacity >newCapacity) {33 newCapacity =minimumCapacity;34 }35 value =Arrays.copyOf(value, newCapacity);36 }37 }

字符串数组与String类的原理

1 /**字符串数组与String类的原理*/

2 public classCharArrayDemo {3 public static voidmain(String[] args) {4 /*Java 可以将char[]作为字符串处理*/

5 char[] ch1={'中','国','北','京'};6 char[] ch2={'欢','迎','您'};7 System.out.println(ch1);//中国北京

8 System.out.println(ch2);//欢迎您

9 /*char[]运算需要编程处理,如连接:*/

10 char[] ch3=Arrays.copyOf(ch1, ch1.length+ch2.length);11 System.arraycopy(ch2, 0, ch3, ch1.length, ch2.length);12 System.out.println(ch3);//中国北京欢迎您

13 /*String API提供了简洁的连接运算:*/

14 String str1="中国北京";15 String str2="欢迎您";16 String str3=str1.concat(str2);17 System.out.println(str3);//中国北京欢迎您

18 /*字符串转大写:*/

19 char[] ch4={'A','a','c','f'};20 char[] ch5=Arrays.copyOf(ch4, ch4.length);21 for(int i=0;i='a' && c<='z'){24 ch5[i]=(char)(c+('A'-'a'));25 }26 }27 System.out.println(ch5);//AACF, 原数组ch4不变

28 String str4="Aacf";29 String str5=str4.toUpperCase();//原字符串str4保持不变

30 System.out.println(str5);//AACF

31 }32 }

java 数组扩容_Java数组扩容算法及Java对它的应用相关推荐

  1. Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(

    2019独角兽企业重金招聘Python工程师标准>>> 在Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(百搜技术) 在Java ME游戏开发中,经常需要进行碰撞检测 ...

  2. 简单java数组程序_java(数组及常用简单算法 )

    数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[]  变量名  =  new  数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...

  3. java数组解析_Java - 数组解析

    一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的! 但是这只是数组的最表面的东西!深一点?就是这样 ...

  4. java 数组成员_java 数组中含有

    <数据结构与抽象:Java语言描述(原书第4版)>一2.2.1 可变大小数组 本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.2. ...

  5. java 定义数组属性_Java数组的定义与使用

    一.数组概念 可以将多个同一数据类型的数据,存储到同一个容器中 1. 格式 数据类型[] 数组名=new 数据类型[元素个数] "数据类型"表示该数组中可以存放哪一类型的数据 &q ...

  6. java 数组 反射_java数组的反射

    java数组的反射,有一个JAVA API类可以运用:java.lang.reflect.Array 具体应用: 1:判断一个对象是否是数组: int arr[] = {1,2,3}; Class c ...

  7. Java数组参考_Java数组

    数组变量 VS 数组对象 先看一例子: int[] primitiveArray; //在栈中声明了一个引用变量,暂时还没指向任何对象 primitiveArray = new int[5]; //在 ...

  8. java数组 方法_Java数组的十大方法

    Java数组的十大方法 以下是Java Array的前10种方法.他们是来自stackoverflow的投票最多的问题. 0.声明一个数组 String[] aArray = new String[5 ...

  9. java 数组协变_java 数组协变

    标签: 在某些情况下,即使某个对象不是数组的基类型,我们也可以把它赋值给数组元素.这种属性叫做协变(covariance).在下面的情况下可以使用协变: 数组是引用类型数组. 在赋值的对象类型和数组基 ...

  10. java类型的数组初始化_java数组初始化详解

    介绍 学习Java的朋友想必对数组并不陌生,它需要使用之前对其进行初始化,这是因为数组是引用类型,声明数组只是声明一个引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使 ...

最新文章

  1. python JSON ValueError: Expecting property name: line 1 column 2 (char 1)
  2. 【Linux】【服务器】 CentOS7下安装MySQL(版本8.0)详细过程步骤
  3. hud-1495--非常可乐 VS nyoj-21--三个水杯
  4. iOS之CALayer的CAEmitterLayer实现“红包雨”效果
  5. Centos 搭建activemq
  6. Git初学使用命令记录
  7. [转载]使用命名管道实现进程间通信
  8. mysql的comment_mysql的comment怎么用
  9. 【编辑器】VSCode+PHPstudy环境配置,PHP简易开发环境搭建
  10. json解析与序列化
  11. 使用Revel(go)开发网站
  12. c#中ToString(yyyyMMdd) 与ToString(yyyymmdd)区别
  13. 【C++】凯撒密码 实现加密与解密
  14. 计算机会计系统管理,会计电算化系统管理实验报告.doc
  15. 互联网企业该如何进行风险管理
  16. Web前端技术课后作业
  17. activiti流程图下发任务报错,不能正常流转到下一个处理步骤
  18. linux firefox体验,Firefox插件 让你在桌面浏览器体验Firefox OS(附安装教程)
  19. 只有7步,就能将任何魔方6面还原
  20. 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法

热门文章

  1. ORACLE 数据库的级联查询 一句sql搞定(部门多级)
  2. 一步步完成FastDFS + Spring MVC上传下载整合示例
  3. nosql笔记1_早前的时候
  4. 用最简单的道理说服别人,提升自己
  5. [j2me]二级菜单界面演练[三][0215update]
  6. 21.go tool pprof
  7. Base64,DES,RSA,SHA1,MD5 笔记
  8. K8S 通过 yaml 文件创建资源
  9. SpringMvc上传文件遇到重复读取InputStream的问题
  10. js使用的一些实用技巧