-
java数组api (off, len) 与 (begin, end)的问题
2017-06-27 00:55:13前言java 关于操作数据的api中大多是如题目的两种形式,例如:public static char[] copyOfRange(char[] original, int from, int to)public static native void arraycopy(Object src, int srcPos,前言
java 关于操作数据的api中大多是如题目的两种形式,例如:
public static char[] copyOfRange(char[] original, int from, int to)
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
以前就知道关于(begin, end)的参数是截头不截尾的。
char[] chars = {'a', 'b', 'c', 'd'}; Arrays.copyOfRange(chars, 1,3);
会返回字符数组{‘b’, ‘c’}
返回的数组长度为 end - begin ==> 2而(off, len)代表从off处截取len个长度的数组
实际截取的长度为len
例如:char[] chars = {'a', 'b', 'c', 'd'}; char[] cy = new char[5]; System.arraycopy(chars, 1, cy, 1, 3);
得么的cp字符数组应该是{‘b’, ‘c’, ‘d’, ‘\u0000’, ‘\u0000’}
实际截取了3个长度关于越界问量的思考
以前在使用这样的方法时,超级害怕越界问题,每次都瓣着手指头算半天,今天算是开窍了。
如果是(begin, end)这样的参数,只需要判断:
end > srcArr.length就可以, 如果该条件为真,则肯定会发生越界如果是(off, len)这样的参数,只需要判断:
off + len > srcArr.length, 如果该条件为真,则肯定会发生越界二者之间的换算问题
(begin, end) 换算成 (off, len)
off = begin len = end - begin
(off, len) 换算成 (begin, end)
begin = off end = off + len
总结
别嫌我笨,咱们还能愉快的玩耍
如果这样换算出错了,提刀来见我(我肯定剁了你<- _ -!>
) -
string和char数组:两者之间的互相转换
2011-02-27 18:56:00以前用JAVA比较少,没怎么留意 随着现在用Java的频率越来越高,一些不起眼的小问题也会让人捉摸一下,当然了要养成良好的习惯,遇到问题先去看API。 这可是多少前辈的经验啊。 话不多说,进入...以前用JAVA比较少,没怎么留意
随着现在用Java的频率越来越高,一些不起眼的小问题也会让人捉摸一下,当然了要养成良好的习惯,遇到问题先去看API。
这可是多少前辈的经验啊。
话不多说,进入正题。
其实这个东西并不难,Java提供现成的API实现两者的转换,在这里写下就是加强一下记忆。
1) String转换为char[] :
String str = "abcd";
char[] temp;
temp = str.toCharArray();
2) char[]转换为String :
char[] temp = { 'a' , 'b' , 'c' , 'd '};
有两种方法可以进行转换
1、str = new String( temp); //实际调用的是String的一个构造函数 String(char[] value)
2、str = String.valueOf( temp); //实际调用的是String类的一个方法 -
关于java的arrays数组排序示例AJPFX的分享
2019-05-08 23:10:39Java API对Arrays类的说明是:此类包含用来操作数组(比如排序和搜索)的各种方法。 1.对基本数据类型的数组的排序说明:(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;(2)比如int[],double[],char[]等...Java API对Arrays类的说明是:此类包含用来操作数组(比如排序和搜索)的各种方法。
1.对基本数据类型的数组的排序
说明:
(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;
(2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是提供了默认的升序排列,没有提供相应的降序排列方法。
(3)要对基础类型的数组进行降序排序,需要将这些数组转化为对应的封装类数组,如Integer[],Double[],Character[]等,对这些类数组进行排序。(其实还不如先进行升序排序,自己在转为将序)。
用默认的升序对数组排序
函数原型:static void sort(int[] a) 对指定的 int 型数组按数字升序进行排序。
static void sort(int[] a, int fromIndex, int toIndex) 对指定 int 型数组的指定范围按数字升序进行排序。
代码实例:[url=]复制代码[/url]代码如下:
import java.util.Arrays;
public class ArraysSort_11 {
public static void main(String args[])
{
int[] a={1,4,-1,5,0};
Arrays.sort(a);
//数组a[]的内容变为{-1,0,1,4,5}
for(int i=0;i<a.length;i++)
System.out.print(a+" ");
}
}2.对复合数据类型的数据的排序
函数原型:
(1)public static<T> void sort(T[] a,Comparator c) 根据指定比较器产生的顺序对指定对象数组进行排序。
(2)public static<T> void sort(T[] a,int fromIndex,int toIndex,Comparator c) 根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。
说明:这个两个排序算法是“经过调优的合并排序”算法。
代码实例:[url=]复制代码[/url]代码如下:
package aa;
import java.util.Arrays;
import java.util.Comparator;
public class Arraysort {
Point[] arr;Arraysort(){ arr=new Point[4]; //定义对象数组arr,并分配存储的空间 for(int i=0;i<4;i++) arr=new Point(); } public static void main(String[] args) { Arraysort sort=new Arraysort(); sort.arr[0].x=2;sort.arr[0].y=1; //初始化,对象数组中的数据 sort.arr[1].x=2;sort.arr[1].y=2; sort.arr[2].x=1;sort.arr[2].y=2; sort.arr[3].x=0;sort.arr[3].y=1; Arrays.sort(sort.arr, new MyComprator()); //使用指定的排序器,进行排序 for(int i=0;i<4;i++) //输出排序结果 System.out.println("("+sort.arr.x+","+sort.arr.y+")"); }
}
class Point{
int x;
int y;
}
//比较器,x坐标从小到大排序;x相同时,按照y从小到大排序
class MyComprator implements Comparator {
public int compare(Object arg0, Object arg1) {
Point t1=(Point)arg0;
Point t2=(Point)arg1;
if(t1.x != t2.x)
return t1.x>t2.x? 1:-1;
else
return t1.y>t2.y? 1:-1;
}
}转载于:https://blog.51cto.com/14314113/2391344
-
delphi64位 char数组转换string中文乱码_使用位运算、值交换等方式反转java字符串-共四种方法...
2021-01-09 08:31:59在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法。 StringBuilder(str).reverse() char[]循环与值交换 byte循环与值交换 apache-commons-lang3 如果是为了进行开发,请选择...在本文中,我们将向您展示几种在Java中将String类型的字符串字母倒序的几种方法。
StringBuilder(str).reverse()
char[]
循环与值交换byte
循环与值交换- apache-commons-lang3
如果是为了进行开发,请选择
StringBuilder(str).reverse()
API。出于学习的目的,我们可以研究char[]
和byte
方法,其中涉及到值互换和移位运算技术,这些技术对于了解StringBuilder(str).reverse()
API黑匣子背后原理非常有帮助。1.
StringBuilder(str).reverse()
在Java中,我们可以使用
StringBuilder(str).reverse()
使字符串字母倒序。public class ReverseString1 { public static void main(String[] args) { String str = "Reverse a String in Java"; StringBuilder sb = new StringBuilder(str).reverse(); System.out.println(sb.toString()); } }
输出结果
avaJ ni gnirtS a esreveR
2.
char[]
首先,我们将字符串转换为char数组,并逐个循环char数组,并使用temp变量交换值。
public class ReverseString2 { public static void main(String[] args) { String str = "Hello World"; System.out.println(reverse(str)); // dlroW olleH } public static String reverse(String input) { if (input == null || input.length() < 0) throw new IllegalArgumentException("Please provide an input!"); char[] result = input.toCharArray(); int startIndex = 0; int endIndex = result.length - 1; char temp; for (; endIndex > startIndex; startIndex++, endIndex--) { temp = result[startIndex]; result[startIndex] = result[endIndex]; result[endIndex] = temp; } return new String(result); } }
上面的算法需要5个循环(长度/ 2)来使字符串倒序“ Hello World”。
------------------------------------ H e l l o W o r l d ------------------------------------ 0 1 2 3 4 5 6 7 8 9 10 ------------------------------------ Loop #1 - Swap index 0 <-> index 10 ------------------------------------ {d} e l l o W o r l {H} ------------------------------------ {0} 1 2 3 4 5 6 7 8 9 {10} ------------------------------------ Loop #2 - Swap index 1 <-> index 9 ------------------------------------ d {l} l l o W o r {e} H ------------------------------------ 0 {1} 2 3 4 5 6 7 8 {9} 10 ------------------------------------ Loop #3 - Swap index 2 <-> index 8 ------------------------------------ d l {r} l o W o {l} e H ------------------------------------ 0 1 {2} 3 4 5 6 7 {8} 9 10 ------------------------------------ Loop #4 - Swap index 3 <-> index 7 ------------------------------------ d l r {o} o W {l} l e H ------------------------------------ 0 1 2 {3} 4 5 6 {7} 8 9 10 ------------------------------------ Loop #5 - Swap index 4 <-> index 6 ------------------------------------ d l r o {W} {o} l l e H ------------------------------------ 0 1 2 3 {4} 5 {6} 7 8 9 10 ------------------------------------
3.
Byte[] – StringBuilder(str).reverse(str)
以下代码段类似于
StringBuilder(str).reverse()
的内部实现(UTF16内容除外)。import java.nio.charset.StandardCharsets; public class ReverseString3 { public static void main(String[] args) { String str = "Hello World"; System.out.println(reverse(str)); } public static String reverse(String input) { if (input == null || input.length() < 0) throw new IllegalArgumentException("Please provide an input!"); byte[] val = input.getBytes(StandardCharsets.UTF_8); int length = val.length - 1; for (int start = (length - 1) >> 1; start >= 0; start--) { int end = length - start; byte temp = val[start]; val[start] = val[end]; val[end] = temp; // debugging //System.out.println(String.format("start=%s, end=%s", start, end)); } return new String(val); } }
最令人困惑的部分是右移运算符
(length - 1) >> 1
,这是什么意思?查看下面的8位示例,您可以找到规律吗?System.out.println(10>>1); // 10 -> 5 0000 1010 = 10 0000 0101|0 = 10 >> 1 = 5 System.out.println(4>>1); // 4 -> 2 0000 0100 = 4 0000 0010|0 = 4 >> 1 = 2 System.out.println(100>>1); // 100 -> 50 0110 0100 = 100 00110 010|0 = 100 >> 1 = 50 System.out.println(7>>1); // 7 -> 3 0000 0111 = 7 0000 0011|1 = 7 >> 1 = 3
对于数字,每右移1位,金额将减少该值的一半并四舍五入。这
(length - 1) >> 1
试图找出字符串的中间点。number >> 1 = round_down(number/2) or Math.flooa(number/2)
值交换从内部开始,然后扩展到外部。
for (int start = (length - 1) >> 1; start >= 0; start--) { int end = length - start; byte temp = val[start]; val[start] = val[end]; val[end] = temp; }
上面的算法图示如下:
------------------------------------ H e l l o W o r l d ------------------------------------ 0 1 2 3 4 5 6 7 8 9 10 ------------------------------------ Loop #1 - Swap index 4 <-> index 6 ------------------------------------ H e l l {W} {o} o r l d ------------------------------------ 0 1 2 3 {4} 5 {6} 7 8 9 10 ------------------------------------ Loop #2 - Swap index 3 <-> index 7 ------------------------------------ H e l {o} W o {l} r l d ------------------------------------ 0 1 2 {3} 4 5 6 {7} 8 9 10 ------------------------------------ Loop #3 - Swap index 2 <-> index 8 ------------------------------------ H e {r} o W o l {l} l d ------------------------------------ 0 1 {2} 3 4 5 6 7 {8} 9 10 ------------------------------------ Loop #4 - Swap index 1 <-> index 9 ------------------------------------ H {l} r o W o l l {e} d ------------------------------------ 0 {1} 2 3 4 5 6 7 8 {9} 10 ------------------------------------ Loop #5 - Swap index 0 <-> index 10 ------------------------------------ {d} l r o W o l l e {H} ------------------------------------ {0} 1 2 3 4 5 6 7 8 9 {10} ------------------------------------
4. Apache commons-lang3
对于Apache commons-lang3库,我们可以使用
StringUtils.reverse
反转字符串和StringUtils.reverseDelimited
反转单词。pom.xml
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.10</version> </dependency>
import org.apache.commons.lang3.StringUtils; public class ReverseString3 { public static void main(String[] args) { System.out.println(StringUtils.reverse("Hello World Java")); // reverse string System.out.println(StringUtils.reverseDelimited("Hello World Java", ' ')); // reverse words } }
输出结果
avaJ dlroW olleH Java World Hello
查看其源代码,
Apache-commons-lang3
其实是使用new StringBuilder(str).reverse()
来反转字符串。package org.apache.commons.lang3; public class StringUtils { public static String reverse(final String str) { if (str == null) { return null; } return new StringBuilder(str).reverse().toString(); } //... }
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
-
java二维数组内存模型_二级指针做输入的第二种内存模型: 二维数组
2021-03-15 19:11:23有二维数组char myArray[10][30]。写打印函数和排序函数打印API:void printMyArray02(char myArray[10][30], int num){int i = 0;for (i = 0; i < num; i++){printf("%s\n", myArray[i]);// printf("%s\n", *... -
Java打印二维数组
2017-04-21 00:41:58,其参数为数组名或数组指针,其支持的数据类型有很多,如:int[]、char[]、byte[]等。但是对二维数组调用同样的API,如:int[][] test = {{0, 1, 2}, {2, 1}, {1}}; System.out.println ( Arrays.toSt -
java 将字符串 数组 去重_Java中字符串去重的特性介绍
2021-02-28 14:33:17尤其数包含独立UTF-16字符的char[]数组对JVM内存的消耗贡献最多——因为每个字符占用2位。内存的30%被字符串消耗其实是很常见的,不仅是因为字符串是与我们互动的最好的格式,而且是由于流行的HTTP API使用了大量的... -
Java Arrays类进行数组排序
2018-09-15 14:23:29Java API对Arrays类的说明是:此类包含用来操作数组(比如排序和搜索)的各种方法。 1.对基本数据类型的数组的排序 说明:(1)Arrays类中的sort()使用的是“经过调优的快速排序法”; (2)比如int[],double[],... -
Java中Arrays.toString ()打印二维数组及Array数组的常用操作
2018-11-04 17:07:35已知打印一维数组的API为System.out.println ( Arrays.toString ();,其参数为数组名或数组指针,其支持的数据类型有很多,如:int[]、char[]、byte[]等。 import java.util.Arrays; public class ArrayPrint { ... -
Java中常用的API
2020-02-29 15:52:391 Java中常用的API 1.1 StringBuffer 1.1.1 StringBuffer概述 为了解决String字符串操作导致的内存冗余,提高效率,Java中提供了StringBuffer和StringBuilder来操作字符串,并且提供了很多方法,便于程序员开发。 &... -
Java数据结构与算法之Array数组
2016-09-30 17:19:323.java中针对数组的API 4.数组排序 5.字符串转数组(char[]/int[]) 6.二维数组的操作 1.数组概述 数组是重要的数据结构之一,以线性结构来存储固定数量大小,数据类型相同的数据 2.java中数组的初始化 (1)声明和... -
stringbuffer java API_java API中Object,String,Stringbuffer,StringBuilder的总结
2021-03-13 11:15:17String的用法:1、public String...转换成a-z…3、public String(byte[] 数组名,int开始位置,int长度)//截取bytes指定的部分,转换成字符串4、public String(char[] 数组名)//把char类型的数组,转换成字符串;数组... -
Java中的API
2021-04-08 20:35:35底层就是一个char数组,所以字符串很多特性就是数组特性 数组特性 : 查询更改快,添加删除慢 长度一旦确定不可更改 字符串一旦确定 不能更改 为了提升字符串的效率,java提供了一个"缓存机制",字符串常量池 String是... -
java常用的String相关的API
2021-01-19 18:25:361.从char数组中获取所需要的字符组成字符串 public class GetString{ public static void main(String[] args){ char a[] = {'a','b','c','d','e'}; //全部转为字符串 String str1 = new String(a); //获取一... -
java api 大全_Java基础之常用API汇总
2021-03-04 03:37:20Java基础之常用API汇总String类:String类代表字符串,字符串本质就是一个字符数组.构造方法:1.String s = new String(String original);//把字符串数据封装成字符串对象2.String s = String(char[] value); //把字符... -
java中常用的API之二
2019-06-28 08:06:11String package ...字符串效果上相当于char[]字符型数组,底层实际上是byte[]字节数组 * * 创建字符串的常见的3+1中方式 * 三种构造方法 * public String():创建一个空白字符串,不含有任何内容... -
Java中的常用API(一)
2020-02-28 19:47:52StringBuffer 为了解决String字符串操作导致的那日村冗余,...StringBuffer和StringBuilder中都有char类型可变长数组作为字符串的保存空间。使用到的方法和ArrayList类似。 StringBuffer 线程安全,效率较低。 S... -
java aip_Java API
2021-02-12 21:34:59其实它可以和字符数组进行相互转换。2、构造方法:A:public String()B:public String(byte[] bytes)C:public String(byte[] bytes,int offset,int length)D:public String(char[] value)E:public String(cha... -
Java基础之常用API汇总
2019-08-02 00:37:44Java基础之常用API String类: String类代表字符串,字符串本质就是一个字符数组. 构造方法: 1.String s = new String(String original);//把字符串数据封装成字符串对象 2.String s = String(char[] value); //把字符... -
javase个人垃圾复习笔记04Java String 类的api们
2020-09-11 15:16:15Java String 类 字符数组参数创建字符串 public class StringDemo{ public static void main(String args[]){ char[] helloArray = { 'r', 'u', 'n', 'o', 'o', 'b'}; String helloString = new String... -
Java StringBuffer类 Api文档
2020-08-19 15:14:29StringBuffer类 Api文档 方法概述 StringBuffer append(boolean b) 将 boolean参数的...append(char[] str) 将 char数组参数的字符串表示附加到此序列。 StringBuffer append(char[] str, int offset, int len) -
java常用api_Java 常用API
2021-02-27 08:11:58常用api第一部分String 类双引号字符串,都是 String 类的对象字符串的特点:字符串的内容永不可变(正是因为字符串不可改变,所以字符串是可以共享使用的)字符串效果上相当于是 char[] 字符数组,但是底层原理是 ... -
javaAPI-5(String类)
2021-01-28 14:57:37而String类的操作就是对底层char数组的操作,因此今天只记录下String类的常用方法 方法名 参数列表 返回值类型 方法作用 charAt() int index char 返回字符串指定索引位置的字符 compareTo() String ... -
java string类api_Java之String类常用API
2021-02-28 09:35:37Java之String类常用APIpublic final class String,String类被final修饰,代表的是最终类。字符串在内存中以字符数组的形式来存储private final char value[];字符串是常量,本身被存储在方法区的常量池中,只要字符... -
java中字符转换的API,【Java基础】之字符串大小写转换不利用StringAPI.
2021-03-28 08:06:39public class UpStr{static String str = ...public String transformUpperOrLower(String str, String type){//将字符串转换为char数组char[] ch = str.toCharArray();if (type == null || type.... -
stringbuffer java API_JAVA_API -- 2 String+StringBuilder+StringBuffer
2021-03-13 11:15:001.1 特点1.1.1 是一个封装char[]数组的对象package com.mtingcat.javabasis.api;/*** String 底层是以个char[]数组对象* String所表示的字符串是一个常量是不可变的* @author MTing**/public ... -
java—API中的string类和StringBuffer类
2020-03-30 20:22:55(1)String类的初始化 1.字符串常量直接赋值 2.String()构造方法——初始化 ...·String(char[] c)char数组为参数的构造方法 代码如下 public class Demo { public static void main(String[] args) { ...