• 关于

    java有字符串数组

    的搜索结果

问题

【百问百答】Java开发手册灵魂15问之为什么不建议在for循环中使用“+”进行字符串拼接

1. 什么是String,它是什么数据类型? 2. 创建String对象的不同方式有哪些? 3. 写一个方法来判断一个String是否是回文? 4. 如何让一个字符串变成小写或大...
huc_逆天 2021-01-15 10:47:35 7 浏览量 回答数 0

问题

【精品问答】Java实战200例(附源码)

Java实战200例(附源码) 1.编写一个Java程序,用if-else语句判断某年份是否为闰年 2. 编写一个Java程序在屏幕上输出1!+2!+...
珍宝珠 2020-02-14 11:55:46 16104 浏览量 回答数 10

问题

Lambda表达式将数组/字符串列表转换为数组/整数列表

由于Java 8带有强大的lambda表达式, 我想编写一个函数,将字符串的列表/数组转换为整数,浮点数,双打等的数组/列表。 在普通的Java中,它就像 for(...
保持可爱mmm 2020-02-08 10:49:03 0 浏览量 回答数 1

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

建个炫酷的简历网页,制作一个浪漫的表白网页,打造个人专属网盘,多种动手场景应用免费学!!!

回答

字符串:1)由于字符串在Java中是不可变的,如果你将密码存储为纯文本,它将在内存中可用,直到垃圾收集器清除它.并且为了可重用性,会存在String在字符串池中,它很可能会保留在内存中持续很长时间,从而构成安全威胁。 由于任何有权访问内存转储的人都可以以明文形式找到密码,这是另一个原因,你应该始终使用加密密码而不是纯文本。由于字符串是不可变的,所以不能更改字符串的内容,因为任何更改都会产生新的字符串,而如果你使用char[],你就可以将所有元素设置为空白或零。因此,在字符数组中存储密码可以明显降低窃取密码的安全风险。 2)Java本身建议使用JPasswordField的getPassword()方法,该方法返回一个char[]和不推荐使用的getTex()方法,该方法以明文形式返回密码,由于安全原因。应遵循Java团队的建议,坚持标准而不是反对它。 3)使用String时,总是存在在日志文件或控制台中打印纯文本的风险,但如果使用Array,则不会打印数组的内容而是打印其内存位置。虽然不是一个真正的原因,但仍然有道理。   输出字符串密码:Unknown 我还建议使用散列或加密的密码而不是纯文本,并在验证完成后立即从内存中清除它。因此,在Java中,用字符数组用存储密码比字符串是更好的选择。虽然仅使用char[]还不够,还你需要擦除内容才能更安全。
珍宝珠 2020-02-10 16:07:35 0 浏览量 回答数 0

回答

