java--基础知识--三大特殊类
三大特殊类包括:String类,Object类,包装类
String类
定义:不可变更的类(是被final所修饰的)String的拼接每次都会产生一个新的对象。
1丶赋值方式
直接赋值(内存在常量池):
String str = "Hello Bit"
*;
构造法(内存在堆):
String str1 = new String("Hello bit");
直接赋值只会开辟一块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
构造方法会开辟两块堆内存空间,其中一块成为垃圾空间,不会自动保存在对象池中,可以使用intern()方法手动入池。
String str = new String("Hello").intern();
一下赋值方式下内存分别位于:
public int data1 = 10;//堆
public static int data2 = 20;//方法区
public static final int DATA = 30;//方法区
public final int DATA2 = 40;//堆
2丶面试题
String StringBuffer StringBuilder的区别和联系?
一丶StringBuffer是多线程情况下使用,synchronized是线程安全的关键字,StringBuilder没有 String也没有,这两是单线程情况下使用,不安全。
二丶String每次都会产生新的空间,StringBuffer 和StringBuilder 不产生新的空间(不产生垃圾空间)。
三丶String的拼接底层被优化为StringBuilder,会调用append进行拼接,结果将会调用StringBuilder的toString()
提示:如果在循环体内进行拼接,最好用StringBuilder
String每次拼接都会产生新的对象
String str = "abc";
System.out.println(Integer.toHexString(str.hashCode()));
str = str+"def";
System.out.println(Integer.toHexString(str.hashCode()));
str = str+"gh";
System.out.println(Integer.toHexString(str.hashCode()));
System.out.println(str);
用append方法进行拼接不会产生新的空间
System.out.println("======华丽的分割线======");
StringBuffer stringBuffer = new StringBuffer();
System.out.println(Integer.toHexString(stringBuffer.hashCode()));
stringBuffer.append("ab");
System.out.println(Integer.toHexString(stringBuffer.hashCode()));
stringBuffer.append("cd");
System.out.println(Integer.toHexString(stringBuffer.hashCode()));
StringBuilder stringBuilder = new StringBuilder();
System.out.println(Integer.toHexString(stringBuilder.hashCode()));
stringBuilder.append("ab");
System.out.println(Integer.toHexString(stringBuilder.hashCode()));
stringBuilder.append("cd");
System.out.println(Integer.toHexString(stringBuilder.hashCode()));
1.将字符数组中的所有内容变为字符串
2.将部分字符数组中的内容变为字符串
3.取得指定索引位置的字符,索引从0开始
4.将字符串变为字符数组返回
public class TestDemo1 {
public static void main(String[] args) {
1 char[] value = {'a', 'b', 'c', 'd', 'e'};
String str = new String(value);
System.out.println(str);
2 String str1 = new String(value, 0, 2);
System.out.println(str1);
3 String str2 = "WZM";
char ch = str2.charAt(0);
System.out.println(str2);
4 char[] ch1 = str2.toCharArray();
System.out.println(Arrays.toString(ch1));
}
}
字符串比较
1丶区分大小写的比较。
2丶不区分大小写的比较。
3丶比较两个字符串大小关系。
String str1 = "Hello";
String str2 = "hello";
1 System.out.println(str1.equals(str2));
2 System.out.println(str1.equalsIgnoreCase(str2));
3 System.out.println(str1.compareTo(str2));
字符串查找
1丶判断一个字符串是否存在
2丶从头开始查找指定字符串的位置,查到了返回位置的开始索引,如果查不到返回-1.
3丶从指定位置开始查找子字符串的位置
4丶由后向前查找子字符串位置
5丶从指定位置由后向前查找
6丶判断是否以指定字符串开头
7丶从指定位置开始判断是否以指定字符串开头
8丶判断是否以指定字符串结尾
String str1 = "Helloworld";
System.out.println(str1.contains("world"));
System.out.println(str1.indexOf("Wzm"));
System.out.println(str1.indexOf("world"));
System.out.println(str1.indexOf("llo",1));
System.out.println(str1.lastIndexOf("He"));
System.out.println(str1.lastIndexOf("Hello",5));
System.out.println(str1.startsWith("Hello"));
System.out.println(str1.startsWith("Hello",0));
System.out.println(str1.endsWith("ld"));
字符串替换
1丶替换所有内容
2丶替换首个内容
String str2 = "WzmHello";
System.out.println(str2.replaceAll("Wzm","bit"));
System.out.println(str2.replaceFirst("W","bi"));
字符串拆分
tring str = "super wzm hello bit";
String [] result = str.split(" ");
for(String s:result){
System.out.println(s);
}
String [] result2 = str.split(" ",3);
for(String s:result2){
System.out.println(s);
}
特殊情况:* ^ . \ : |
,这些需要使用“\“转义
String str = "192.168.1.1";
String[] str1 = str.split("\\.");
for(String s:str1){
System.out.println(s);
}
字符串截取
默认截取区间是左闭右开
1丶从指定索引截取到结尾
2丶截取部分内容
String str = "helloworld";
System.out.println(str.substring(5));
System.out.println(str.substring(0,5));
Object类
Object是java魔人提供的一个类,所有的类都会默认继承Object,所有类的对象都可以使用Object进行接收。
使用Object接受所有类的对象
class Person{ }
class Student{ }
public class TestDemo1 {
public static void main(String[] args) {
fun(new Person());
fun(new Student());
}
public static void fun (Object obj){
System.out.println(obj);//默认调用Object的toString方法
}
}
包装类
包装类就是讲基本数据类型封装到类中
装箱与拆箱:
装箱:把简单类型包装为一个对象。
Integer a = 10; // 自动装箱 // 调用的方法是Integer valueOf()
Integer a2 = new Integer(value:20); // 显示装箱
拆箱:把包装类拆分为一个对应的简单类型。
int i = a; // 自动拆箱 //调用的方法是 Integer. intvalue:()
double d= a.doublevalue(); // 显示拆箱 2