Java学习--字符串

Java学习–字符串

前言

因为实习需要的原因,最近在从C++转向Java的学习,主要从《Core Java》这本书的第一卷入手,目前学习的主要内容都和C++的使用习惯比较相似,到了字符串这里感觉有很大不同,这里主要分两部分记录一下学习重点:Java字符串的基本概念和码点与代码单元的概念。

Java字符串简介

首先要改变一点C++的认识,就是字符串String是由char组成的数组,实际上在Java中String是“immutable”不可转变的,我们不能直接改变一个字符串的内容。可以看成Java中String只是一个指针,指向了公共存储池中的某一个字符串,那么我们就无法通过这个指针去修改一个公共的内容,想去改变只能去更改指针的指向。同时,对字符串的判等也不能单纯利用两个String对象进行“==”操作,因为这本质上只是判断两个String是不是指向同一处。

Java字符串常用方法
	String greeting = "Hello";
	String s = greeting.substring(0,3);
	//从greeting字符串中取出[0,3)区间的子串
	String expletive = "Expletive";
	String PG13 = "deleted";
	String message = expletive + PG13;
	/*
	Java可以和C++一样利用“+”进行字符串拼接,同时如果将
	一个字符串与一个非字符串的值进行拼接时,后者会转换成字符串
	*/
	String all = String.join(" / ", "S", "M", "L", "XL");
	/*
	 all is the string "S / M / L / XL"
	 Java中String类的静态方法join可以实现通过界定符将字符串拼接
	 */
	 String repeated = "Java".repeat(3);
	 //将一个字符串重复并拼接
	 s.equals(t);
	 "Hello".equals(greeting);
	 //判断字符串内容是否相同
	 “Hello”.equalsIgnoreCase("hello");
	 //忽略大小写判断是否相同
	 str.length() == 0;
	 str.equals("");
	 //字符串为空
	 str == null;
	 //字符串为null
码点与代码单元

由于编码的原因,Unicode中不同的字符对应的存储空间是不同的,编码的细节我也不清楚目前也不是我关心的重点,只需要知道有一些相对冷门的符号需要占用两个char的大小,所以就会出现了这里要讨论的问题。

    public static void main(String[] args) {
        String hello = "hi𝕆";
        System.out.println(hello.length());//4
        System.out.println(hello.codePointCount(0, hello.length()));//3
    }

对于特殊符号“𝕆”,占用了2个char的空间,那么使用String类的charAt方法就不能获得正确结果。

    public static void main(String[] args) {
        String hello = "hi𝕆";
        int length = hello.length();
        for(int i=0;i<length;i++) {
            char charAt = hello.charAt(i);
            System.out.println(Integer.toHexString(charAt));
        }
        /*
        68
		69
		d835
		dd46
		得到了4个代码单元
        */
        int codePointCount = hello.codePointCount(0, length);
        for(int i=0;i<codePointCount;i++) {
            int charAt = hello.codePointAt(i);
            System.out.println(Integer.toHexString(charAt));
        }
        /*
        68
		69
		1d546
		得到了3个码点
        */
    }

我们获得了一个值如何判断是否是有效的,也就是是不是在有效的码点上:

	Character.isValidCodePoint(charAt);

码点转字符串:

	char[] chars = Character.toChars(0x1d546);
	String str = new String(chars);
	System.out.println(str);//𝕆
charSequence类

顾名思义,charSequence类就是一个字符序列,CharBuffer, Segment, String, StringBuffer, StringBuilder都是由它实现的。
CharSequence是可读的字符值序列。这个接口提供了对许多不同类型的char序列的统一的只读访问。char值表示基本多语言平面(BMP)或代理中的字符。有关详细信息,请参阅Unicode字符表示。
这个接口没有细化equals和hashCode方法的一般契约。因此,测试两个实现CharSequence的对象是否相等的结果通常是未定义的。每个对象都可以由不同的类实现,并且不能保证每个类都能够测试其实例以确保与其他类的实例相等。因此,使用任意的CharSequence实例作为集合中的元素或映射中的键是不合适的。(从reference doc抄的)

StringBuffer类

StringBuffer类对象保存可修改的字符序列。
构造方法:

StringBuffer()
StringBuffer(int capacity)
StringBuffer(String initialString)

与String类的转换:

String s = "Hello";
StringBuffer sbuf = StringBuffer(s);
StringBuffer sbuf = new StringBuffer();
String s = sbuf.toString();

实现修改操作的方法:

append(String str)
delete(int start, int end)
insert(int offset, string str)
replace(int start, int end, String str)
reverse()
String toString()
int capacity()
char charAt(int index)
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
int indexOf(String str)
int indexOf(String std, int fromIndex)
int lastIndexOf(String str)
int lastIndexOf(String std, int fromIndex)
void setCharAt(int index, char ch)
void setLength(int newLength)
CharSequence subSequence(int start, int end)
String subString(int start)
String subString(int start, int end)
StringTokenizer

java.util.StringToken类提供了对字符串进行解析和分割的功能
构造方法:

StringTokenizer(String str, String delim)
//delim为分割符

主要方法:

public int countTokens();//分割穿的个数
public boolean hasMoreTokens();//是否还有分割串
public String nextToken();

例子:

StringTokenizer st = new StringTokenizer("this is a test", " ");
while (st.hasMoreTokens()) {
    System.out.println(st.nextToken());
}
st = new StringTokenizer("192.168.0.1", ".");
double sum = 0;
while (st.hasMoreTokens()) {
    sum += Double.parseDouble(st.nextToken());
}

参考:https://blog.csdn.net/diehuang3426/article/details/83422309

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值