String在内存中的分析:

public class Demo {
public static void main(String[] args){
String a = new String("xx"); //1、首先解释器在堆中的常量池中查找是否有xx变量,没有则创建。有就不在常量池中创建
//2、在堆中再创建一个对象xx;a中的地址指向它;
//所以,new一个字符串。至少会创建一个对象。最多创建两个
String b = "xx"; //直接赋值。最多创建一个对象,如果常量池中有,就不会在创建对象; //----------------------------------------------------------------
String c = "a";
String e = "a1";
String d = c+1; //在编译的是由,c为变量,并不能确定c的最终只为多少,所以d在运行期才被赋值.会创建新的对象,d指向的是堆中的变量,不会是指向常量池
System.out.println(d==e);//false; final String f = "a";
String g = f+1; //在编译的时候,由于f为常量,不可以被修改.所以g肯定是确定的,为a1;
String h = "a1";//此时h使用已有的字符串a1;
System.out.println(g==h);//true String i = getA();
String j = i+1;
String k = "A1";
System.out.println(j==k);//false,getA()方法只能在运行期才能加载。所以i不可知; final String i2 = getD();
String j2 = i+1;
String k2 = "A1";
System.out.println(j2==k2);//false,getA()方法只能在运行期才能加载。所以i不可知; }
public static String getA(){
return "A";
}
public static String getD(){
return "A";
}
}

考编译器的优化,编译时"s"+"s"将直接变成"ss",c+c则不会优化,因为不知道在之前的步骤中c会不会发生改变,而针对c+c则是用语法糖,新建一个StringBuilder来处理

        String b = "s"+"s";
String c= "s";
System.out.println(a==b); //true
System.out.println(c+c==a);//false

字符串的方法:  

占位符

System.out.println(String.format("%s %s","a","b"));

通过索引找字符串:charAt()

String x = "sdfdsfsd";
char a = x.charAt(2);
System.out.println(a);

将字符串变成数组:toCharArray()

String x = "sdfdsfsd";
System.out.println(Arrays.toString(x.toCharArray()));

将字符  数组-->成字符串

//字符数组变成字符串
char[] arr = {'a','b','c'};
System.out.println(new String(arr)); //abc //字节数据变成字符串
byte[] arr2 = {-73, -88};
System.out.println(new String(arr2)); //法 String s2 = new String(arr,0,2);//不包括2
System.out.println(s2); //ab

字符和数字以及字符和字符串之间转化

        char a = '的';
int b = (int)a;
String c = ""+a;
System.out.println(b);
System.out.println(c);

  

获取每一个字符串的字节:getBytes()

String s = "sdfds";
System.out.println(Arrays.toString(s.getBytes()));//[115, 100, 102, 100, 115]

字符串转编码

        String s = "编码";
System.out.println(Arrays.toString(s.getBytes()));
//表示将"编码"编码成gbk
byte[] gbks = s.getBytes("gbk");
System.out.println(Arrays.toString(gbks));
//表示将字节gbks通过编码gbk编码成字符
System.out.println(new String(gbks,"gbk"));

  字符在网络中传输绝大多数都采用utf-8编码成字节的。但是在到达tocmat的时候采用ISO-8859-1来解码就会报错。所以我们只要修改解码的方式就可以了

  参考:https://www.jb51.net/article/145741.htm:为什么要对serlvet进行编码转换

  下面这种思想完全错误,解码和编码应该是对字节进行操作。不能对乱码后的字符串进行编码(丝毫没有意义),我们必须从源头的字节入手,原因在于我们对方再用gbk编码,我们采用utf-8解码,所以我们获取到字节的时候,也需要再用gbk解码就好了

