java 数组扩容_Java数组扩容算法及Java对它的应用
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对它的应用相关推荐
- Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(
2019独角兽企业重金招聘Python工程师标准>>> 在Java ME游戏开发中,碰撞检测算法在Java?ME中的实现(百搜技术) 在Java ME游戏开发中,经常需要进行碰撞检测 ...
- 简单java数组程序_java(数组及常用简单算法 )
数组 数组:数组是存储同一种数据类型数据的集合容器. 数组的定义格式: 数据类型[] 变量名 = new 数据类型[长度]; 数组的好处:对分配到数组对象中每一个数据都分配一个编号(索引值.角 ...
- java数组解析_Java - 数组解析
一.什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的! 但是这只是数组的最表面的东西!深一点?就是这样 ...
- java 数组成员_java 数组中含有
<数据结构与抽象:Java语言描述(原书第4版)>一2.2.1 可变大小数组 本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.2. ...
- java 定义数组属性_Java数组的定义与使用
一.数组概念 可以将多个同一数据类型的数据,存储到同一个容器中 1. 格式 数据类型[] 数组名=new 数据类型[元素个数] "数据类型"表示该数组中可以存放哪一类型的数据 &q ...
- java 数组 反射_java数组的反射
java数组的反射,有一个JAVA API类可以运用:java.lang.reflect.Array 具体应用: 1:判断一个对象是否是数组: int arr[] = {1,2,3}; Class c ...
- Java数组参考_Java数组
数组变量 VS 数组对象 先看一例子: int[] primitiveArray; //在栈中声明了一个引用变量,暂时还没指向任何对象 primitiveArray = new int[5]; //在 ...
- java数组 方法_Java数组的十大方法
Java数组的十大方法 以下是Java Array的前10种方法.他们是来自stackoverflow的投票最多的问题. 0.声明一个数组 String[] aArray = new String[5 ...
- java 数组协变_java 数组协变
标签: 在某些情况下,即使某个对象不是数组的基类型,我们也可以把它赋值给数组元素.这种属性叫做协变(covariance).在下面的情况下可以使用协变: 数组是引用类型数组. 在赋值的对象类型和数组基 ...
- java类型的数组初始化_java数组初始化详解
介绍 学习Java的朋友想必对数组并不陌生,它需要使用之前对其进行初始化,这是因为数组是引用类型,声明数组只是声明一个引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使 ...
最新文章
- python JSON ValueError: Expecting property name: line 1 column 2 (char 1)
- 【Linux】【服务器】 CentOS7下安装MySQL(版本8.0)详细过程步骤
- hud-1495--非常可乐 VS nyoj-21--三个水杯
- iOS之CALayer的CAEmitterLayer实现“红包雨”效果
- Centos 搭建activemq
- Git初学使用命令记录
- [转载]使用命名管道实现进程间通信
- mysql的comment_mysql的comment怎么用
- 【编辑器】VSCode+PHPstudy环境配置,PHP简易开发环境搭建
- json解析与序列化
- 使用Revel(go)开发网站
- c#中ToString(yyyyMMdd) 与ToString(yyyymmdd)区别
- 【C++】凯撒密码 实现加密与解密
- 计算机会计系统管理,会计电算化系统管理实验报告.doc
- 互联网企业该如何进行风险管理
- Web前端技术课后作业
- activiti流程图下发任务报错,不能正常流转到下一个处理步骤
- linux firefox体验,Firefox插件 让你在桌面浏览器体验Firefox OS(附安装教程)
- 只有7步,就能将任何魔方6面还原
- 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
热门文章
- ORACLE 数据库的级联查询 一句sql搞定(部门多级)
- 一步步完成FastDFS + Spring MVC上传下载整合示例
- nosql笔记1_早前的时候
- 用最简单的道理说服别人,提升自己
- [j2me]二级菜单界面演练[三][0215update]
- 21.go tool pprof
- Base64,DES,RSA,SHA1,MD5 笔记
- K8S 通过 yaml 文件创建资源
- SpringMvc上传文件遇到重复读取InputStream的问题
- js使用的一些实用技巧