关于java中的字符与字符串(String、char、Character)

public static void main(String[] args) {
    Integer a = new Integer(3);
    Integer b = 3;  // 将3自动装箱成Integer类型
    int c = 3;
    System.out.println(a == b); // false 两个引用没有引用同一对象
    System.out.println(a == c); // true a自动拆箱成int类型再和c比较
    System.out.println(b == c); // true
 
    Integer a1 = 128;
    Integer b1 = 128;
    System.out.println(a1 == b1); // false
 
    Integer a2 = 127;
    Integer b2 = 127;
    System.out.println(a2 == b2); // true
}

String 类的常用方法

方法名

参数列表

作用

length()

缺省

返回字符串长度

isEmpty()

缺省

是否为空

charAt()

(int index) 

返回指定索引处的字符

codePointAt()

(int index)

codePointBefore()

(int index)

codePointCount()

(int beginIndex, int endIndex)

offsetByCodePoints()

(int index, int codePointOffset)

getChars

(char dst[], int dstBegin)

按照下标返回字符串

(int srcBegin, int srcEnd, char dst[], int dstBegin)

getBytes()

(int srcBegin, int srcEnd, byte dst[], int dstBegin)

返回字符串的 byte 类型数组

(String charsetName)

(Charset charset)

缺省

equals

(Object anObject)

判断两个字符串是否相等(首先判断类型),字符串比较

contentEquals

(StringBuffer sb)

nonSyncContentEquals

(AbstractStringBuilder sb)

contentEquals

(CharSequence cs)

equalsIgnoreCase

(String anotherString)

compareTo

(String anotherString)

compareToIgnoreCase

(String str)

regionMatches

(int toffset, String other, int ooffset, int len)

(boolean ignoreCase, int toffset, String other, int ooffset, int len)

startsWith

(String prefix, int toffset)

(String prefix)

endsWith

(String suffix)

hashCode

缺省

indexOf

(int ch)

返回指定字符的索引

(int ch, int fromIndex)

(String str)

(char[] source, int sourceOffset, int sourceCount, String target, int fromIndex)

(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset, int targetCount, int fromIndex)

indexOfSupplementary

(int ch, int fromIndex)

lastIndexOf

(int ch)

(int ch, int fromIndex)

(String str)

(String str, int fromIndex)

(char[] source, int sourceOffset, int sourceCount, String target, int fromIndex)

(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset, int targetCount, int fromIndex)

lastIndexOfSupplementary

(int ch, int fromIndex)

substring

(int beginIndex)

截取字符串

(int beginIndex, int endIndex) 

subSequence

(int beginIndex, int endIndex)

concat

(String str)

replace

(char oldChar, char newChar)

字符串替换

matches

(String regex)

contains

(CharSequence s)

replaceFirst

(String regex, String replacement)

replaceAll

(String regex, String replacement)

replace

(CharSequence target, CharSequence replacement)

split()

(String regex, int limit)

分割字符串,返回一个分割后的字符串数组。

(String regex)

join

(CharSequence delimiter, CharSequence... elements)

(CharSequence delimiter,
        Iterable<? extends CharSequence> elements)

toLowerCase

(Locale locale)

将字符串转成小写字母

缺省

toUpperCase()

(Locale locale)

将字符串转成大写字符

缺省

trim()

去除字符串两端空白

toString()

toCharArray()

format

(String format, Object... args)

(Locale l, String format, Object... args)

valueOf

(Object obj)

(char data[])

(char data[], int offset, int count)

(boolean b)

(char c)

(int i)

(long l)

(float f)

(double d)

copyValueOf

(char data[], int offset, int count)

(char data[])

intern

缺省

java 中操作字符串的类以及它们之间的区别:

 在java中经常使用String类型,String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,这样不仅效率低下,而且大量浪费有限的内存空间。我们来看一下这张对String操作时内存变化的图:

例题:

String a = new String("hello" + "world");

问最终创建了几个对象?答案是3个。分别是hello、World、helloWorld

我们可以看到,初始String值为“hello”,然后在这个字符串后面加上新的字符串“world”,这个过程是需要重新在栈堆内存中开辟内存空间的,最终得到了“hello world”字符串也相应的需要开辟内存空间,这样短短的两个字符串,却需要开辟三次内存空间,不得不说这是对内存空间的极大浪费。为了应对经常性的字符串相关的操作,谷歌引入了两个新的类——StringBuffer类(StringBuffer字符串变量)和StringBuild类(StringBuilder字符串变量)来对此种变化字符串进行处理。

例题1:第一次运行代码 String string = new String("abc");创建字符串abc,jvm中会产生几个对象?

2个,因为除了新建的那个对象,JVM会在常量区另外存储一个"abc"字符串,第二次使用的时候就会直接使用这个字符串。

三者的继承结构

三者的区别:

StringStringBufferStringBuilder(Java5 )
名称不可变字符串可变字符串
效率特别低,占内存StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
线程安全不安全(不能同步访问)
描述String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
线程安全,多线程环境下推荐使用非线程安全,但 StringBuilder 的性能却高于 StringBuffer,单线程环境下推荐使用
适用场景如果要操作少量的数据用 String;当对大量字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
多线程操作字符串缓冲区下操作大量数据 StringBuffer;单线程操作字符串缓冲区下操作大量数据 StringBuilder。
初始化可以赋空值不可以赋空值不可以赋空值
常用方法concat():拼接字符串

reverse():反转,将字符串完全倒序

apend():追加字符串,即在后面增加字符串;

stringBuffer线程安全的原因:在stringBuffer的源码中,可以看到有很多synchronized修饰的方法,这样就保证了在使用stringBuffer的线程安全,而stringBuider中却没有synchronized关键字修饰,所以不能保证线程安全。

①String

String s = null;   
String s = “abc”;   

②StringBuffer

StringBuffer s = null; //结果警告:Null pointer access: The variable result can only be null at this location
StringBuffer s = new StringBuffer();//StringBuffer对象是一个空的对象
StringBuffer s = new StringBuffer(“abc”);//创建带有内容的StringBuffer对象,对象的内容就是字符串”

字符串反转

使用 StringBuilder 或者 stringBuffer 的 reverse() 方法。

示例代码:

// StringBuffer reverse
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
// StringBuilder reverse
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System.out.println(stringBuilder.reverse()); // gfedcba

String str="abc"与 String str=new String(“abc”)不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。

两个语句都会先去字符串常量池中检查是否已经存在 “xyz”,如果有则直接使用,如果没有则会在常量池中创建 “xyz” 对象。

另外,String s = new String("xyz") 还会通过 new String() 在堆里创建一个内容与 "xyz" 相同的对象实例。

所以前者其实理解为被后者的所包含。

10、String s = new String("xyz") 创建了几个字符串对象?

一个或两个。如果字符串常量池已经有“xyz”,则是一个;否则,两个。

当字符创常量池没有 “xyz”,此时会创建如下两个对象:

一个是字符串字面量 "xyz" 所对应的、驻留(intern)在一个全局共享的字符串常量池中的实例,此时该实例也是在堆中,字符串常量池只放引用。

另一个是通过 new String() 创建并初始化的,内容与"xyz"相同的实例,也是在堆中。

2.HTML有哪些行内标签:

用java语言找数组中的最小值:

SSM框架:

5.项目中怎么跟数据库做连接,用到了哪些数据库?sql优化有哪些方法?索引是什么?作用是什么?

6.Mybatis框架的作用是什么?

做过那些项目

项目用到了那些框架

说一下Spring

登录页面需要用到哪些框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肆〇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值