Java字符串的那些事儿。。。。
计划围绕以下几个方面
1.内存
2.正则表达式
3.String.format
4.编码
1.内存
先来看个经典的例子
public class Blog {
    public static void main(String[] args) {
        String s0 = "123";
        String s1 = "123";
        String s2 = new String("123");
        String s3 = new String("123");
        System.out.println(s0 == s1);// true
        System.out.println(s2 == s3);// false
        System.out.println(s1 == s2);// false
    }
}
String是字符串常量,java.lang.String被设计为final类,不允许被继承和修改。 例子中的s0和s1都相当于常量,直接放在内存的stack中。而s2和s3作为引用类型被new出来,都是放在heap中。而java的 == 是直接判断栈中的值,所以s0和s1相等,而当用s1和s2比较时,实际是用s1在stack中的“123”和s2在stack中引用的内存地址相比较,所以不相等。
String不是基本数据类型,如果需要使用字符串变量时应该使用StringBuffer或者StringBuilder,前者线程安全。
————————————————————————————————————————————————————————
2.正则
首先介绍几个java.lang.String中的常用使用正则的方法:
String.matches
String.replaceAll
String.replaceFirst
String.split
下面是例子代码
public class Blog {
    public static void main(String[] args) {
        String s0 = "ccc123aaa456bbb";
        System.out.println(s0.matches(".*\\d+.*"));
        System.out.println(new String(s0).replaceAll("\\d", "-"));
        System.out.println(new String(s0).replaceFirst("\\d", "-"));
        String[] split = s0.split("\\d+");
        for (String string : split) {
            System.out.println(string);
        }
    }
}
matches用来判断一个字符串是否符合某些规则,比如常见的邮箱合法检测都可以用正则来实现。
split是分割,把字符串按其中匹配正则的子串切割成几段返回字符串数组。
replaceAll和replaceFirst是将string中的符合此正则的串替换成想要替换的字符串。
这个在开发中也可以用,如果使用Eclipse想把一个很长的串比如“aaa”,“aaa”,“aaa”,“aaa”,“aaa”,“aaa”,想分成多行排列,可以使用ctrl+F中的Regular expression