        String s = "编码";
byte[] gbks = s.getBytes("gbk");
String s1 = new String(gbks, "utf-8");
//将文字故意乱码
System.out.println(s1);//����
//重新对s1进行编码
byte[] bytes = s1.getBytes("utf-8");
//重新对s1进行编码
String s2 = new String(bytes, "gbk");
//String s2 = new String(bytes, "utf-8");
System.out.println(s2);

我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,请你讲讲如何输出一个某种编码的字符串?

Public String translate (String str) {
String tempStr = “”;
try {
tempStr = new String(str.getBytes(“ISO-8859-1″), “GBK”);
tempStr = tempStr.trim();
}
catch (Exception e) {
System.err.println(e.getMessage());
}
return tempStr;
}

字符串替代:replace()   replaceAll()

String s = "sdf33d33s";
System.out.println(s.replace("d","w"));
System.out.println(s.replaceAll("\\d", "*")); //使用正则

字符串截取 substring()

String s = "sdf33d33s";
System.out.println(s.substring(2,4));

字符串切割 split()

String s = "sdf33d33s";
System.out.println(Arrays.toString(s.split("d")));

字符串包含字符串 contains()

String s = "sdf33d33s";
System.out.println(s.contains("df"));

查找 indexOf()  lastindexOf()

String s = "sdf33d33s";
System.out.println(s.indexOf("df")); //返回字符串所在的索引

判断字符串是否为空 isEmpty()

String s = "sdf33d33s";
System.out.println(s.isEmpty());//为空不代表为null

去掉字符串前后的空格 trim()

String s = "sdf33d33s";
System.out.println(s.trim());

判断字符串是否是指定的字符开头startsWith("x")

boolean s1 = "s".startsWith("s");

字符串反转

System.out.println(new StringBuffer("fs").reverse());

比较大小,忽略大小写 equalsIgnoreCase

"d".equalsIgnoreCase()

  

在spring框架中有一个StringUtils工具类可以对String进行操作

StringUtils.hasLength(username)
StringUtils.isBlank(beginWeek)
StringUtils.isEmpty(xx)

  

StringBuffer使用:

StringBuffer s = new StringBuffer();
s.append(a).append(b).append(1);
s.delete()//删除
s.indexOf()
s.insert()
s.replace()
s.substring()
s.reverse()//字符串反转
System.out.println(s+"==");

减少字符串拼接产生多余的垃圾(变量之间的拼接,会产生多余的对象,常量和常量拼接只会产生一个对象)

如果确定的拼接字符串的个数,new StringBuffer(个数) ,加上个数,可以减少数组重复扩展,性能上有提高

补充:StringBuffer和StringBuilder的区别

StringBuffer()    线程安全,性能低,多线程使用;

StringBuilder()  不安全,性能高,单线程使用,使用占大多数

String剖析之拼接

https://blog.csdn.net/izard999/article/details/6708433

补充

选出字符串中的数字的几种方法;

方法1;

public static void byteArray() {
String s = "sdf34543的GDFSDF";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
int ai = c; //Integer.valueOf(c)
if (48<=ai&&ai<=57){
System.out.println(c);
}
}
}

方法2;

参考我的这篇博客,字节数组流:https://www.cnblogs.com/yanxiaoge/p/10699061.html

方法3;

public static void byteArray() {
String s = "sdf3454d的3GDFSDF";
byte[] bytes = s.getBytes();
for (byte b:bytes){
if (b>=48&&b<=58){
char c = (char) b;
System.out.println(c);
}
}
}

