String是Java开发中最最常见的,本篇博客针对String的原理和常用的方法,以及String的在开发中常见问题做一个整体性的概括整理.因为之前对String的特性做过一些分析,所以不在详细描述,以分条的形式

总体记录。

一 :String变量保存位置

   Java JVM实现中采用 用永久代保存字符串常量池,字符串常量池中实际上保存的是 String对象引用,字面量形式定义的字符串 (String s1 = "hehe") 会先判断字符串是否已存在。

   但是 如果是变量的形式 或者是 new得到的,会保存到堆中 。

   s1 s2 都是放在常量池 。s4 s5 都是运行时才可以得到值,是存在堆中的。

String s1 = "haha";
String s2 = "haha";
System.out.println(s1 == s2);//true
String s3 = "ha";
String s4 = s3+"ha";
System.out.println(s1 == s4); //false String s5 = new String("haha");
System.out.println(s5 == s1);//false

二 :String变量不可变

    从JVM角度看,String因为用途广,为提高效率,每次都先去常量池中判断String是否存在,如果存在就复用该对象。不存在时再去添加,达到共享String,提高效率的目的。

三:String.intern()方法

    官网描述: 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用

四:String 使用乱码解决

    因为编码差异,经常会出现中文字符串乱码的问题。这是需要对String添加编码的控制

    String.getBytes(String decode)方法会根据指定的decode编码返回某字符串在该编码下的byte数组表示

    String的getBytes()方法是得到一个字串的字节数组,这是众所周知的。但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组

    而与getBytes相对的,可以通过new String(byte[], decode)的方式来还原这个“中”字时,这个new String(byte[], decode)实际是使用decode指定的编码来将byte[]解析成字符串

public static void main(String[] args) throws UnsupportedEncodingException {
String s1 = "测试乱码问题";
String s2 = new String(s1.getBytes("GBK"),"GBK");
System.out.println(s2);
}

五:String 和其他数据类型之间转化

 整数转为String ,可以通过  “重载过的+运算符 ” 实现,或者是  “调用Integer.toString()”,或者是“直接用String.valueOf(int)”

 String 转为Integer  Integer.parseInt(String)   或者 Integer.valueOf(s1)

 一定注意 “可能会抛出转换异常”

 Integer i1 = 123;
// String s1 = ""+i1;
String s1 = Integer.toString(i1);
System.out.println(s1 instanceof String);//true
System.out.println(s1.equals("123"));//true

备注 : 结合第一条说的 利用+  将int转为String  会产生两个String对象  ,所以推荐用Integer.toString()

六:String 和String数组 和Char数组和byte数组的关系

   1:String 和 cahr[]数组 : 唯一的关联大概就是 String 实际上采用 char数组保存 ,下面是 我反编译String的源码。

    其次String 和char的区别就是 char只保存单个字符,String保存的是多个字符

public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
/** The value is used for character storage. */
private final char value[];
....

  2:String 和byte[]数组

     主要解决中文乱码问题

  3: byte 和char  (可以参考  “char与byte的区别” )

      byte是字节数据类型有符号型的、占1个字节、大小范围为-128——127

      char是字符数据类型无符号型的、占2个字节(unicode码)、大小范围为0-65535

     所以 :

     char 不可以表示负数,byte是有符号型的,可以表示-128—127 的数 

char c =  (char) -3; // char不能识别负数,必须强制转换否则报错,即使强制转换之后,也无法识别
System.out.println(c);
byte d1 = 1;
byte d2 = -1;
byte d3 = 127; // 如果是byte d3 = 128;会报错
byte d4 = -128; // 如果是byte d4 = -129;会报错
System.out.println(d1);
System.out.println(d2);
System.out.println(d3);
System.out.println(d4);

      char可以表中文字符,byte不可以 。但我试图去打印byte表示的汉字得到的是 ASCII码,当我试图转化为char时发现并没有的到中

    byte c1 = (byte)'中';
System.out.println(c1);//
System.out.println((char)c1);//-

         char、byte、int对于英文字符,可以相互转化

    byte c1 = (byte)'c';
System.out.println((char)c1);//c
System.out.println(c1);//

  4:byte[] 和char的相互转化 : 参考 “Java 中byte 与 char 的相互转换” 。因为char直接强转 byte 失败 (byte一位而char是两位),所以char --byte[]--char是可以的

class Test{
public static byte[] charToByte(char c) {
byte[] b = new byte[2];
b[0] = (byte) ((c & 0xFF00) >> 8);//高位
b[1] = (byte) (c & 0xFF);
return b;
}
public static char byteToChar(byte[] b) {
char c = (char) (((b[0] & 0xFF) << 8) | (b[1] & 0xFF));
return c;
}
public static void main(String[] args) {
char c = '中';
System.out.println(Test.byteToChar(Test.charToByte(c)));
}
}

参考 : “& 0xFF 与 & 0xFF00 的作用

