关于string:JavaString的常用方法总结

Java-String的罕用办法总结: 一、String类 String类在java.lang包中,java应用String类创立一个字符串变量,字符串变量属于对象。java把String类申明的final类,不能继承。String类对象创立后不能批改,由0或多个字符组成,蕴含在一对双引号之间。 二、String类构造方法 1、public String() 无参构造方法,用来创立空字符串的String对象。 String str1=new String(); String str2=new String("asdf"); 2、public String(String value) String str2=new String("asdf"); 3、public String(char[]value) char[]value={'a','b','c','d'}; String str4=new String(value); 4、public String(char chars[],int startIndex,int numChars) char[]value={'a','b','c','d'}; String str5=new String(value,1,2); 5、public String(byte[]values) byte[]strb=new byte[]{65,66}; String str6=new String(strb); 三、String类罕用办法 1、public char charAt(int index) 参数 index--字符的索引。 ...

April 3, 2023 · 2 min · jiezi

关于string:去掉String属性的最后一个逗号

也能够是其余符号,有这种问题的时候应该思考先改存储的中央(能够按制订字符串拆分成数组,长度大于1的时候才加分隔符,否则开端就不必增加了) Boolean isNotEmpty = StringUtils.isNotBlank(this.version);Boolean lastIndex = false;if(isNotEmpty){ lastIndex = ",".equals(this.version.substring(version.length()-1));} if(isNotEmpty && lastIndex){ return this.version.substring(0,version.length()-1);}else{ return this.version;}

August 17, 2021 · 1 min · jiezi

关于string:String类型和基本数据类的转化

一、由根本数据型态转换成StringString 类别中曾经提供了将根本数据型态转换成 String 的 static 办法 ,也就是 String.valueOf() 这个参数多载的办法 有以下几种 (1)String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串 (2)String.valueOf(char c) : 将 char 变量 c 转换成字符串 (3)String.valueOf(char[] data) : 将 char 数组 data 转换成字符串 (4)String.valueOf(char[] data, int offset, int count) : 将 char 数组 data 中 由 data[offset] 开始取 count 个元素 转换成字符串 (5)String.valueOf(double d) : 将 double 变量 d 转换成字符串 (6)String.valueOf(float f) : 将 float 变量 f 转换成字符串 (7)String.valueOf(int i) : 将 int 变量 i 转换成字符串 (8)String.valueOf(long l) : 将 long 变量 l 转换成字符串 (9)String.valueOf(Object obj) : 将 obj 对象转换成 字符串, 等于 obj.toString() ...

July 16, 2021 · 1 min · jiezi

关于string:前端笔记-字符串

所有罕用字符都是2字节的代码 反斜线 console.log(``) // ''字符串办法 s[i] => s.charAt(i)// 定位s.indexOf(str,index) // 从index开始在s中查找strs.lastIndexOf(str,index) // 从indx开始从后往前在s中查找strs.includes(str,index) // 从indx开始查找s中是否蕴含strs.startsWith(str) // s是否以str开始s.endsWith(str) // s是否以str完结// 获取子字符串s.slice(start,end)  // 不包含end。能够为负值。s.slice()相当于复制ss.substring(start,end) // 不包含end。负值=0。容许start>end,主动换地位s.substr(start,length) // 从start开始长度为length的字符串。能够为负值// 字符串比拟小写 > 大写s.codePointAt(index) // 返回s中在index地位的UTF-16编码 => s.charCodeAt(index)String.fromCodePoint(num) // 返回UTF-16编码代表的数字 => String.fromCharCode(num)s1.localeCompare(s2) // 返回一个num,示意s1是否在s2之前// 其余s.trim() // 删除s前后空格s.repeat(num) // 反复字符串num次按位NOT ~:它将数字转换为 32-bit 整数(如果存在小数局部,则删除小数局部),而后对其二进制示意模式中的所有位均取反。 ~n = -(n+1)

April 10, 2021 · 1 min · jiezi

关于string:go的stringbyte和rune类型

