一、整数缓冲区integer
- java预先创建了256个常用的整数包装类型对象
- 在实际应用当中,对已创建的对象进行复用。
创建一个Demo02的类,用来测试整数缓冲区。
package com.ClassTest.Packaging;
public class Demo02 {
public static void main(String[] args) {
//面试题
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1==integer2); //false 因为当前是属于引用类型,数据都是在堆里,比较的是栈里面的地址
Integer integer3 =Integer.valueOf(100); //自动装箱
Integer integer4=Integer.valueOf(100);
System.out.println(integer3==integer4);
//true 因为自动装箱实际使用的是Integer.valueof的构造方法,
// 而这个valueof方法中,有一个low跟higt的变量,这个变量的范围设定在-128到127期间,如果超出了,则返回false
Integer integer5 = Integer.valueOf(200); //自动装箱
Integer integer6 =Integer.valueOf(200);;
System.out.println(integer5==integer6); //false
//false 因为自动装箱实际使用的是Integer.valueof的构造方法,
// 而这个valueof方法中,有一个low跟higt的变量,这个变量的范围设定在-128到127期间,如果超出了,则返回false
}
}
综上,能看得出,第一个比较的时候,结果是false,因为当前比较的是引用类型,而引用类型在栈中都是存放在不同的地址,而比较的便是地址。第二个比较的时候,会进行自动转型,其实自动转型的时候使用的是Integer.valueOf这个方法,而这个方法中又存在了一个判断,这个方法里面的静态常量low跟high是固定的值,也就是在堆空间生成的数组,low是-128,而high是127,在这个范围内都是返回同一个地址,给引用变量,而超出后则返回false,所以第三个是false!
二、String类
- 字符串是常量!创建之后不可改变!
- 字符创字面值存储在字符串池中,可以共享!
- String s = “Hello”; 产生一个对象,字符串池中存储
- String s = new String(“Hello”);产生两个对象,堆、堆的方法池各存储一个
创建Demo01的类,用来测试String类
package com.ClassTest.StringClass;
public class Demo01 {
public static void main(String[] args) {
//String类的详解
String name = "hello"; //"hello"存储在字符串池中
name = "zhangsan"; //“zhangsan”赋值给name变量,给字符串赋值时,并没有修改数据,而是重新开辟了一个空间
String name2 = "zhangsan"; //这里的zhangsan会赋值给name2,而栈空间会重新生成一个变量名。但字符串池不会重新开辟空间!
//演示字符串的另一种创建方式、new String();
String str = new String("java"); //会先在方法区里面创建一个对象,然后变量名会到栈中,而值会在堆中,堆再去指向堆中的方法区,再找到这个值
String str2 = new String("java");
System.out.println(str==str2); //这里会得出false,因为==号在比较字符串的时候,比较的是地址,而str跟str2是两个不同的地址!
System.out.println(str.equals(str2)); //这会得出true,因为equals比较的是字符串数据,所以相同!
}
}
结果图
分析图
综上,先做一个简单的分析。
第一个分析,也就是当创建第一个name时,这个变量的值就会存放在堆中的字符串池里,而第二个name时,字符串池里的原有值并不会消失,也不会更改,而是开辟一个新的空间,用来存储这个值,而变量名还是同一个,在创建第三个name,也就是name2的时候,这个name2开始去堆的方法区里进行匹配有没有这个数值,如果有,则直接指向同一个数值,不会重新开辟新的空间!
第二个分析,当使用new String()的方式来创建时,str变量名会被存放在栈中,而对象会存在堆中,数值会被存放在堆的方法区中,当str去使用这个数值的时候,会先通过对象去访问,然后这个对象再去指向方法区中的字符串池,找到这个数值
第三个分析,也就是判断输出语句,为什么表示false。因为==号在输出时字符串时比较的是两个变量名的内存地址,而equals比较的是两个字符串的数据,所以相同!
三、String类常用方法
1、public int length() :返回字符串的长度。
2、public char charAt(int index):根据下标获取字符。
3、public boolean contains(String str):判断当前字符串中是否包含str,返回false或者true。
4、public char[] toCharArray():将字符串转换成数组。
5、public int indexOf(String str):查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1;
6、public int lastIndexOf(String str):查找字符串在当前字符串中最后一次出现的下标索引。
7、public String trim():去掉字符串前后的空格。
8、public String toUpperCase():将小写转成大写。
9、public String toLowerCase():将大写转成小写。
10、public boolean endWith(String str):判断字符串是否以str结尾。
11、public boolean startwith (String str):判断字符串是否以str开头。
11、public String replace(char oldChar,char newCha):将旧字符串替换成新字符串。
12、public String[] split(String str):根据str做拆分。
测试类
package com.ClassTest.StringClass;
import java.util.Arrays;
public class Demo02 {
//String 常用方法
public static void main(String[] args) {
//字符串方法的使用
String content = "java是世界上最好的编程语言 java是真的好";
//1、length(); 返回字符串的长度
System.out.println("--------------1、length()返回字符串的长度-------------------");
System.out.println("当前的字符串长度为"+content.length());
//2、charAt(int index);返回某个位置的字符
System.out.println("--------------2、charAt(int index);返回某个位置的字符-------------------");
System.out.println("第五个字符时:"+content.charAt(4)); //下标从0开始计算 所以写4!
//3、contains(String str);判断是否包含某个子字符串
System.out.println("--------------3、contains(String str);判断是否包含某个子字符串-------------------");
System.out.println("是否包含php:"+content.contains("php"));
//4、toCharArray();返回字符串对应的数组
System.out.println("--------------4、toCharArray();将字符串转换成数组-------------------");
System.out.println("转换成数组后:"+ Arrays.toString(content.toCharArray())); //这里需要将数组打印出来,否则会返回数组的地址
//5、indexOf(String str);返回子字符串首次出现的位置
System.out.println("--------------5、indexOf(String str);返回子字符串首次出现的位置-------------------");
System.out.println("”是“字首次出现的下标为:"+content.indexOf("是"));
//6、lastIndexOf(String str);返回子字符串最后出现的位置
System.out.println("--------------6、lastIndexOf(String str);返回子字符串最后出现的位置-------------------");
System.out.println("”是“字最后一次出现的下标为:"+content.lastIndexOf("是"));
//7、trim();去掉字符串前后的空格
System.out.println("--------------7、trim();去掉字符串前后的空格-------------------");
String content2 = " Hello World java!";
System.out.println("去掉前后空格后:"+content2.trim());
//8、toUpperCase();将小写转成大写
System.out.println("--------------8、toUpperCase();将小写转成大写-------------------");
System.out.println("将小写转成大写后:"+content2.toUpperCase());
//9、toLowerCase():将大写转成小写
System.out.println("--------------9、toLowerCase():将大写转成小写-------------------");
System.out.println("将大写转成小写后:"+content2.toLowerCase());
//10、endwith(str);判断字符串是否以str结尾
System.out.println("--------------10、endwith();判断字符串是否以str结尾-------------------");
System.out.println("当前语句是否以指定值(!)结尾:"+content2.endsWith("!"));
//11、startwith(str);判断字符串是否以str开头
System.out.println("--------------11、startwith();判断字符串是否以str开头-------------------");
System.out.println("当前语句是否以指定值(d)开头:"+content2.startsWith("d"));
//12、replace(char old,char new);用新的字符或字符串替换旧的字符或字符串
System.out.println("--------------12、replace(char old,char new);用新的字符或字符串替换旧的字符或字符串-------------------");
System.out.println("将java替换后为:"+content2.replace("java","php"));
//13、split();对字符进行拆分
System.out.println("--------------13、split();对字符进行拆分-------------------");
String say = "length tochararray,indexof,lastindexof charat contains" +
" trim toUpperCase toLowerCase endwith starwith replace split";
String[] arr = say.split("[ ,]+");
System.out.println("拆分后的长度为:"+arr.length);
for (String string:arr
) {
System.out.println(string);
}
}
}
综上。可以看到String类中常用方法的作用以及使用方法!特别需要注意的是将方法的使用情况记住,面试题可能会问到,object 类的也是!
练习String类中的方法
- 需求:
- 已知String str = “this is a text”;
- 1、将str中的单词单独获取出来
- 2、将str中的text替换成practice
- 3、将text前面插入一个easy
- 4、将每个单词的首字母改成大写
package com.ClassTest.StringClass;
import java.util.Locale;
public class Demo03 {
//案例学习
public static void main(String[] args) {
String str = "this is a text";
//需求:
//1、将str中的单词单独获取出来
System.out.println("--------------1、将str中的单词单独获取出来-----------------");
String[] arr = str.split(" ");
for (String sum:arr
) {
System.out.println(sum);
}
//2、将str中的text替换成practice
System.out.println("--------------2、将str中的text替换成practice-----------------");
System.out.println(str.replace("text", "practice"));
//3、将text前面插入一个easy
System.out.println("--------------3、将text前面插入一个easy-----------------");
System.out.println(str.replace("this is a text","this is a easy text"));
//4、将每个单词的首字母改成大写
System.out.println("--------------4、将每个单词的首字母改成大写-----------------");
for (int i = 0; i < arr.length; i++) {
char first = arr[i].charAt(0);
//把第一个字符转成大写
char upperfirst = Character.toUpperCase(first);
//substring方法,是截取字符串,开始角标为1,到最后!
//这里是将提取后的数值加上i,点后的为截取开始到字符结束,This也就是h开始!然后合并
String news = upperfirst+arr[i].substring(1);
System.out.println(news);
}
}
}
综上,也是完成了四个小内容的测试,主要是substring方法,这个是之前没有说到的,他的作用主要是从某一个下标开始截取后面的数据!可以记一下这个方法
注:文章仅做个人学习日记,不做学习建议,学习来源:千峰教育