关于Java中String的一些问题整理

对字符串的一些操作一直很搞不懂

比如创建的字符串什么时候相等 常量池是啥东西?

String和其他类型的转换?

StringBuffer StringBuilder都是干啥的?

一直想彻底搞明白,但是总是拖着,最近去官网看了看说明文档,感觉豁然开朗。

明明是很简单的事情,千万不要拖。

分享一下整理的文档,希望可以帮到你。

String的常量特性

Because String objects are immutable they can be shared.

String是常量,他们可以被共享。

String可以被存储到两个地方:字符串常量池 ,堆内存。

  • 双引号创建的字符串对象,在字符串常量池中存储同一个。
  • java存在编译优化机制,程序在编译时 "a"+"b"+"c"会转化成 "abc",编译完后的class文件里面直接变成“abc”。
  • 通过new构造器创建的字符串对象,在堆内存中分开存储。
  • 通过运算产生的字符串也会新开辟内存。

String str = "abc";
String str1 = "a"+"b"+"c"; 			//相同
char data[] = {'a', 'b', 'c'};
String str2 = new String(data);		//不同   new了一个新对象

编译完后的class文件里面直接变成“abc”。

String常用API

直接将两个字符串比较,比较的是地址,比如s1==s2;

若比较内容应该用String提供的API

public boolean equals(Object anObject);  //比较内容
public boolean equalsIgnoreCase(String anotherString); // 忽略大小写 比较字符串

public int length();  //返回此字符串的长度
public char charAt(int index);  //获取某个索引位置处的字符
public char[] toCharArray();   	//将当前字符串转换成字符数组
public String subString(int beginIndex, int endIndex);	//根据开始和结束的索引 截取字符串
public String subString(int beginIndex);	//从beginIndex截取到末尾
public String replace(CharSequence target, CharSequence replacement); //使用新值替换旧值
public String[] split(String regex); //根据传入的规则切割字符串,得到字符串数组返回

String与其他类型的转换

数据类型

字符串转换为其他数据类型的方法

其他数据类型转换为字符串的方法

boolean

Boolean.getBoolean(str)

String.valueOf([boolean] b)

int

Integer.parseInt(str)

String.valueOf([int] i)

long

Long.parseLong(str)

String.valueOf([long] l)

float

Float.parseFloat(str)

String.valueOf([float] f)

double

double.parseFloat(str)

String.valueOf([double] d)

char[] 数组

String str;

char[] chars;

chars=str.toCharArray();

String str1 = new String(chars);

String str2 = String.valueOf(chars);

Object 类中有个方法 toString(); 所以所有的类都可以转换成String;

String 类有个方法 valueOf(); 所有类都可以转换成String;

主要就是char[]数组 要单独写出来;

Stringbuffer

Strings are constant; their values cannot be changed after they are created. String buffers support mutable strings.

  • 因为String是常量,一旦创建 值无法被修改。而String buffer支持可变字符串。所以当我们对字符串操作时常常使用Stringbuffer。
  • Stringbuffer是线程安全的
  • 他的核心操作就是append 和insert,一个在末尾加,一个在中间指定位置插入。
  • 每个字符串缓冲区都有容量。只要字符串缓冲区中包含的字符序列的长度不超过容量,就没有必要分配新的内部缓冲区数组。如果内部缓冲区溢出,它会自动变大。
  • 从JDK 5版开始,这个类增加了一个为单线程设计的等价类,StringBuilder。通常应该优先使用StringBuilder类,因为它支持所有相同的操作,但速度更快,因为它不执行同步。

Constructor 构造器

StringBuffer();
StringBuffer(String str);			//传入一个String
StringBuffer(int capacity);			//固定好容量
StringBuffer(CharSequence seq);		//可以传入SB和String

Method

sb.append(); 									//在sb末尾加东西
StringBuffer	insert(int offset, Object obj);  //在offset位置插入

void	setCharAt(int index, char ch);  //设置index处的字符为ch

StringBuffer delete(int start, int end);
StringBuffer deleteCharAt(int index);

int indexOf(String str); //返回sb中与string匹配的第一个index

StringBuffer	reverse(); //翻转sb

String substring(int start, int end); //裁剪

StringBuilder

多个线程使用StringBuilder的实例是不安全的。如果需要这样的同步,那么建议使用StringBuffer。

其他和StringBuffer完全一样。

CharSequence 接口

就是String,SB的父接口,

接口有这些方法 charAt, chars, codePoints, isEmpty, length, subSequence, toString

All Known Implementing Classes:

CharBuffer, Segment, String, StringBuffer, StringBuilder

Method:

char charAt(int index);				//返回索引处的字符char
static int compare(CharSequence cs1,
                   CharSequence cs2);	//按照字典顺序比较两个字符串
default boolean isEmpty();			//是否为空
int	length();						//返回长度
CharSequence subSequence(int start, int end);	//截取一节子串
String	toString();					//转换成String

这说明了 StringBuffer ,StringBuilder,String 都有这几个方法,

并且SB可以toString转化为String。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值