七:String  在Json中的用法

  Json中经常用到字符串转为json对象或者是转为json数组,一定注意这里说的是 在java后台用到json的时候的做法。与javaScript半毛钱没关系

   json工具库万千,转化的方法也不同。在这里,我不一一列举,我用的是net.sf.json

八:常用的拼接字符串方式

   + : String s1 = "ad"+"bc';

     Stringbuilder    stringbuilder.append("asda");

九:String常用方法

   toLowerCase() 转换为小写

   valueOf() 转换为字符串

   trim() 去掉起始和结尾的空格

   substring() 截取字符串

   indexOf() 查找字符或者子串第一次出现的地方

   toCharArray()

   getBytes()

     charAt() 截取一个字符 

   length() 字符串的长度

深入理解String的关键点和方法的更多相关文章

  1. ASP.Net string 类的扩展方法 [转]

    string 类的扩展方法列表(基本相同于 IEnumerable<T> 接口的成员列表): Aggregate<>     //累加 All<>        / ...

  2. 跟着刚哥梳理java知识点——深入理解String类(九)

    一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class String implements java.io.Ser ...

  3. Java基础3:深入理解String及包装类

    更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...

  4. 深入理解String类详解

    1.Stringstr = "eee" 和String str = new String("eee")的区别 先看一小段代码, 1 public static ...

  5. 深入理解String类

    1.String str = "eee" 和String str = new String("eee")的区别 先看一小段代码, public static v ...

  6. JVM体系结构之七:持久代、元空间(Metaspace) 常量池==了解String类的intern()方法、常量池介绍、常量池从Perm-->Heap

    一.intern()定义及使用 相信绝大多数的人不会去用String类的intern方法,打开String类的源码发现这是一个本地方法,定义如下: public native String inter ...

  7. String中的“equal方法”和“==”

    二话不说,先来说下重写的事情: 在Java中,String .Math.还有Integer.Double....等这些封装类重写了Object中的equals()方法,让它不再比较其对象在内存中的地址 ...

  8. String类中intern方法的原理分析

    一,前言 ​ 昨天简单整理了JVM内存分配和String类常用方法,遇到了String中的intern()方法.本来想一并总结起来,但是intern方法还涉及到JDK版本的问题,内容也相对较多,所以今 ...

  9. Java 干货之深入理解String

    可以证明,字符串操作是计算机程序设计中最常见的行为,尤其是在Java大展拳脚的Web系统中更是如此. ---<Thinking in Java> 提到Java中的String,总是有说不完 ...

随机推荐

  1. MySQL查询1

    1.将下列语句复制到sqlyog的询问栏 /*!40101 SET NAMES utf8 */; create table `t_student` ( `id` double , `stuName` ...

  2. 第二篇--Jmeter测试Java请求

    前提:需要准备eclipse作为开发工具,安装jdk,准备完毕,接下来开工喽! 1.新建Java工程BMIrisJNIJarTest,新建lib目录,将Jmeter安装目录下lib/ext包下的Apa ...

  3. 在shell脚本中使用alias

    Linux shell有交互式与非交互式两种工作模式.我们日常使用shell输入命令得到结果的方式是交互式的方式,而shell脚本使用的是非交互式方式.   shell提供了alias功能来简化我们的 ...

  4. Centos 6修复/boot目录及fstab等系统文件

    author:JevonWei 版权声明:原创作品 错误界面 系统修复过程中,若需要修复fatab挂载文件,磁盘分区为lvm逻辑卷格式,则默认在修复模式下处于不可活动状态,需使用vgchage -ay ...

  5. Centos 6系统修复grub

    author:JevonWei 版权声明:原创作品 错误界面如下时,应该是grub的stage数据有缺失,应该从新安装grub GRUB引导的stage1阶段损坏,系统启动会直接进入光盘引导界面,st ...

  6. C#格式符

    在输出字符串时,使用格式说明  使字符串显示适当的格式,比如:货币格式,或者科学计数法.百分比等. 以下是格式化的数字字符串  格式. {index, alignment: format} 例如: ; ...

  7. JVM(二)JVM内存布局

    这几天我再次阅读了<深入理解Java虚拟机>之第二章"Java内存区域与内存溢出异常",同时也参考了一些网上的资料,现在把自己的一些认识和体会记录一下.  (本文为博主 ...

  8. spring cloud认识

    Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状 ...

  9. 《Java从入门到放弃》JavaSE入门篇:异常

    异常!!!看看生活中的异常例子: 正常情况下,从家到公司上班,只需要20分钟!但如果在路上碰到堵车或修路或车突然自燃等问题,那就没办法正常去上班了.其中堵车或修路或车突然自燃等问题就属于异常. 碰到异 ...

  10. asp.net MVC下使用rest

    前言 最近做了下个MVC的项目,需要用到rest接口,与java写的应用程序通信,包括数据的接收和发送,那么我将用实用的角度来全面的讲解一下它的使用方法 一.创建rest服务 首先创建一个Asp.Ne ...