字符串,是Java中最常用的一个数据类型了。 本文,也是对于Java中字符串相关知识的一个补充,主要来介绍一下字符串拼接相关的知识。本文基于jdk1.8.0_181。 字符串拼接 字符串拼接是我们在Java代码中比较经常要做的事情,就是把多个字符串拼接到一起。 我们都知道,String是Java中一个不可变的类,所以他一旦被实例化就无法被修改。 不可变类的实例一旦创建,其成员变量的值就不能被修改。这样设计有很多好处,比如可以缓存hashcode、使用更加便利以及更加安全等。 但是,既然字符串是不可变的,那么字符串拼接又是怎么回事呢? 字符串不变性与字符串拼接 其实,所有的所谓字符串拼接,都是重新生成了一个新的字符串。下面一段字符串拼接代码: String s = "abcd"; s = s.concat("ef"); 其实最后我们得到的s已经是一个新的字符串了。如下图  s中保存的是一个重新创建出来的String对象的引用。 那么,在Java中,到底如何进行字符串拼接呢?字符串拼接有很多种方式,这里简单介绍几种比较常用的。 使用+拼接字符串 在Java中,拼接字符串最简单的方式就是直接使用符号+来拼接。如: String wechat = "Hollis"; String introduce = "每日更新Java相关技术文章"; String hollis = wechat + "," + introduce; 这里要特别说明一点,有人把Java中使用+拼接字符串的功能理解为运算符重载。其实并不是,Java是不支持运算符重载的。这其实只是Java提供的一个语法糖。后面再详细介绍。 运算符重载:在计算机程序设计中,运算符重载(英语:operator overloading)是多态的一种。运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 语法糖:语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·兰丁发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。语法糖让程序更加简洁,有更高的可读性。 concat 除了使用+拼接字符串之外,还可以使用String类中的方法concat方法来拼接字符串。如: String wechat = "Hollis"; String introduce = "每日更新Java相关技术文章"; String hollis = wechat.concat(",").concat(introduce); StringBuffer 关于字符串,Java中除了定义了一个可以用来定义字符串常量的String类以外,还提供了可以用来定义字符串变量的StringBuffer类,它的对象是可以扩充和修改的。 使用StringBuffer可以方便的对字符串进行拼接。如: StringBuffer wechat = new StringBuffer("Hollis"); String introduce = "每日更新Java相关技术文章"; StringBuffer hollis = wechat.append(",").append(introduce); StringBuilder 除了StringBuffer以外,还有一个类StringBuilder也可以使用,其用法和StringBuffer类似。如: StringBuilder wechat = new StringBuilder("Hollis"); String introduce = "每日更新Java相关技术文章"; StringBuilder hollis = wechat.append(",").append(introduce); StringUtils.join 除了JDK中内置的字符串拼接方法,还可以使用一些开源类库中提供的字符串拼接方法名,如apache.commons中提供的StringUtils类,其中的join方法可以拼接字符串。 String wechat = "Hollis"; String introduce = "每日更新Java相关技术文章"; System.out.println(StringUtils.join(wechat, ",", introduce)); 这里简单说一下,StringUtils中提供的join方法,最主要的功能是:将数组或集合以某拼接符拼接到一起形成新的字符串,如: String []list ={"Hollis","每日更新Java相关技术文章"}; String result= StringUtils.join(list,","); System.out.println(result); //结果:Hollis,每日更新Java相关技术文章 并且,Java8中的String类中也提供了一个静态的join方法,用法和StringUtils.join类似。 以上就是比较常用的五种在Java种拼接字符串的方式,那么到底哪种更好用呢?为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接呢?  (阿里巴巴Java开发手册中关于字符串拼接的规约) 使用+拼接字符串的实现原理 前面提到过,使用+拼接字符串,其实只是Java提供的一个语法糖, 那么,我们就来解一解这个语法糖,看看他的内部原理到底是如何实现的。 还是这样一段代码。我们把他生成的字节码进行反编译,看看结果。 String wechat = "Hollis"; String introduce = "每日更新Java相关技术文章"; String hollis = wechat + "," + introduce; 反编译后的内容如下,反编译工具为jad。 String wechat = "Hollis"; String introduce = "\u6BCF\u65E5\u66F4\u65B0Java\u76F8\u5173\u6280\u672F\u6587\u7AE0";//每日更新Java相关技术文章 String hollis = (new StringBuilder()).append(wechat).append(",").append(introduce).toString(); 通过查看反编译以后的代码,我们可以发现,原来字符串常量在拼接过程中,是将String转成了StringBuilder后,使用其append方法进行处理的。 那么也就是说,Java中的+对字符串的拼接,其实现原理是使用StringBuilder.append。 concat是如何实现的 我们再来看一下concat方法的源代码,看一下这个方法又是如何实现的。 public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } int len = value.length; char buf[] = Arrays.copyOf(value, len + otherLen); str.getChars(buf, len); return new String(buf, true); } 这段代码首先创建了一个字符数组,长度是已有字符串和待拼接字符串的长度之和,再把两个字符串的值复制到新的字符数组中,并使用这个字符数组创建一个新的String对象并返回。 通过源码我们也可以看到,经过concat方法,其实是new了一个新的String,这也就呼应到前面我们说的字符串的不变性问题上了。 StringBuffer和StringBuilder 接下来我们看看StringBuffer和StringBuilder的实现原理。 和String类类似,StringBuilder类也封装了一个字符数组,定义如下: char[] value; 与String不同的是,它并不是final的,所以他是可以修改的。另外,与String不同,字符数组中不一定所有位置都已经被使用,它有一个实例变量,表示数组中已经使用的字符个数,定义如下: int count; 其append源码如下: public StringBuilder append(String str) { super.append(str); return this; } 该类继承了AbstractStringBuilder类,看下其append方法: public AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); str.getChars(0, len, value, count); count += len; return this; } append会直接拷贝字符到内部的字符数组中,如果字符数组长度不够,会进行扩展。 StringBuffer和StringBuilder类似,最大的区别就是StringBuffer是线程安全的,看一下StringBuffer的append方法。 public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; } 该方法使用synchronized进行声明,说明是一个线程安全的方法。而StringBuilder则不是线程安全的。 StringUtils.join是如何实现的 通过查看StringUtils.join的源代码,我们可以发现,其实他也是通过StringBuilder来实现的。 public static String join(final Object[] array, String separator, final int startIndex, final int endIndex) { if (array == null) { return null; } if (separator == null) { separator = EMPTY; } // endIndex - startIndex > 0: Len = NofStrings *(len(firstString) + len(separator)) // (Assuming that all Strings are roughly equally long) final int noOfItems = endIndex - startIndex; if (noOfItems <= 0) { return EMPTY; } final StringBuilder buf = new StringBuilder(noOfItems * 16); for (int i = startIndex; i < endIndex; i++) { if (i > startIndex) { buf.append(separator); } if (array[i] != null) { buf.append(array[i]); } } return buf.toString(); } 效率比较 既然有这么多种字符串拼接的方法,那么到底哪一种效率最高呢?我们来简单对比一下。 long t1 = System.currentTimeMillis(); //这里是初始字符串定义 for (int i = 0; i < 50000; i++) { //这里是字符串拼接代码 } long t2 = System.currentTimeMillis(); System.out.println("cost:" + (t2 - t1)); 我们使用形如以上形式的代码,分别测试下五种字符串拼接代码的运行时间。得到结果如下: + cost:5119 StringBuilder cost:3 StringBuffer cost:4 concat cost:3623 StringUtils.join cost:25726 从结果可以看出,用时从短到长的对比是: StringBuilder<StringBuffer<concat<+<StringUtils.join StringBuffer在StringBuilder的基础上,做了同步处理,所以在耗时上会相对多一些。 StringUtils.join也是使用了StringBuilder,并且其中还是有很多其他操作,所以耗时较长,这个也容易理解。其实StringUtils.join更擅长处理字符串数组或者列表的拼接。 那么问题来了,前面我们分析过,其实使用+拼接字符串的实现原理也是使用的StringBuilder,那为什么结果相差这么多,高达1000多倍呢? 我们再把以下代码反编译下: long t1 = System.currentTimeMillis(); String str = "hollis"; for (int i = 0; i < 50000; i++) { String s = String.valueOf(i); str += s; } long t2 = System.currentTimeMillis(); System.out.println("+ cost:" + (t2 - t1)); 反编译后代码如下: long t1 = System.currentTimeMillis(); String str = "hollis"; for(int i = 0; i < 50000; i++) { String s = String.valueOf(i); str = (new StringBuilder()).append(str).append(s).toString(); } long t2 = System.currentTimeMillis(); System.out.println((new StringBuilder()).append("+ cost:").append(t2 - t1).toString()); 我们可以看到,反编译后的代码,在for循环中,每次都是new了一个StringBuilder,然后再把String转成StringBuilder,再进行append。 而频繁的新建对象当然要耗费很多时间了,不仅仅会耗费时间,频繁的创建对象,还会造成内存资源的浪费。 所以,阿里巴巴Java开发手册建议:循环体内,字符串的连接方式,使用 StringBuilder 的 append 方法进行扩展。而不要使用+。 总结 本文介绍了什么是字符串拼接,虽然字符串是不可变的,但是还是可以通过新建字符串的方式来进行字符串的拼接。 常用的字符串拼接方式有五种,分别是使用+、使用concat、使用StringBuilder、使用StringBuffer以及使用StringUtils.join。 由于字符串拼接过程中会创建新的对象,所以如果要在一个循环体中进行字符串拼接,就要考虑内存问题和效率问题。 因此,经过对比,我们发现,直接使用StringBuilder的方式是效率最高的。因为StringBuilder天生就是设计来定义可变字符串和字符串的变化操作的。 但是,还要强调的是: 1、如果不是在循环体中进行字符串拼接的话,直接使用+就好了。 2、如果在并发场景中进行字符串拼接的话,要使用StringBuffer来代替StringBuilder。
montos 2020-06-01 21:30:32 0 浏览量 回答数 0

