博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串学习笔记
阅读量:5885 次
发布时间:2019-06-19

本文共 4015 字,大约阅读时间需要 13 分钟。

hot3.png

字符串

可以证明,字符串操作是计算机程序设计中对常见的行为。

String是不可变的。

// fianl修饰,意味着String不能被继承public final class String    implements java.io.Serializable, Comparable
, CharSequence

String对象是不可变的,String类中每个修改String对象的方法,实际上都是创建了一个新的String对象。(可以看JDK源码)

// 传递的name其实是引用的一个拷贝    // 原本的引用还是没有变的    // 其实当把String对象作为方法的参数时,都会复制一份引用    public static String upCase(String name) {        // 这里赋值其实就是将name引用的地址改了        // “Jack”还是在那个原来的物理位置        name = name.toUpperCase();        return name;    }    public static void main(String[] args) {        String name = "Jack";        String newName = StringMain.upCase(name);        System.out.println(name);        System.out.println(newName);    }

因为String对象具有只读特性,所以,一个String可以被多个引用所引用(可以加任意多的别名),因为所以引用都不可能改变它的值。

不可变性会带来效率问题,为对象重载的“+”操作符就是一个例子。重载的意思是,一个操作符在应用于特定的类时,被赋予了特殊的意义(用于String的“+”和“+=”是Java仅有的两个重载过的操作符,Java不允许编程人员重载任何操作符)

StringBuilder

如果需要衔接很多字符串的话,推荐使用StringBuilder类来储存字符串,创建StringBuilder时还能允许你为其指定大小。指定StringBuilder的大小可以避免多次分配缓存(可看JDK源码得知)。

public static String upCase(StringBuilder name) {        return name.append("!").toString();    }    public static void main(String[] args) {        // 指定StringBuilder的大小可以避免多次分配缓存        // StringBuilder name = new StringBuilder(10000);        // 直接添加String对象,将会让StirngBuilder容器的大小为字符串长度        StringBuilder name = new StringBuilder("Jack");        String newName = StringMain.upCase(name);        System.out.println(name);// Jack!        System.out.println(newName);// Jack!    }

从上述代码可知,StringBuilder.append是真的在字符串所在的缓存地址里添加字符串进去。

无意识的递归

Java中每个类从根本上是继承Object类的,所以都有toString()方法,并且覆盖了该方法。 例如ArrayList.toString()输出的是包含的所有对象。 注意:如果你想打印出对象的内存地址,应该使用Object.toString()。

格式化输出

System.out.format("%s", "24");        // printf方法内部调用了format方法        System.out.printf("%s", "24");

在Java中,所有新的格式化功能都是由java.util.Formatter类来处理(上述的format方法内部调用formatter.format方法)

// 在实例化Formatter时,可以添加参数用来作为输出方式常用的有PrintStream、OutputStream、File。    Formatter formatter = new Formatter(System.out);    formatter.format("my name is %s\n", "Jack");    formatter.format("my name is %s\n", "Merry");        // 在插入数据时,如果想要控制空格和对齐,// 需要更精细复杂的格式修饰符。语法如下:    // %[argument_index$][flags][width][.precision]conversion    formatter.format("%-15s %15s %5.2f\n", "my name is", "Jackson", 1.2222f);    formatter.format("%-15s %15s %5.2f\n", "your name is", "Wal", 1.222f);    formatter.format("%-15s %15s %5.2f\n", "his name is", "Jack", 0f);    /*output:    my name is              Jackson  1.22    your name is                Wal  1.22    his name is                Jack  0.00    */

正则表达式

正则表达式提供非常强大的文本处理功能。比如处理字符串是否合乎规范等。 语法如下:

^为限制开头^java 条件限制为以java为开头字符$为限制结尾java$条件限制为以java为结尾字符.条件限制除\n以外任意一个单独字符java..条件限制为java后除换行外任意两个字符[a-z]条件限制在小写a to z 范围中一个字符[A-Z]条件限制在大写A to Z范围中一个字符[a-zA-Z]条件限制在小写a to z或A to Z范围中一个字符[0-9]条件限制在0到9范围中的一个字符[0-9a-z]条件限制在小写0到9或a to z 范围中的一个字符[0-9[a-z]]条件限制在小写0 to 9 或 a to z 范围中的一个字符(交集)[]中加入^后加再次限制条件[^][^a-z]条件限制在非小写a-z范围中的一个字符[^A-Z]条件限制在非小写A to Z范围中的一个字符[^a-zA-Z]条件限制在非小写a-z或A to Z范围中的一个字符[^0-9] 条件限制在非小写0 to 9范围中一个字符[^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符[^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集)在限制条件为特定字符出现0次以上时,可以使用[*]j* 0个以上j.* 0个以上任意字符j.* d j与d之间0个以上任意字符在限制条件为特定字符出现1次以上时,可以使用[ + ]j+ 一个以上j.+ 一个以上任意字符j.+d j与d之间一个以上任意字符在限制条件为特定字符出现有0次或1次以上时,可以使用[?]ja? j或者ja出现限制为连续出现指定次数字符 [{a}]j{2} jjj{3} jjj文字a个以上,并且[{a,}]j{3,} jjj jjjj jjjjj(三次以上j并存)a个以上,b个以下[{a,b}]j{3,5} jjj或jjjj或jjjjj两者取一[|]j|a j或ajava|hello java或hello[()]中规定一个组合类型

在Java中,比起String类,我们更愿意构造功能强大的正则表达式对象。只需要导入java.util.regex包,然后用static Pattern.compile()方法来编译你的正则表达式即可。他会根据你的String类型的正则表达式生成一个Pattern对象,接下来把你要检索的字符串传入matcher()方法。matcher方法会生成一个Matcher对象。,例如replaceAll()方法,将所有匹配的部分都替代为你传入的参数。

System.out.println(Pattern.matches("[1-9]{3}", "123"));// truePattern pattern = Pattern.compile("[1-9]+");Matcher matcher = pattern.matcher("1235 123 2f");System.out.println(matcher.matches()); // false// 将输出1235 123 2while (matcher.find()) {    System.out.print(matcher.group() + " ");}

关于正则表达式、Pattern、Matcher这里就不再介绍了,同学可以去网上搜索相关语法、方法。

转载于:https://my.oschina.net/StupidZhe/blog/1558810

你可能感兴趣的文章
SAP S/4 HANA新变化-SD销售与分销
查看>>
winform 窗体实现增删改查(CRUD)窗体基类模式
查看>>
MySQL · 特性分析 · 数据一样checksum不一样
查看>>
CIO的责任不仅仅是信息管理
查看>>
vs2015 Xamarin.Android安装
查看>>
SpringMVC空字符串转为null
查看>>
我需要完全理解这部分代码才能确保它能够正常工作,如果由我来修复代码中的问题,我是不会这么写的,因此希望你也不要这么来写(转)...
查看>>
Spark_SQl
查看>>
查看光纤卡的WWN号
查看>>
【百度地图API】如何在地图上添加标注?——另有:坐标拾取工具+打车费用接口介绍...
查看>>
机器学习之梯度下降法
查看>>
笔记本外接2-3个屏幕
查看>>
SDL2.0教程翻译·目录
查看>>
嵌入式 Linux进程含义知多少
查看>>
类加载器的双亲委派及打破双亲委派
查看>>
Docker入门教程(二)命令
查看>>
python中多线程与非线程的执行性能对比
查看>>
R3 Corda 1.0即将问世,创想本地硬件和云端存储混合的未来
查看>>
安全市场风云变幻 Sophos发力移动和云
查看>>
Android应用UI设计流程
查看>>