rune是int32的别名类型,一个值就代表一个Unicode字符。byte是uint8的别名类型,一个值就代表一个ASCII码的一个字符。rune类型的值在底层都是由一个 UTF-8 编码值来表白的。 理解下什么是Unicode字符和ASCII码:1、简略了解,咱们平时接触到的中英日文,或者复合字符,都是Unicode字符。比方,'G'、'o'、'爱'、'好'、'者'就是一个个Unicode字符。2、字符在计算机中存储时须要应用二进制数来示意。所以人们定义了一张表,将咱们用到的字符用一个二进制数值示意。这就是ASCII码表的由来。 UTF-8 编码方案会把一个 Unicode 字符编码为一个长度在 1\~4 以内的字节序列。所以,一个rune类型值代表了1\~4个长度的byte数组。 案例: func main() { str := "Go爱好者" fmt.Printf("The string: %q\n", str) fmt.Printf(" => runes(char): %q\n", []rune(str)) fmt.Printf(" => runes(hex): %x\n", []rune(str)) fmt.Printf(" => bytes(hex): [% x]\n", []byte(str))}The string: "Go爱好者" => runes(char): ['G' 'o' '爱' '好' '者'] => runes(hex): [47 6f 7231 597d 8005] => bytes(hex): [47 6f e7 88 b1 e5 a5 bd e8 80 85]字符串值"Go爱好者"如果被转换为[]rune类型的值的话,其中的每一个字符(不论是英文还是中文)就都会独立成为一个rune类型的元素值。如打印出的第二行内容。又因为,每个rune类型的值在底层都是由一个 UTF-8 编码值来表白的,如第三行把每个字符的 UTF-8 编码值都拆成相应的字节序列,如第四行,因为一个中文字符的 UTF-8 编码值须要用三个字节来表白。 ...

February 20, 2021 · 1 min · jiezi

关于string:原来只想简单看一下String源码没想到整理了这么多知识点