问题

Java 中的Redis Monitor命令

使用的语言是Java,使用的Redis客户端为Jedis我调用redis的monitor命令捕获一条如下信息1437562679.165098 [0 192.168.14.71:54692] "SET" "xe5x90x8cxe5xadxa...
落地花开啦 2019-12-01 19:47:02 1566 浏览量 回答数 1

回答

1.由于字符串在Java中是不可变的,如果你将密码存储为纯文本,它将在内存中可用,直到垃圾收集器清除它。并且为了可重用性,会存储在字符串池中,它很可能会保留在内存中持续很长时间,从而构成安全威胁。 由于任何有权访问内存转储的人都可以以明文形式找到密码,这是另一个原因,你应该始终使用加密密码而不是纯文本。由于字符串是不可变的,所以不能更改字符串的内容,因为任何更改都会产生新的字符串,而如果你使用char[],你就可以将所有元素设置为空白或零。因此,在字符数组中存储密码可以明显降低窃取密码的安全风险。 2.Java本身建议使用JPasswordField的getPassword()方法,该方法返回一个char[]和不推荐使用的getTex()方法,该方法以明文形式返回密码。由于安全原因,应遵循Java团队的建议,坚持标准而不是反对它。 3.使用String时,总是存在在日志文件或控制台中打印纯文本的风险,但如果使用Array,则不会打印数组的内容而是打印其内存位置。虽然不是一个真正的原因,但仍然有道理。 还是建议使用散列或加密的密码而不是纯文本,并在验证完成后立即从内存中清除它。因此,在Java中,用字符数组存储密码比用字符串是更好的选择。虽然仅使用char[]还不够,你还需要擦除内容才能更安全。
剑曼红尘 2020-04-25 14:34:50 0 浏览量 回答数 0

回答