java----String解析的更多相关文章

  1. java基础解析系列(九)---String不可变性分析

    java基础解析系列(九)---String不可变性分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)---In ...

  2. java基础解析系列(一)---String、StringBuffer、StringBuilder

    java基础解析系列(一)---String.StringBuffer.StringBuilder 前言:本系列的主题是平时容易疏忽的知识点,只有基础扎实,在编码的时候才能更注重规范和性能,在出现bu ...

  3. IDEAL葵花宝典:java代码开发规范插件:GsonFormat插件将JSONObject格式的String 解析成实体

    前言: GsonFormat插件主要用于使用Gson库将JSONObject格式的String 解析成实体,该插件可以加快开发进度,使用非常方便,效率高. 这个教程主要是学习IntelliJ IDEA ...

  4. JAVA String对象和字符串常量的关系解析

    JAVA String对象和字符串常量的关系解析 1 字符串内部列表 JAVA中所有的对象都存放在堆里面,包括String对象.字符串常量保存在JAVA的.class文件的常量池中,在编译期就确定好了 ...

  5. Java Sax解析

    一.   Java Sax解析是按照xml文件的顺序一步一步的来解析,在解析xml文件之前,我们要先了解xml文件的节点的种类,一种是ElementNode,一种是TextNode.如下面的这段boo ...

  6. Java XML解析工具 dom4j介绍及使用实例

    Java XML解析工具 dom4j介绍及使用实例 dom4j介绍 dom4j的项目地址:http://sourceforge.net/projects/dom4j/?source=directory ...

  7. String解析

    常量池(Constant Pool):指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据.JVM虚拟机为每个被装载的类型维护一个常量池.常量池就是该类型所用到常量的一个有序集和,包括 ...

  8. Java泛型解析(03):虚拟机运行泛型代码

    Java泛型解析(03):虚拟机运行泛型代码      Java虚拟机是不存在泛型类型对象的,全部的对象都属于普通类,甚至在泛型实现的早起版本号中,可以将使用泛型的程序编译为在1.0虚拟机上可以执行的 ...

  9. java socket解析和发送二进制报文工具(附java和C++转化问题)

    解析: 首先是读取字节: /** * 读取输入流中指定字节的长度 * <p/> * 输入流 * * @param length 指定长度 * @return 指定长度的字节数组 */ pu ...

  10. Java XML解析器

    使用Apache Xerces解析XML文档 一.技术概述 在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组 ...

随机推荐

  1. java SPI & spring factories

    SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制.SPI是一种动态替换发现的机制, 比如有个接口,想运行时动态的给它添加实现,你只需要添加 ...

  2. Setup Post-mission Camera

    编辑BP_GameMode 新建Actor命名为BP_SpectatingViewpoint 添加摄像机 将摄像机调整到合适的位置,右键选择 调整到合适的位置,点击这个按钮,退出驾驶模式 摄像机已经移 ...

  3. tp5.0 SHOW COLUMNS FROM 生成数据表字段缓存

    TP5.0 生成数据表字段缓存 =控制台执行以下命令= 1.生成指定数据库的所有表字段缓存 php think optimize:schema --db databaseName 2.生成指定数据表的 ...

  4. 动态规划 - 213. House Robber II

    URL: https://leetcode.com/problems/house-robber-ii/ You are a professional robber planning to rob ho ...

  5. Go语言模拟实现简单的区块链

    一.创建项目 按照Go语言最佳实践的思路, 在工作空间下的src目录下创建 github.com/hangzhou-huxin/blokcchain目录作为我们的项目目录,然后用GoLand工具选中这 ...

  6. XE7/X10.2 Datasnap使用 dbExpress 连接MySQL数据库

    本人使用:DELPHI X10.2.2 版本连接 MYSQL 5.1 (安装 mysql-5.1.72-win32.msi)的32位版本,开始连接不了: 将 MYSQL 5.1 安装目录下bin 中的 ...

  7. Vue.js 子组件的异步加载及其生命周期控制

    前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心.这其中不得不提到 Vue.js 这个专注于 VM 层的框架. 本文主要对 Vue.js 组件化开发 ...

  8. 使用命令行解析php文件

    使用命令行解析php文件,这样可以调用Log4PHP库中的一些demo,因为默认的输出使用命令行作为输出. 建一个bat文件: echo 以下是使用命令行解析php文件 C:\xampp\php\ph ...

  9. System.Data.SqlClient.SqlException: 数据类型 text 和 varchar 在 equal to 运算符中不兼容。

    一.引起的源头 环境:vs2015,sqlserver2008 相关程序包:ef6 定义了一个实体article public class Article { public string Data{g ...

  10. TX2 开发套件串口

    TX2的底板上有三个串口,位于J21的ttyTHS1,位于J17的ttyTHS2和给蓝牙使用的ttyTHS3. ttyTHS1是控制台串口(serial console),再启动的时候会通过它打印一系 ...