然后replaceAll即可。
而java提供的正则工具类是
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class Blog {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("\\d");
Matcher matcher = pattern.matcher("1");
boolean result = matcher.find();
System.out.println(result);
}
}
关于正则的规则,可以在java doc的java.util.regex.Pattern中找到详细介绍。要注意java的正则和其他js等语言的正则不一定完全通用,因为各个语言正则使用的标准不一定一样。
简单贴几条
| 字符 | |
|---|---|
| x | 字符 x | 
| \\ | 反斜线字符 | 
| \0n | 带有八进制值 0 的字符 n (0 <= n <= 7) | 
| \0nn | 带有八进制值 0 的字符 nn (0 <= n <= 7) | 
| \0mnn | 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7) | 
| \xhh | 带有十六进制值 0x 的字符 hh | 
| \uhhhh | 带有十六进制值 0x 的字符 hhhh | 
| \t | 制表符 ('\u0009') | 
| \n | 新行(换行)符 ('\u000A') | 
| \r | 回车符 ('\u000D') | 
| \f | 换页符 ('\u000C') | 
| \a | 报警 (bell) 符 ('\u0007') | 
| \e | 转义符 ('\u001B') | 
| \cx | 对应于 x 的控制符 | 
| 字符类 | |
| [abc] | a、b 或 c(简单类) | 
| [^abc] | 任何字符,除了 a、b 或 c(否定) | 
| [a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) | 
| [a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) | 
| [a-z&&[def]] | d、e 或 f(交集) | 
| [a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) | 
| [a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) | 
| 预定义字符类 | |
| . | 任何字符(与行结束符可能匹配也可能不匹配) | 
| \d | 数字:[0-9] | 
| \D | 非数字: [^0-9] | 
| \s | 空白字符:[ \t\n\x0B\f\r] | 
| \S | 非空白字符:[^\s] | 
| \w | 单词字符:[a-zA-Z_0-9] | 
| \W | 非单词字符:[^\w] | 
| POSIX 字符类(仅 US-ASCII) | |
| \p{Lower} | 小写字母字符:[a-z] | 
| \p{Upper} | 大写字母字符:[A-Z] | 
| \p{ASCII} | 所有 ASCII:[\x00-\x7F] | 
| \p{Alpha} | 字母字符:[\p{Lower}\p{Upper}] | 
| \p{Digit} | 十进制数字:[0-9] | 
| \p{Alnum} | 字母数字字符:[\p{Alpha}\p{Digit}] | 
| \p{Punct} | 标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ | 
| \p{Graph} | 可见字符:[\p{Alnum}\p{Punct}] | 
| \p{Print} | 可打印字符:[\p{Graph}\x20] | 
| \p{Blank} | 空格或制表符:[ \t] | 
| \p{Cntrl} | 控制字符:[\x00-\x1F\x7F] | 
| \p{XDigit} | 十六进制数字:[0-9a-fA-F] | 
| \p{Space} | 空白字符:[ \t\n\x0B\f\r] | 
| java.lang.Character 类(简单的 java 字符类型) | |
| \p{javaLowerCase} | 等效于 java.lang.Character.isLowerCase() | 
| \p{javaUpperCase} | 等效于 java.lang.Character.isUpperCase() | 
| \p{javaWhitespace} | 等效于 java.lang.Character.isWhitespace() | 
| \p{javaMirrored} | 等效于 java.lang.Character.isMirrored() | 
| Unicode 块和类别的类 | |
| \p{InGreek} | Greek 块(简单块)中的字符 | 
| \p{Lu} | 大写字母(简单类别) | 
| \p{Sc} | 货币符号 | 
| \P{InGreek} | 所有字符,Greek 块中的除外(否定) | 
| [\p{L}&&[^\p{Lu}]] | 所有字母,大写字母除外(减去) | 
| 边界匹配器 | |
| ^ | 行的开头 | 
| $ | 行的结尾 | 
| \b | 单词边界 | 
| \B | 非单词边界 | 
| \A | 输入的开头 | 
| \G | 上一个匹配的结尾 | 
| \Z | 输入的结尾,仅用于最后的结束符(如果有的话) | 
| \z | 输入的结尾 | 
| Greedy 数量词 | |
| X? | X,一次或一次也没有 | 
| X* | X,零次或多次 | 
| X+ | X,一次或多次 | 
| X{n} | X,恰好 n 次 | 
| X{n,} | X,至少 n 次 | 
| X{n,m} | X,至少 n 次,但是不超过 m 次 | 
| Reluctant 数量词 | |
| X?? | X,一次或一次也没有 | 
| X*? | X,零次或多次 | 
| X+? | X,一次或多次 | 
| X{n}? | X,恰好 n 次 | 
| X{n,}? | X,至少 n 次 | 
| X{n,m}? | X,至少 n 次,但是不超过 m 次 | 
| Possessive 数量词 | |
| X?+ | X,一次或一次也没有 | 
| X*+ | X,零次或多次 | 
| X++ | X,一次或多次 | 
| X{n}+ | X,恰好 n 次 | 
| X{n,}+ | X,至少 n 次 | 
| X{n,m}+ | X,至少 n 次,但是不超过 m 次 | 
| Logical 运算符 | |
| XY | X 后跟 Y | 
| X|Y | X 或 Y | 
| (X) | X,作为捕获组 | 
| Back 引用 | |
| \n | 任何匹配的 nth 捕获组 | 
| 引用 | |
| \ | Nothing,但是引用以下字符 | 
| \Q | Nothing,但是引用所有字符,直到 \E | 
| \E | Nothing,但是结束从 \Q 开始的引用 | 
| 特殊构造(非捕获) | |
| (?:X) | X,作为非捕获组 | 
| (?idmsux-idmsux) | Nothing,但是将匹配标志i d m s u x on - off | 
| (?idmsux-idmsux:X) | X,作为带有给定标志 i d m s u x on - off | 
| (?=X) | X,通过零宽度的正 lookahead | 
| (?!X) | X,通过零宽度的负 lookahead | 
| (?<=X) | X,通过零宽度的正 lookbehind | 
| (?<!X) | X,通过零宽度的负 lookbehind | 
| (?>X) | X,作为独立的非捕获组 | 
要注意有些正则需要转义。而如果正则要转义java又要转义,那很可能会出现\\\\的情况比如
public class Blog {
    public static void main(String[] args) {
        System.out.println("\\".matches("\\\\"));    // true
        System.out.println("\\".matches("\\"));      // err
    }
}
3.string.format()
String.format相关资料可以参考这里http://developer.51cto.com/art/201203/322815.htm
就不赘述了。比较常用的功能就是把数据整理成各种格式,比如2013.12.12转成2013-12-12,或者把一个0到100的数字整理成001,014,068这种,很方便。
4.编码。
比如一个String "不要啊"。
内存中是不会存放中文的,计算机只认识0和1。
可以看一下下面的例子。
import java.io.UnsupportedEncodingException;
public class TestChar {
    public static void main(String[] args) {
        String s = new String("不要啊");
        byte[] bytes;
        try {
            bytes = s.getBytes("GBK");
            for (byte b : bytes) {
                System.out.print(b + " ");
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
打印结果是6个byte。
而当把GBK换成utf-8的时候,打印结果就是9个byte。因为utf-8中一个中文占3个字节。
转换编码可以这样
public class TestChar {
    public static void main(String[] args) {
        String s0 = new String("不要啊");
        String s1;
        try {
            s1 = new String(s0.getBytes(), "GBK");
            System.out.println(s1);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
当然这样转换会有乱码的可能。
转码也可以用java.net.URLEncoder.encode(String s, String enc)
好了就写这些吧,不对不足之处还望指出。
Java字符串的那些事儿。。。。的更多相关文章
- Java日志框架那些事儿
		文章首发于[博客园-陈树义],点击跳转到原文Java日志框架那些事儿. 在项目开发过程中,我们可以通过 debug 查找问题.而在线上环境我们查找问题只能通过打印日志的方式查找问题.因此对于一个项目而 ... 
- Java 字符串格式化详解
		Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ... 
- (转)Java字符串
		转自:http://blog.sina.com.cn/s/blog_899678b90101brz0.html 创建字符串有两种方式:两种内存区域(字符串池,堆)1," " 引号创 ... 
- Java字符串split函数的注意事项
		Java字符串的split方法可以分割字符串,但和其他语言不太一样,split方法的参数不是单个字符,而是正则表达式,如果输入了竖线(|)这样的字符作为分割字符串,会出现意想不到的结果, 如, Str ... 
- 关于java字符串编译优化问题
		情景一:不好的字符串拼接习惯 起因是这样的:一个大牛在写了一篇关于java字符串优化问题的讲解,他提到:不要使用strObj+otherValue的方法将otherValue转换为字符串形式,因 ... 
- Java字符串排列算法
		Java字符串排列算法 题目:现有ABCDE 5个球 构成的排列组合 可重复抽取 最多取到16个 共有多少种组合方式? 比如:取1个球可以构成的组合有 A B C D E 共5种,取2个球可以构成的组 ... 
- Java字符串转换
		public class StringConvertToInt{ public static void main(String[] args) { String a ="12a34bW()5 ... 
- Java字符串null相加
		Java字符串null相加 最近和同事讨论了下面的一段代码: String a = null; a += a; System.out.println(a); 运行结果: nullnull 本着学习的态 ... 
- JAVA字符串格式化String.format()的使用
		JAVA字符串格式化-String.format()的使用常规类型的格式化 String类的format()方法用于创建格式化的字符串以及连接多个字符串对象.熟悉C语言的同学应该记得C语言的sprin ... 
随机推荐
- SGU326 Perspective(指派问题)
			题目简单吧,如果知道题目要干嘛的话. 每个比赛指定A赢或者B赢使它们赢得次数不超过1赢得次数.建立一个二分图模型,X部比赛,Y部队伍,用最大流求解,如果最后最大流等于比赛场数就有解. 然而我还是掉坑里 ... 
- BZOJ3790 : 神奇项链
			Manacher求出所有极长回文子串后,得到一堆线段,转化成线段覆盖问题 预处理出g[i]表示左端点不超过i的右端点的最大值 贪心地线段覆盖即可 时间复杂度$O(n)$ #include<cst ... 
- 安装rkhunter
			#!/bin/bash if [ ! -d /soft ];thenmkdir /soft fiwhich rkhunterif [ $? -eq 0 ];then echo "rkhunt ... 
- [办公自动化] 再读《让EXCEL飞》(从excel导入access数据时,union联合查询,数据源中没有包含可见的表格)
			一年多以前就买了@Mrexcel的<让excel飞>这本书.整体思路是利用access结合excel,大幅度提高数据分析效率. 最近又拿出来看了看.第十五章,比高级筛选更“高级”,P241 ... 
- twitter storm源码走读之8 -- TridentTopology创建过程详解
			欢迎转载,转载请注明出处,徽沪一郎. 从用户层面来看TridentTopology,有两个重要的概念一是Stream,另一个是作用于Stream上的各种Operation.在实现层面来看,无论是str ... 
- vi 编辑器常用命令
			VI编辑器可以分为3种状态,它们分别是命令模式.输入模式以及末行模式,VI运行后默认进入命令模式. 命令模式:控制屏幕光标的移动,字符.单词或行的删除.替换,复制粘贴数据以及由此进入插入模式和末行模式 ... 
- 用thinkphp进行微信开发的整体设计思考
			用thinkphp进行微信开发的整体设计思考 http://www.2cto.com/weixin/201504/388423.html 2015-04-09 0个评论 作者:明 ... 
- Rails--bundle exec rake db:migrate
			--新建表: def up create_table :[TABLE_NAME] do |t| t.column :[NUM], :integer t.column :[NAME], :string ... 
- mysql安装tcmalloc
			TCMalloc(Thread-Caching Malloc)是google-perftools工具中的一个,与标准的glibc库的malloc相比,TCMalloc在内存的分配上效率和速度要高得多, ... 
- docker安装与启动
			安装docker [root@localhost /]# yum -y install docker-io 更改配置文件 [root@localhost /]# vi /etc/sysconf ... 