我感觉重点是思维,多考虑程序的安全性,接收数据注意过滤,数据库连接防注入,用什么语言其实差不多。######这个需要多写,非一朝一夕可矣。######书山有路勤为径 ###### 你是写java,不适应php,变量不声明,数据结构可以随意定制,方式。还是多加上校验,刚开始烦点,写多了就习惯了。 还有了就是多看php的api,不能看着php函数名子就直接使用,好多坑的。 如count函数,参数是数组时,当然返回数组长度。 如果参数是字符串,返回便是字符串长度。 如有有人写个方法取数组里第几个参数时, 调用人没注意,传个字符串就完蛋了。(之前有个同事定义这样一个函数 取数据第一个值,删除数据库中指定的公司账号,有个A货同事,调用传一个字符串 '91',把 公司为9的账号给删除了) 完全不是一个意思,但它不报错。 遇到数据没了找都很能找着原因。 ######回复 @zonghua : 对的。 我因该说count 字符串返回的是字节长度######PHP的字符串长度是字节,而java真的是字符的数目
kun坤 2020-06-09 11:45:05 0 浏览量 回答数 0

回答

String在Java中是不可变对象,如果作为普通文本存储密码,那么它会一直存在内存中直至被垃圾收集器回收。这就意味着一旦创建了一个字符串,如果另一个进程把尝试内存的数据导出(dump),在GC进行垃圾回收之前该字符串会一直保留在内存中,那么该进程就可以轻易的读取到该字符串。 而对于数组,可以在使用该数组之后显示地擦掉数组中的内容,你可以使用其他不相关的内容把数组内容覆盖掉,例如,在使用完密码后,我们将char[]的值均赋为0,如果有人能以某种方式看到内存映像,他只能看到一串0;而如果我们使用的是字符串,他们便能以纯文本方式看到密码。 因此,使用char[]是相对安全的。
peter517517 2020-02-10 16:06:28 0 浏览量 回答数 0

回答

您想要的是Arrays.toString(int[])方法: import java.util.Arrays; int[] array = new int[lnr.getLineNumber() + 1]; int i = 0; .. System.out.println(Arrays.toString(array)); Arrays.toString每个不同的原始Java类型都有一个静态辅助方法;一个int[]说: public static String toString(int[] a) 返回指定数组内容的字符串表示形式。字符串表示形式由数组元素列表组成,并用方括号("[]")括起来。相邻元素由字符分隔", "(逗号后跟空格)。元素通过转换为字符串String.valueOf(int)。"null"如果a为null,则返回。
保持可爱mmm 2020-02-07 00:52:04 0 浏览量 回答数 0

问题

JAVA字符排序问题

java中字符串数组排序 Arrays.sort() 是按先大写后小写排序的 但是我想将a排在B之前有什么方法能实现 ?最好不是新建一个方法。...
蛮大人123 2019-12-01 19:55:01 2476 浏览量 回答数 1

问题

Redis Monitor命令,求帮助

使用的语言是Java,使用的Redis客户端为Jedis 我调用redis的monitor命令捕获一条如下信息 1437562679.165098 [0 192.168.14.71:54692] "SET" "\xe5\x90\x8c\x...
落地花开啦 2019-12-01 19:46:55 1373 浏览量 回答数 1

回答

