Java内置工具类

Java内置工具类

1. String类

  • 首先,String类的值不能被更改

    如果对String对象操作(增加长度等),会新开辟一块内存空间,再更改String的指向(如果有的话),而原来字符串不变(可能指向被更改或者不存在)。因此如果要大量更改String类型时不推荐用他,应该用StringBuffer或者StringBulider

  • String类与其他类作和结果都是String类型

2. StringBuffer和StringBuilder类

  • 他们在字符串需要大量更改时好用,他们不需要另外申请字符串空间
  • StringBuffer适用于多线程,他是多线程安全的,StringBuilder适用于单线程,他相比于前者方法调用更快

3. 用户输入类

3.1 Scanner类

  1. 首先初始化Scanner类对象

    Scanner in = new Scanner(System.in); 其中,System.in就是标准输入设备,也就是键盘

  2. 确定你要输入的数据类型,并根据其选择方法调用比如:

    字符串对应:String str = in.next();

    整形对应:int a = in.nextInt();

    长整型:long b = in.nextLong();

  3. 进行“关闭”操作

    in.close();

public class Demo {
    public static void main(String[] args) {
        //从键盘接收数据
        Scanner scanner = new Scanner(System.in);

        //判断是否有非空白输入(如果一直是空白则一直等待输入)
        if (scanner.hasNext()){
            System.out.println(6);
            String str = scanner.nextLine();
            System.out.println(6);

        }
        scanner.close();
    }
}
  • hasNext()和hasNextLine区别:

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

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

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

  • hasNextInt()

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

4. 数组

4.1 一维数组

  • 定义方式:

    1. 赋值定义:

      int[] array1 = {1, 2, 3, 4};

    2. 只申请空间:int[] array2 = new int[10];

public class Test {

	public static void main(String[] args) {
		int[] array = {1, 2, 3, 4, 5, 6, 7, 8};
		
		for(int i : array) {
			System.out.print(i);
			System.out.print(" ");
		}
		System.out.println();
		
		System.out.println(array.getClass());
		
	
	}

}

结果:

1 2 3 4 5 6 7 8

class [I

可见:int 数组的类是: [I 那么double数组的类是 [D 等等

  • 八大基本类型数组空间默认值是0,其他类默认是null(float和double默认0.0,boolean默认false)

  • 因为对象的本质是指针,所以数组本身也是一个指针,里面的内容指向不同的内存空间首地址

4.2 数组的clone()方法与浅克隆

  1. 浅克隆

    浅克隆指的是只是将空间的指向复制一份(现在新复制的和之前的指向同一内存空间)

  2. clone()方法就是浅克隆:创造一个新的数组,指向他克隆的数组指向的空间

4.3 二维数组

二维数组的每一个元素本质是一维数组,因为一维数组的大小我们可以自己制定,所以二位数组中每个“列”大小不固定

想更直观了解二维数组的话,可以先创建一个一维数组,再将其赋值给一个二维数组:

public class Test {
	public static void main(String[] args) {
		Son[] array1 = new Son[5];
		Son[] array2 = new Son[2];
		
		Son[][] array = new Son[3][];
		
		array[0] = array1;
		array[1] = array2;
	}
}

上面的代码中,我们创建了一个行数为3的二维数组,然后分别将大小为5和2的一维数组赋值给这个二维数组

5. 日历类Calendar

  1. 初始化和调用基本方法
public class Test {

	public static void main(String[] args) {
        //通过静态方法获得目标对象(应该是单例的)
		Calendar today = Calendar.getInstance();
		//输出年 月 日 时(24制) 分 秒 毫秒
		System.out.println(today.get(Calendar.YEAR));
		System.out.println(today.get(Calendar.MONTH));
		System.out.println(today.get(Calendar.DATE));
		System.out.println(today.get(Calendar.HOUR_OF_DAY));
		System.out.println(today.get(Calendar.MINUTE));
		System.out.println(today.get(Calendar.SECOND));
		System.out.println(today.get(Calendar.MILLISECOND));
        
	}

}

注意:在Java中,我们日常生活中的1月在这里是0月(也就是0月到11月),周末对应的是0(也就是周0到周6)

  1. 日期输出类 SimpleDateFormat

    public class Test {
    
    	public static void main(String[] args) {
    		Calendar today = Calendar.getInstance();
    		
    		String df = "YYYY年MM月dd日HH时 mm分:ss秒";
    		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(df);
    		
    		String str = simpleDateFormat.format(today.getTime());
    		
    		System.out.println(str);
    		
    	}
    
    }
    

    SimpleDateFormat构造时将对应格式的字符串传递过去,然后调用里面的format方法,在输出就完成了很好的日期输出

  2. 获得某一天对应的月份天数

    public class Test {
    
    	public static void main(String[] args) {
    		Calendar date = Calendar.getInstance();
            //通过set方法设置对应的某一天
    		date.set(2023, 5, 1);
    		
    	System.out.println(date.getActualMaximum(Calendar.DATE));
    		
    	}
    
    }
    

    getActualMaximum方法的参数可以有很多,可以获得对应的信息

6. 自动拆箱与装箱以及泛型初步

  1. 自动拆箱与装箱:八大基本类型对应了八种类类型,如:int和Integer,它们在需要时可以自动转换。

  2. 泛型只能是类类型

public class Parent <T> {
	public int i = 0;
	private T b;
	
	public T getNum(T t) {
		return t;
	}

}

  • 类后面带上代表这个类可以以T作为泛型参数,还可以这么写

    public class Parent <P, Q>
    

    这就是以 P Q作为泛型代表

  • 方法返回值类型前面加上,代表这个方法可以用泛型代表类型

public class Parent{
	public int i = 0;
	
	public <T> T getNum(T t) {
		return t;
	}

}

7. ArrayList和LinkedList

  1. 两者的基本定义

    ArrayList是动态数组,底层是可以扩张大小的数组,在定义时默认大小为10,当我们需要更大空间的时候,他会创造1.5倍当前空间大小的数组,并将当前数组的值复制给新的数组;LinkedList是链表,在空间中分布可以不连续

  2. 使用场景

    • ArrayList适合查找,不适合大量的增删(会创造新数组,大量数据更改)
    • LinkedList适合增删,不适合查找(查找按顺序从头开始,很慢)
  3. indexOf()方法

    这个方法会自动调用equals()方法来进行“相等”判断

    list.indexOf(a) :返回a在list中的下标,不在则返回-1

  4. contain()方法

    list.contain(a) :判断列表中是否存在a

8. HashMap

HashMap是一种双泛型类,主要是体现在对“键值对”的操作

特点:

1. 键不能重复,值可以重复
2. 对同一个键第二次put会将其对应的值更改
3. 遍历是无序的
public class Test {

	public static void main(String[] args) {
		HashMap<Integer, String> map = new HashMap<>();
        
		//放入键值对
		map.put(1, "张三");
		map.put(2, "李四");
		map.put(3, null);
		
		for(Integer i : map.keySet()) {
            //取出每个键对应的值并输出
            String name = map.get(i);
			System.out.println(name);
		}

	}
		
}

优点:

HashMap在键值对大于16组之后,采用“红黑树”(自平衡二叉树查找),其增删改查最差的时间复杂度是O (logN),对于庞大的数据其高效性十分突出

posted @   Geek李  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示