7、Java内置工具类

geeklee / 2023-05-03 / 原文

Java内置工具类

1.字符串类

1.String类

  • String类不能被修改
  • 其被修改的本质是申请新的内存空间,所以其每一次更改都会new新的对象
  • 适用于需要量小不怎么修改的字符串时

2.StringBuffer和StringBuilder

  • StringBuffer是多线程安全的类,适用于多线程。
  • StringBuilder是多线程不安全的类,适用于单线程。
  • 他们在被修改的时候不会new对象,适用于大量的修改字符串时

2.Scanner类

public class Test {

	public static void main(String[] args) {
        //通过new一个Scanner类对象获得标准输入设备
		Scanner in = new Scanner(System.in);
		
		int data;
        //当输入的数据时Int类型时进行循环并输出,不是int直接返回false
		while(in.hasNextInt()) {
			data = in.nextInt();
            System.out.println(data);
		}
		
		in.close();

	}
		
}
  • hasNext()和hasNextLine区别:

当程序遇到它们时就会停下等待输入,hasNext()会判断键盘缓冲区是否有非空白输入,若有,则会把非空白输入放入缓冲区,否则会一直等待非空白输入,而hasNextLine()会判断键盘缓冲区是否有输入(包括空白输入),回车键结束输入然后把所得输入放入键盘缓冲区

  • in.next()和in.nextLine()区别:

两者都会从键盘缓冲区读取数据,前者会读取非空白输入(当遇到第一个非空白数据开始读取,之后在遇到空白数据会停下,若无非空白数据则不会结束),并释放键盘缓冲区,后者全部读取,以回车为结束符,并释放键盘缓冲区

  • hasNextInt()

若得到的非空白数据是整型,则返回true,若输入不是整型返回false(空白除外,空白会一直等待输入),hasNextDouble()同理(遵循自动类型转换规则)

3. 一维数组

public class Test {

	public static void main(String[] args) {
		int[] arrInt = {1, 2, 3, 4};
		Double[] arrDouble = new Double[10];
		Float[] arrFloat;
		
		arrFloat = new Float[5];
        
		//输出三个数组的类
		System.out.println(arrInt.getClass());
		System.out.println(arrDouble.getClass());
		System.out.println(arrFloat.getClass());
		System.out.print("arrInt数组的内容:");
		
		for(int i : arrInt) {
			System.out.print(i + " ");
		}
		System.out.println();
		System.out.print("arrDouble数组的内容:");
		
		for(Double i : arrDouble) {
			System.out.print(i + " ");
		}
		System.out.println();
		System.out.println("arrDouble的长度:" + arrDouble.length);

		System.out.print("arrFloat数组的内容:");
		
		for(Float i : arrFloat) {
			System.out.print(i + " ");
		}
		
		
	}
		
}

结果:

class [I

class [Ljava.lang.Double;

class [Ljava.lang.Float;

arrInt数组的内容:1 2 3 4

arrDouble数组的内容:null null null null null null null null null null

arrDouble的长度:10

arrFloat数组的内容:null null null null null

注意:

八大基本类数组内容默认是0,其他类默认是null,哪怕未赋初值,数组长度size()也会返回设定的长度

4.日历类Calendar

public class Test {

	public static void main(String[] args) {
		//使用日历类的静态方法获得单例的对象
		Calendar today = Calendar.getInstance();
		
		//定义下面需要的格式字符串对象
		String df = "YYYY年 MM 月 dd 日 HH时mm分ss秒";
		
		//把df字符串作为参数,申请SimpleDateFormat的对象
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(df);
		
		//调用format()方法
		String str = simpleDateFormat.format(today.getTime());
		
		//输出str
		System.out.println(str);
		
		
	}
		
}

5.自动拆箱与封箱

Java八大基本类型与他们对应的八大类可以自动转换

6.泛型

  1. 当某一个类有泛型标志,则这个类中可以用这个当做一种数据类型
public class MyGeneric <T, K>{
    public T a;
    private K b;
}
  1. 当一个方法返回值类型前出现泛型标志,则代表这个方法可以用泛型
public static <T> T getA(T a){
    return a;
}

7.ArrayList和LinkedList

public class Test {

	public static void main(String[] args) {
		ArrayList<Integer> arrayList = new ArrayList<>();
		LinkedList<String> linkedList = new LinkedList<>();
		
		arrayList.add(1);
		arrayList.add(2);
		
		int num = arrayList.get(0);
		
		System.out.println("arrayList的第一个元素是 " + num);
		
		int location = arrayList.indexOf(1);
		System.out.println("1在arrayList的下表是:" + location);
		
		
		System.out.println("判断3是否存在于arrayList中:" + arrayList.contains(3));
		
	}
		
}

注意: indexof()方法contains方法是依赖equals()方法的,默认情况下equals()方法比较的是对象的内存地址,在ArrayList类中重写了equals()方法和hashCode()方法,所以我们可以这样比较

8. HashMap

public class Test {

	public static void main(String[] args) {
		HashMap<Integer, String> map = new HashMap<>();
		
		map.put(0, "张三");
		map.put(1, "李四");
		map.put(2, "王五");
		
		for(int i : map.keySet()) {
			System.out.println(map.get(i));
		}

	}
		
}

结果:

张三

李四

王五

特征:

  1. 键值唯一,如果给已经赋过值的键赋值,会覆盖之前的值
  2. map.size()会输出有效键值对的个数
  3. 在键值对个数大于16后,会采用“红黑树”高效的数据结构,对于大量的数据操作是,效果十分明显
  4. 红黑树操作最差的时间复杂度是O(logN)