不晓得大家有没有这样得经验,就是无心中点进去得一个业面,而后钻到外面浏览了良久,我就是这样得,明天无心中,ctrl+左键,就点进了string得源码,正好今天下午没啥事,就在外面看一下,没想到,下次缓过去,就是我共事拍我让我去吃饭,哈哈哈哈,不过益处就是,我这边也整顿了一些string类得知识点,也分享给大家,整顿得不好还望海涵文章首发集体公众号:Java架构师联盟,每日更新技术好文一、String类想要理解一个类,最好的方法就是看这个类的实现源代码,来看一下String类的源码:public final class String implements java.io.Serializable, Comparable<String>, CharSequence{/** The value is used for character storage. */private final char value[];/** The offset is the first index of the storage that is used. */private final int offset;/** The count is the number of characters in the String. */private final int count;/** Cache the hash code for the string */private int hash; // Default to 0/** use serialVersionUID from JDK 1.0.2 for interoperability */private static final long serialVersionUID = -6849794470754667710L;........}从下面能够看出几点:1)String类是final类,也即意味着String类不能被继承,并且它的成员办法都默认为final办法。在Java中,被final润饰的类是不容许被继承的,并且该类中的成员办法都默认为final办法。2)下面列举出了String类中所有的成员属性,从下面能够看出String类其实是通过char数组来保留字符串的。上面再持续看String类的一些办法实现:public String substring(int beginIndex, int endIndex) { ...

February 1, 2021 · 2 min · jiezi

关于string:String类的substring和lastIndexOf方法的使用

String类的substring()和lastIndexOf()办法的应用两个办法substring():返回字符串的子字符串;语法: public String substring(int beginIndex)public String substring(int beginIndex, int endIndex)beginIndex -- 起始索引(包含), 索引从 0 开始; endIndex -- 完结索引(不包含);lastIndexOf():返回指定字符/字符串在此字符串中最初一次呈现处的索引,如果此字符串中没有这样的字符,则返回 -1;语法: public int lastIndexOf(int ch)public int lastIndexOf(int ch, int fromIndex)public int lastIndexOf(String str)public int lastIndexOf(String str, int fromIndex)ch -- 字符;fromIndex -- 开始搜寻的索引地位,索引起始值为0;str -- 要搜寻的子字符串;举个栗子场景:上传文件时获取文件的后缀名;形容:前端传来文件时(.txt、.png、.jpg等),咱们为了避免重名,个别会在后盾对文件进行重命名,然而要保障不扭转文件的类型,因而要先拿到文件名后缀,而后再通过拼接操作对文件进行重命名; //获取文件名String filename = file.getOriginalFilename();//文件类型后缀String suffix = filename.substring(filename.lastIndexOf(".") + 1);//重命名文件String nickname = System.currentTimeMillis() + "." + suffix;参考链接:https://www.runoob.com/java/j...https://www.runoob.com/java/j...

January 5, 2021 · 1 min · jiezi

关于string:因为这7个C的坑整个团队加班一星期

摘要:近期踩到了一些比拟费解的C++的坑,可把咱们团队给坑惨了~~近期咱们团队进行版本品质加固时,踩到了一些比拟费解的C++的坑,特总结分享在此,供大家参考。 string的字符串拼接,导致coredump 该问题的外围点在于第9行,居然是能够编译通过,其起因是x+"-",会被转成char*,而后与to_string叠加导致BUG。 map的迭代器删除map要删除一个元素,通常通过erase()函数来实现,然而要留神,如果咱们传入了一个iterator作为erase的参数来删除以后迭代器所指向的元素,删除实现后iterator会生效,产生未定义行为。正确的应用办法应该是接管erase()的返回值,让iterator指向被删除元素的下一个元素或者end()。 for ( auto iter = m.begin(); iter != m.end(); iter++) { if (...) iter = m.erase(iter); } 然而上述代码依然有谬误,因为如果触发了删除,那么iter再下一轮循环时会指向下下个元素,所以正确的写法应该是: for ( auto iter = m.begin(); iter != m.end();) { if (...) { iter = m.erase(iter); continue ; } else { iter++; } } stringstream的性能问题stringstream的清空是clear之后,置空。stringstream在任何状况下都比snprintf慢。memset是个很慢的函数,宁愿新创建对象。上述测试后果是单线程,改成多线程,同样成立。str += “a”, 比 str =str+ “a” 效率高很多,后者会创立新对象。智能指针(shared_ptr)应用留神4.1尽量应用make_shared初始化进步性能 std::shared_ptr<Widget> spw(newWidget); 须要调配两次内存。每个std::shared_ptr都指向一个管制块,管制块蕴含被指向对象的援用计数以及其余货色。这个管制块的内存是在std::shared_ptr的构造函数中调配的。因而间接应用new,须要一块内存调配给Widget,还要一块内存调配给管制块 autospw = std::make_shared<Widget>(); 一次调配就足够了。这是因为std::make_shared申请一个独自的内存块来同时寄存Widget对象和管制块。这个优化缩小了程序的动态大小,因为代码只蕴含一次内存调配的调用,并且这会放慢代码的执行速度,因为内存只调配了一次。另外,应用std::make_shared打消了一些管制块须要记录的信息,这样潜在地缩小了程序的总内存占用。 异样平安 processWidget(std::shared_ptr<Widget>( new Widget), //潜在的资源泄露 computePriority()); 上述代码存在内存透露的危险,上述代码执行分为3个步骤: ...

November 3, 2020 · 1 min · jiezi

关于string:常见包装类ListSetHashMap见解

一. Integer与String1.1 Integer包装类,就是对根本数据类型的一个包装,赋予一些罕用的办法 比方类型装换等。 int的包装类,应用final润饰类,不可继承。 会主动装箱与主动拆箱。 特地留神:在-128到127之间,保护了一个数组(static初始化,服务器启动就存在。) 比拟值时,如果是这个区间,则默认从数组中拿出值来进行判断。 Integer a = 1;Integer b = 1;Integer c = 128;Integer d = 128;sout(a == b); // truesout(c == d); // false源码局部 private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} } public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }1.2 String不可变长字符串。 ...

October 22, 2020 · 4 min · jiezi

关于string:初识String源码

前言最近打算开始来读一下JDK的局部源码,这次先从咱们平时用的最多的String类(JDK1.8)开始,本文次要会对以下几个办法的源码进行剖析: equalshashCodeequalsIgnoreCaseindexOfstartsWithconcatsubstringsplittrimcompareTo如果有不对的中央请多多指教,那么开始进入注释。 源码分析首先看下String类实现了哪些接口 public final class String implements java.io.Serializable, Comparable<String>, CharSequence {java.io.Serializable 这个序列化接口没有任何办法和域,仅用于标识序列化的语意。 Comparable<String> 这个接口只有一个compareTo(T 0)接口,用于对两个实例化对象比拟大小。 CharSequence 这个接口是一个只读的字符序列。包含length(), charAt(int index), subSequence(int start, int end)这几个API接口,值得一提的是,StringBuffer和StringBuild也是实现了该接口。 看一下两个次要变量: /** The value is used for character storage. */private final char value[];/** Cache the hash code for the string */private int hash; // Default to 0能够看到,value[]是存储String的内容的,即当应用String str = "abc";的时候,实质上,"abc"是存储在一个char类型的数组中的。 而hash是String实例化的hashcode的一个缓存。因为String常常被用于比拟,比方在HashMap中。如果每次进行比拟都从新计算hashcode的值的话,那无疑是比拟麻烦的,而保留一个hashcode的缓存无疑能优化这样的操作。 留神:这边有一个须要留神的点就是能够看到value数组是用final润饰的,也就是说不能再去指向其它的数组,然而数组的内容是能够扭转的,之所以说String不可变是因为其提供的API(比方replace等办法)都会给咱们返回一个新的String对象,并且咱们无奈去扭转数组的内容,这才是它不可变的起因。 equalsequals() 办法用于判断 Number 对象与办法的参数进是否相等String类重写了父类Object的equals办法,来看看源码实现: 首先会判断两个对象是否指向同一个地址,如果是的话则是同一个对象,间接返回true接着会应用instanceof判断指标对象是否是String类型或其子类的实例,如果不是的话则返回false接着会比拟两个String对象的char数组长度是否统一,如果不统一则返回false最初迭代顺次比拟两个char数组是否相等hashCodehashCode() 办法用于返回字符串的哈希码Hash算法就是一种将任意长度的消息压缩到某一固定长度的音讯摘要的函数。在Java中,所有的对象都有一个int hashCode()办法,用于返回hash码。 依据官网文档的定义:Object.hashCode() 函数用于这个函数用于将一个对象转换为其十六进制的地址。依据定义,如果2个对象雷同,则其hash码也应该雷同。如果重写了 equals() 办法,则原 hashCode() 办法也一并生效,所以也必须重写 hashCode() 办法。 ...

October 5, 2020 · 3 min · jiezi

关于string:String-的总结

String根本个性String : 字符串,应用一对""引起来示意。 String申明为final的。,不可被继承 String 实现了Serializeable接口:示意字符串反对序列化的。实现了Comparable 接口:示意String能够比拟大小 String在jdk8 及以前外部定义了final char[] value 用于存储字符串数据。jdk9 时改为byte[] String存储构造变更String应用byte[]加上编码标记,节约了内存空间 StringBuffer 和StringBuilder 都也有相应的改变。 String的根本个性String代表不可变的字符序列,即不可变性 当对字符串从新赋值时,须要重写指定内存区域赋值,不能应用原有的value进行赋值。当对现有的字符串进行间断操作时,也须要从新指定内存区域赋值,不能应用原有的value进行赋值当调用String的replace()办法批改指定字符或字符串时,也须要从新指定内存区域赋值,不能应用原有的value进行赋值通过字面量的形式(区别于new)给一个字符串赋值,此时的字符串值申明在字符串常量池中。字符串常量池中是不会存储雷同内容的字符串。 String的String Pool 是一个固定大小的Hashtable,默认值大小长度是1009,如果放进String Pool 的String十分多,就会造成Hash抵触,从而导致链表会很长,而链表长了后会造成的影响就是当调用String.intern时性能会大幅降落。 应用-XX:StringTableSize 可设置StringTable的长度 在jdk6中StringTable是固定的,就是1009 的长度,所以如果常量池中的字符串过多就会导致效率降落地很快。StringTableSize设置没有要求 在jdk7中,StringTable的长度默认值是60012 ,jdk8开始,1009是能够设置的最小值。 String 的内存调配Java6及之前,字符串常量池寄存在永恒代。 Java7 中Oracle的工程师对字符串池的逻辑做了很大的变动,行将字符串常量池的地位调整到Java堆内。 所有的字符串都保留在堆(Heap)中,就像其余一般对象一样,这样能够让你在进行调优利用时仅需调整堆大小就能够了。字符串常量池概念本来应用得比拟多,然而这个改变使得咱们有足够的理由让咱们重新考虑在java7 中应用String.intern()。Java8 元空间,字符串常量在堆。 String的基本操作Java语言标准里要求完全相同的字符串字面量,应该蕴含同样的Unicode字符序列(蕴含同一份码点序列的常量),并且必须是指向同一个String类实例。 字符串拼接操作常量与常量的拼接后果是在常量池,原理是编译期优化常量池中不会存在雷同内容的常量只有其中有一个是变量,后果就在堆中。变量拼接的原理是StringBuilder如果拼接的后果调用intern()办法,则被动将常量池中还没有的字符串对象放入池中,并返回对象地址。@Testpublic void test3(){ String s1 = "a"; String s2 = "b"; String s3 = "ab"; /* 如下的s1 + s2 的执行细节:(变量s是我长期定义的) ① StringBuilder s = new StringBuilder(); ② s.append("a") ③ s.append("b") ④ s.toString() --> 约等于 new String("ab") 补充:在jdk5.0之后应用的是StringBuilder,在jdk5.0之前应用的是StringBuffer *//*1. 字符串拼接操作不肯定应用的是StringBuilder! 如果拼接符号左右两边都是字符串常量或常量援用,则依然应用编译期优化,即非StringBuilder的形式。2. 针对于final润饰类、办法、根本数据类型、援用数据类型的量的构造时,能应用上final的时候倡议应用上。 *//** * 如何保障变量s指向的是字符串常量池中的数据呢? * 有两种形式: * 形式一: String s = "shkstart";//字面量定义的形式 * 形式二: 调用intern() * String s = new String("shkstart").intern(); * String s = new StringBuilder("shkstart").toString().intern(); * */public class StringIntern { public static void main(String[] args) { String s = new String("1"); s.intern();//调用此办法之前,字符串常量池中曾经存在了"1" String s2 = "1"; System.out.println(s == s2);//jdk6:false jdk7/8:false String s3 = new String("1") + new String("1");//s3变量记录的地址为:new String("11") //执行完上一行代码当前,字符串常量池中,是否存在"11"呢?答案:不存在!! s3.intern();//在字符串常量池中生成"11"。如何了解:jdk6:创立了一个新的对象"11",也就有新的地址。 // jdk7:此时常量中并没有创立"11",而是创立一个指向堆空间中new String("11")的地址 String s4 = "11";//s4变量记录的地址:应用的是上一行代码代码执行时,在常量池中生成的"11"的地址 System.out.println(s3 == s4);//jdk6:false jdk7/8:true }}public class StringIntern1 { public static void main(String[] args) { //StringIntern.java中练习的拓展: String s3 = new String("1") + new String("1");//new String("11") //执行完上一行代码当前,字符串常量池中,是否存在"11"呢?答案:不存在!! String s4 = "11";//在字符串常量池中生成对象"11" String s5 = s3.intern(); System.out.println(s3 == s4);//false System.out.println(s5 == s4);//true }}总结String 的intern()的应用Jdk1.6中,将这个字符串对象尝试放入串池 ...

August 29, 2020 · 1 min · jiezi