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, | ||
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"字符串,第二次使用的时候就会直接使用这个字符串。
三者的继承结构
三者的区别:
String | StringBuffer | StringBuilder(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
登录页面需要用到哪些框架