java正则提取需要用到Matcher类,下面给出案例示例供参考 需要提取车牌号中最后一个数字,比如说:苏A7865提取5,苏A876X提取6 import java.util.regex.Matcher;import java.util.regex.Pattern;public class Test {public static void main(String[] args) {String s = "A876X";// 把要匹配的字符串写成正则表达式,然后要提取的字符使用括号括起来// 在这里,我们要提取最后一个数字,正则规则就是“一个数字加上大于等于0个非数字再加上结束符”Pattern pattern = Pattern.compile("(\d)[^\d]*$");Matcher matcher = pattern.matcher(s);if(matcher.find())System.out.println(matcher.group(1));}} 关于Matcher 中的几个方法说明: Mathcer.start() Matcher.end() Matcher.group() 当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信息. start()返回匹配到的子字符串在字符串中的索引位置. end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置. group()返回匹配到的子字符串 示例代码如下,具体功能请参考注释 Pattern p=Pattern.compile(“\d+”); Matcher m=p.matcher(“aaa2223bb”); m.find();//匹配2223 m.start();//返回3 m.end();//返回7,返回的是2223后的索引号 m.group();//返回2223Mathcer m2=p.matcher(“2223bb”); m2.lookingAt(); //匹配2223 m2.start(); //返回0,由于lookingAt()只能匹配前面的字符串,所以当使用lookingAt()匹配时,start()方法总是返回0 m2.end(); //返回4 m2.group(); //返回2223Matcher m3=p.matcher(“2223”); //如果Matcher m3=p.matcher(“2223bb”); 那么下面的方法出错,因为不匹配返回false m3.matches(); //匹配整个字符串 m3.start(); //返回0 m3.end(); //返回3,原因相信大家也清楚了,因为matches()需要匹配所有字符串 m3.group(); //返回2223 另外,Mathcer类中start(),end(),group()均有一个重载方法它们是start(int i),end(int i),group(int i)专用于分组操作,Mathcer类还有一个groupCount()用于返回有多少组. 示例如下: Pattern p=Pattern.compile(“([a-z]+)(\d+)”); Matcher m=p.matcher(“aaa2223bb”); m.find(); //匹配aaa2223 m.groupCount(); //返回2,因为有2组 m.start(1); //返回0 返回第一组匹配到的子字符串在字符串中的索引号 m.start(2); //返回3 m.end(1); //返回3 返回第一组匹配到的子字符串的最后一个字符在字符串中的索引位置. m.end(2); //返回7 m.group(1); //返回aaa,返回第一组匹配到的子字符串 m.group(2); //返回2223,返回第二组匹配到的子字符串 注意: 只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用。
游客2q7uranxketok 2021-02-09 11:02:55 0 浏览量 回答数 0

回答

String是Java中一个比较基础的类,每一个开发人员都会经常接触到。而且,String也是面试中经常会考的知识点。String有很多方法,有些方法比较常用,有些方法不太常用。今天要介绍的subString就是一个比较常用的方法,而且围绕subString也有很多面试题。 substring(int beginIndex, int endIndex)方法在不同版本的JDK中的实现是不同的。了解他们的区别可以帮助你更好的使用他。为简单起见,后文中用substring()代表substring(int beginIndex, int endIndex)方法。 substring() 的作用 substring(int beginIndex, int endIndex)方法截取字符串并返回其[beginIndex,endIndex-1]范围内的内容。 String x = "abcdef"; x = x.substring(1,3); System.out.println(x); 输出内容: bc 调用substring()时发生了什么? 你可能知道,因为x是不可变的,当使用x.substring(1,3)对x赋值的时候,它会指向一个全新的字符串: 然而,这个图不是完全正确的表示堆中发生的事情。因为在jdk6 和 jdk7中调用substring时发生的事情并不一样。 JDK 6中的substring String是通过字符数组实现的。在jdk 6 中,String类包含三个成员变量:char value[], int offset,int count。他们分别用来存储真正的字符数组,数组的第一个位置索引以及字符串中包含的字符个数。 当调用substring方法的时候,会创建一个新的string对象,但是这个string的值仍然指向堆中的同一个字符数组。这两个对象中只有count和offset 的值是不同的。 下面是证明上说观点的Java源码中的关键代码: //JDK 6 String(int offset, int count, char value[]) { this.value = value; this.offset = offset; this.count = count; } public String substring(int beginIndex, int endIndex) { //check boundary return new String(offset + beginIndex, endIndex - beginIndex, value); } JDK 6中的substring导致的问题 如果你有一个很长很长的字符串,但是当你使用substring进行切割的时候你只需要很短的一段。这可能导致性能问题,因为你需要的只是一小段字符序列,但是你却引用了整个字符串(因为这个非常长的字符数组一直在被引用,所以无法被回收,就可能导致内存泄露)。在JDK 6中,一般用以下方式来解决该问题,原理其实就是生成一个新的字符串并引用他。 x = x.substring(x, y) + "" 关于JDK 6中subString的使用不当会导致内存系列已经被官方记录在Java Bug Database中: 内存泄露:在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。 JDK 7 中的substring 上面提到的问题,在jdk 7中得到解决。在jdk 7 中,substring方法会在堆内存中创建一个新的数组。 Java源码中关于这部分的主要代码如下: //JDK 7 public String(char value[], int offset, int count) { //check boundary this.value = Arrays.copyOfRange(value, offset, offset + count); } public String substring(int beginIndex, int endIndex) { //check boundary int subLen = endIndex - beginIndex; return new String(value, beginIndex, subLen); } 以上是JDK 7中的subString方法,其使用new String创建了一个新字符串,避免对老字符串的引用。从而解决了内存泄露问题。 所以,如果你的生产环境中使用的JDK版本小于1.7,当你使用String的subString方法时一定要注意,避免内存泄露。
montos 2020-06-01 21:28:15 0 浏览量 回答数 0

回答

数组是一个容器,当它被创建后,不仅元素的类型是确定的,元素的个数也是确定的。换句话说,数组的长度是确定的,不可能再变长或者变短。因此,数组可以使用一个字段(length)来表示长度。 创建数组的方法有两种,这个应该大家都知道了。一种是通过 new 关键字创建指定长度后再赋值,另外一种是通过 {} 直接进行初始化。 // newint[] arr = new int[4]; arr[0] = 0; arr[1] = 1; arr[2] = 2; arr[3] = 3;//  {}int [] arr1 = {0, 1, 2, 3}; 但不管用哪种方法,数组的长度是可以明确知道的。并且不会再变长或者变短(学不了孙悟空的金箍棒)。 由于数组也是对象,所以以下代码是合法的。 那为什么数组不单独定义一个类来表示呢?就像字符串 String 类那样呢? 一个合理的解释是 Java 将其隐藏了。假如真的存在一个 Array.java,我们也可以假想它真实的样子,它必须要定义一个容器来存放数组的元素,就像 String 类那样。 public final class String     implements java.io.Serializable, Comparable<String>, CharSequence {     /** The value is used for character storage. */     private final char value[]; } 但这样做真的有必要吗?为数组单独定义一个类,是不是有点画蛇添足的意味。那既然数组没必要定义成一个类,也就没有必要再定义一个 length() 方法来获取数组的长度了,直接用 length 这个字段就可以了,不是吗? 那为什么字符串 String 类会有 length() 方法呢?来看一下源码就明白了。     /**     * Returns the length of this string.      *The length is equal to the number of Unicode      * code units in the string.      */    public int length() {         return value.length;     } length() 方法返回的正是字符数组 value 的长度(length),value 本身是 private 的,因此很有必要为 String 类提供一个 public 级别的方法来供外部访问字符的长度。 总结一下,Java 获取数组长度的时候用 length,获取字符串长度的时候用的是 length()。
游客pklijor6gytpx 2019-12-27 09:41:57 0 浏览量 回答数 0

问题

关于android读取设备返回byte数组解析问题

android通过socket读取到一串数据,存在Byte数组中的值为 67 82 80 0 -52 -52 -52 -52 -52 -52,这个值如何转为java 字符串,我用了很多方法都有乱码,...
爵霸 2019-12-01 20:13:02 1691 浏览量 回答数 1

回答

如果您只想要数组的“调试样式”转储: String str = Arrays.toString(arr); 或者,为了获得更多控制权(在Java 8之前): StringBuilder builder = new StringBuilder(); for(String s : arr) { builder.append(s); } String str = builder.toString(); (Java 8及更高版本): String str = String.join(",", arr); 如果您是从Android角度出发: String str = TextUtils.join(",", arr); 您可以根据需要在字符串之间使用哪些字符(如有)来修改以上内容。 您可能会看到与Java 8之前的代码几乎相同的代码,但是使用StringBuffer- StringBuilder是一个较新的类,该类不是线程安全的,但是由于不需要不必要的同步,因此在单个线程中具有更好的性能。简而言之,您最好StringBuilder在99%的情况下使用-从功能上来说,两者是相同的。 请勿使用字符串,而只需使用+ =附加字符串即可,如此处显示的一些答案所示。这会使GC穿过屋顶,因为您要创建和丢弃的数组对象数与字符串对象一样多。对于小型阵列,您可能不会真正注意到差异,但是对于大型阵列,速度可能会慢几个数量级。 问题来源于stack overflow
保持可爱mmm 2020-01-16 15:53:55 0 浏览量 回答数 0

问题

Java字符串数组:方法是否有大小?

我来自php背景,在php中,有一个array_size()函数可以告诉您数组中使用了多少个元素。 String[]数组有类似的方法吗?谢谢。...
保持可爱mmm 2020-02-06 23:28:40 1 浏览量 回答数 1

回答

就是几个流操作,php我不会。貌似php可以调C吧。C实现也不难######我也就会php 对于java 不了解 ,我现在知道一个加密文件,按照代码我是不是需要读文件的内容存到一个字符串,再把这个字符串转成byte数组,然后数组里的每个值再分别用异或的方式生成新的值,然后将新的byte数组组合成字符串导入生成新的文件###### for (int i = 0; i < count; i++) { temp[i] = (byte)(temp[i] ^ temp1[(i % len)]); } 几个英语单词而已,何难之有。世界上最简单的加密-异或加密。 ######我第一步就卡在那了,那个byte数组,我不知道什么样的,我在网上找了个php的,但是不知道java 和php的有区别没有,这块的不确定让我不知道接下来我该怎么调试。我会把我写的代码发出来,还希望大哥指点一下我###### 就是拿key和密文做个异或 ######我把我写的错误代码加上了,大哥帮忙看一下,哪里需要修改还麻烦大哥提出来啊
kun坤 2020-06-14 09:54:13 0 浏览量 回答数 0

回答

java中String类有getBytes方法,可以将字符串转成字节数组。字节数组可以直接写入到输出流中,如写入文件输出流中,Socket输出流中等。实例代码: public static void main(String[] args) { String text = "helloworld"; byte[] bytes = text.getBytes(); try { OutputStream out = new FileOutputStream(new File("src/text.txt")); out.write(bytes); out.flush(); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 网络通信中都是用的字节数据的,所以有时候需要把字符串转成byte数组进行数据发送的。
蛮大人123 2019-12-02 02:23:34 0 浏览量 回答数 0

问题

如何将JAVA数组转换成 JSON对象或JSON字符串

有思路就好。...
YDYK 2020-04-25 13:54:35 1 浏览量 回答数 1

回答

不是。Java 中的基本数据类型只有 8 个 :byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引用类型(referencetype),Java 5 以后引入的枚举类型也算是一种比较特殊的引用类型。 这是很基础的东西,但是很多初学者却容易忽视,Java 的 8 种基本数据类型中不包括 String,基本数据类型中用来描述文本数据的是 char,但是它只能表示单个字符,比如 ‘a’,‘好’ 之类的,如果要描述一段文本,就需要用多个 char 类型的变量,也就是一个 char 类型数组,比如“你好” 就是长度为2的数组 char[] chars = {‘你’,‘好’}; 但是使用数组过于麻烦,所以就有了 String,String 底层就是一个 char 类型的数组,只是使用的时候开发者不需要直接操作底层数组,用更加简便的方式即可完成对字符串的使用。
剑曼红尘 2020-03-27 16:21:34 0 浏览量 回答数 0

问题

应该返回false的用户输入返回true

到目前为止,我一直在程序中使用运算符比较所有字符串。但是,我遇到了一个错误,将其中一个更改为错误.equals(),并修复了该错误。 true==falseÿ...
养狐狸的猫 2019-12-01 20:00:45 8 浏览量 回答数 0

回答

数组没有 length()方法 ,有 length 的属性。String 有 length()方法。JavaScript中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混淆。
剑曼红尘 2020-03-27 16:24:38 0 浏览量 回答数 0

回答

如果您已经阅读了文档,但仍然有一些问题应作为最初问题的一部分。在这种情况下,示例中的JNI函数将创建多个数组。外部数组由使用JNI函数创建的“对象”数组组成NewObjectArray()。从JNI的角度来看,这就是一个二维数组,即一个包含多个其他内部数组的对象数组。 下面的for循环使用JNI函数创建int []类型的内部数组NewIntArray()。如果您只想返回一个一维整数数组,则NewIntArray()可以使用该函数来创建返回值。如果要创建字符串的一维数组,则可以使用该NewObjectArray()函数,但为该类使用不同的参数。 由于您要返回一个int数组,因此您的代码将如下所示: JNIEXPORT jintArray JNICALL Java_ArrayTest_initIntArray(JNIEnv *env, jclass cls, int size) { jintArray result; result = (env)->NewIntArray(env, size); if (result == NULL) { return NULL; / out of memory error thrown */ } int i; // fill a temp structure to use to populate the java int array jint fill[size]; for (i = 0; i < size; i++) { fill[i] = 0; // put whatever logic you want to populate the values here. } // move from the temp structure to the java structure (*env)->SetIntArrayRegion(env, result, 0, size, fill); return result; }
保持可爱mmm 2020-02-07 22:39:39 0 浏览量 回答数 0

回答

中文字符没有escape?java那边不需要那样 java端用的什么json库?试试fastjson库?我是对接第三方的接口 报啥错,截图下 header有没有设置json,还有utf-8 这是报错信息 这是我发送的 这是我的数据结构   PHP将List,ArrayList,Map,Hashmap视为数组,而Java区分很严格,使用(),还是{},还是用[]对与PHP没有那么多要求。 Java差一点都不能decode.你要搞明白(),[],{}还要注意Int,Float,String,java是强类型的比如上面的5.94是字符串,是否需要转换为浮点型好的多谢提醒,正在排查这个问题 引用来自“neo-chen”的评论 PHP将List,ArrayList,Map,Hashmap视为数组,而Java区分很严格,使用(),还是{},还是用[]对与PHP没有那么多要求。 Java差一点都不能decode.你要搞明白(),[],{} 我们公司进行数据交互的时候 json中的所有字段全部定为String类型的 然后再在服务端进行转换 判断一下是不是编码问题。和java端配合调试一下。看他收到你的请求体内容 现在解决了吗我也遇到楼主的问题,这边base64加密后就没问题。如果不加密有好的办法吗  
爱吃鱼的程序员 2020-06-08 17:02:46 0 浏览量 回答数 0

回答

摘抄:因为java读取read()方法时候,底层由c++实现,返回的是 unsigned byte ,取值范围为[0,255],而byte的取值范围是[-128,127], 那么[128, 255]就没有办法表示了,然后就会把byte升级为int,int就可以表示[128,255], 不过为什么不用short去接受返回呢???菜鸟求解######回复 @快乐的一只小青蛙 : 糊涂之言,勿怪!!######回复 @kakai : short是C语言的基本类型之一。 C语言整形数据包括char、short、int、long######Java没有unsigned###### 对于你问题的具体回答 [详细描述]###### 哪儿矛盾了,返回的int值表示读取的字节数,并不是读取到的字节######可是,调用 public abstract int read() throws IOException,返回的是 0 到 255 范围内的 int 字节值。###### 摘要 调用 read(), 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。 调用 read(byte[] b), 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。 1.    的确,public abstract int read()                                   throws IOException 输入流中读取数据的下一个字节。但是,返回的是 0 到 255 范围内的 int 字节值。一个字节能表示的最大的整数就是255(二进制11111111=十进制255)。所以,返回值的类型是 int。"read()的底层是由C++实现的,返回的是unsigned byte,取值范围为[0~255],在java中没有对应的类型,所以只能用int类型接收"。 中文字符,(至少)需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。类似的,日文和韩文等其他语言也有这个问题。为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。java 字符型变量,使用 UNICODE。UNICODE 通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。比如,一个中文字符 '中', 对应的 Unicode 十进制编码是: 20013。于是,要读取 '中',就必须连续读入两个字节。按 UNICODE 编码,才能够将这两个二进制字节值"合成",将"合成"结果,成功转换成相应的中文字符。 如下代码,详述通过 java 使用的 Unicode 编码 读取 中文字符的案例。 这里,通过建立一个 BigInteger 对象,获得 长度为2的字节数组 byte bete[]。分别检查这两个字节的二进制表示, 即输出 每个字节元素的字节值,及其二进制表示。从输出结果可以看出,将两个(整型)字节值 78( 二进制:01001110)   和 45( 二进制:00101101) 的二进制表示,“合成” 到一起,就是 字符'中' 的Unicode编码 20013, 即 0100111000101101(二进制) 。  import java.math.BigInteger; public class ByteArray1 { public static void main(String[] args) { int zhong = (int)'中'; System.out.println( "字符 '"+ (char)zhong + "',其 UNICODE: " + zhong + "(十进制)"); // 通过建立一个 BigInteger 对象,获得 长度为2的字节数组 byte bete[]。 BigInteger b = new BigInteger(String.valueOf(zhong)); String zh = b.toString(2); System.out.println( addZero(zh, 16) + "(二进制)" ); // 输出字符 '中' 的 二进制的字符串形式 byte bete[] = b.toByteArray();//返回一个 byte 数组,该数组包含此 BigInteger 的二进制补码表示形式。 for (int j=0; j<bete.length ; j++){ byte bn = bete[j]; String str = Integer.toBinaryString(bn); System.out.println( bn + "( 二进制: " + addZero(str, 8) + ")"); // 输出 每个字节元素的字节值的二进制表示 } } /* 将一个 整型 (16位) 或 字节(8位) 转化成 二进制表示的字符串时, * 若字符串长度不足 16位 或 8位 时,将空位补 0。 */ static String addZero(String s, int length){ String add=""; for(int k=0; k< ( length - s.length()); k++) add += "0"; return add + s; } } 输出: 字符 '中',其 UNICODE: 20013(十进制) 0100111000101101(二进制) 78( 二进制: 01001110) 45( 二进制: 00101101) 2.     如果调用 方法  public int read(byte[] b)          throws IOException 其功能是:"从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数"。注意,这时读取到的输入流的每个字节的值,依次存入缓冲区数组 b 的各个元素之中。 结论: 调用 read(), 从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。调用 read(byte[] b), 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。在字节流的基础上,加上编码,形成的数据流。字符流虽然以字节流为基础创建的,但是字节流可以支持声音,视频,图片,文本等所有文件类型,而字符流只支持文本文件。ASCII码:美国信息交换标准代码。单字节编码,不支持中文。Unicode/utf-8  :双字节编码,支持中文(万国码)。java 使用 Unicode。    参考: Java:InputStream中的read()返回int类型的疑问Java I/O(字节流、字符流与转换流)Java中字符流与字节流的区别###### 引用来自“yong230”的评论 哪儿矛盾了,返回的int值表示读取的字节数,并不是读取到的字节 我也这样认为######如果调用 方法 public int read(byte[] b) throws IOException 其功能是:从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。注意,读取到的输入流的每个字节值,依次存入缓冲区数组 b 的各个元素之中。调用 read(), 返回字节的值。###### 还有这么多人,居然方法的功能都不知道,, read和read(byte[])的功能都不同,
kun坤 2020-06-07 20:03:19 0 浏览量 回答数 0

问题

Android app与RESTful的Java后台交互的问题,求指点

这几天我用maven+spring搭建了一个RESTful的后台,现在写了一个Android的app去访问后台。在app中的登录界面里有一个验证码,现在我可以拿到服务端产生的验证码图片,但是输入对应的验证码并提交到后台,在后台却找不到已经保...
a123456678 2019-12-01 20:24:06 2519 浏览量 回答数 1

问题

【Java学习全家桶】1460道Java热门问题,阿里百位技术专家答疑解惑

阿里极客公益活动: 或许你挑灯夜战只为一道难题 或许你百思不解只求一个答案 或许你绞尽脑汁只因一种未知 那么他们来了,阿里系技术专家来云栖问答为你解答技术难题了 他们用户自己手中的技术来帮助用户成长 本次活动特邀百位阿里技术专家对Java常...
管理贝贝 2019-12-01 20:07:15 27612 浏览量 回答数 19

问题

查找低填充率 结束语:报错

从 Java 代码到 Java 堆 背景信息:Java 进程的内存使用 参考知识 Java 对象详解 Java 数组对象详解 更为复杂数据结构详解 32 位和 64 位 Java 对象 Java 集合的内存使用 集合中的空白空...
kun坤 2020-06-14 09:44:00 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT