Java2String/StringBuilder/ArrayList/Object/Date/Calendar/System/Math类/包装类,集合,泛型,内部类,练习题

Posted 码农编程录

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java2String/StringBuilder/ArrayList/Object/Date/Calendar/System/Math类/包装类,集合,泛型,内部类,练习题相关的知识,希望对你有一定的参考价值。

文章目录


1.String类:字符串常量在Java中不属于基本数据类型, 而是引用/类类型

Java中使用String这个类描述字符串这种常量java.lang.String 类代表字符串。Java程序中所有的字符串文字(例如"abc" )都可以被看作是实现此类的实例

1.字符串常量:它属于对象,但是它不是像之前的对象通过new的方式在中开辟空间,而是存储在字符串常量池中。说明:jdk1.7之前字符串常量池是位于方法区中的,而jdk1.7之后是位于中的。

位于堆中和之前new空间不冲突,常量池是一个单独的空间。字符串常量池中保存的就是所有的字符串数据。只要书写了双引号,不管双引号中间是什么数据,这些数据都会立刻在字符串常量池中保存,并且一直存在,不会被改变。所有在Java程序中使用双引号引用起来的数据都是一个对象。

2.字符串不变:字符串的值在创建后不能被更改。String类中描述的是所有字符串常量,一旦书写完成,它就是一个固定值,这个数据不能改变。

String s3="def";
s3="efg";
System.out.println(s3);
// 内存中有"def","efg"两个对象,s3从指向"def",改变指向,指向了"efg"。

String对象是不可变的,所以它们可以被共享。

String s1="abc"; //定义字符串对象
//int i=3;在栈中开辟空间名称叫做i,存值为3
String s2="abc";
//System.out.println(s1); //abc  //打印的不是内存地址名,是abc常量的值
System.out.println(s1==s2);//这里比较的是内存地址名是否相等 //true

如下string str 是方法中引用类型的局部变量,所以在左边栈中。

如下main中第一行:JVM会在内部的String pool中查找有没有字符串常量"hello",没有的话创建"hello"对象。
第二行:JVM在String pool中查找,有则返回"hello"的地址,这里虽然没创建对象,但str1并不等于str2,因为引用的地址不一样(str1指向堆内存地址,str2指向字符串池地址)
第三行:JVM同样在String pool中查找,有字符串常量"hello"则不再创建。由于使用了new,JVM又在堆中创建一个"hello"对象。

1.1 使用:new String(…)

构造方法:用双引号本身就可得到一个字符串对象。String类提供了大量的构造函数,目的是可以帮助我们将其他的数据变成字符串对象。只要使用String类的构造函数创建的对象,那么这个对象就会在中出现。而在创建出的字符串对象中的字符数据保存在常量池

// 无参构造  // java.lang.String
String str = new String();//构造函数

// 通过字符数组构造,将参数的字符数组转换为String类的对象
char chars[] = 'a', 'b', 'c';     
String str2 = new String(chars);

// 通过字节数组构造,将参数的字节数组转换为String类的对象
byte bytes[] =  97, 98, 99 ;     
String str3 = new String(bytes);

1.2 判断:equals函数是用来比较两个对象是否相等

public class String_Demo01 
    public static void main(String[] args) 
        // 创建字符串对象
        String s1 = "hello";
        String s2 = "hello";
        String s3 = "HELLO";
        // boolean equals(Object obj):比较字符串的内容是否相同
        System.out.println(s1.equals(s2)); // true
        System.out.println(s1.equals(s3)); // false

        //boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写
        System.out.println(s1.equalsIgnoreCase(s2)); // true
        System.out.println(s1.equalsIgnoreCase(s3)); // true
    

如果想比较两个字符串相等,我们不应该使用 == (恒等符号),因为 == 是用来比较具体常量数值的。而由于字符串是对象,所以我们应该使用String类中的equals函数对两个字符串进行比较。

1.3 比较:able to重要,or e

package com.atguigu.test05;
/*
 * java.util.Comparator:定制比较,定制顺序,是对自然比较的补充
 * 		int compare(Object o1, Object o2)://接口的抽象方法(要重写)
 * 				o1与o2比较,o1>o2,返回正整数
 * 				o1与o2比较,o1<o2,返回负整数
 * 				o1与o2比较,o1=o2,返回0
 * java.lang.Comparable:自然比较,自然顺序,核心默认不用导包。
 * 		int compareTo(Object obj)  // 接口的抽象方法(要重写)
 * 				this与obj对象比较,this > obj,返回正整数
 * 				this与obj对象比较,this < obj,返回负整数
 * 				this与obj对象比较,this = obj,返回0
 */
public class TestComparable 
	public static void main(String[] args) 
		Student s1 = new Student("杨洪强", 24, 89);
		Student s2 = new Student("苏海波", 23, 100);		
		//按成绩比较,不用第三个对象了
		if(s1.compareTo(s2)>0)
			System.out.println("s1 > s2成绩");
		else if(s1.compareTo(s2)<0)
			System.out.println("s1 < s2成绩");
		else
			System.out.println("s1 = s2成绩");
				
	

class Student implements Comparable  //希望学生对象本身就具备比较大小的能力。
	private String name;
	private int age;
	private int score;
	public Student(String name, int age, int score) 
		super();
		this.name = name;
		this.age = age;
		this.score = score;
	
	public Student() 
		super();
	
	public String getName() 
		return name;
	
	public void setName(String name) 
		this.name = name;
	
	public int getAge() 
		return age;
	
	public void setAge(int age) 
		this.age = age;
	
	public int getScore() 
		return score;
	
	public void setScore(int score) 
		this.score = score;
	
	@Override
	public String toString() 
		return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
	
	@Override
	public int compareTo(Object obj) 	
		Student other = (Student) obj; //this与obj比较,this和obj都是学生对象
		//例如:对于学生对象来说,最常用的是按成绩排名,那么我就可以把自然顺序定位成绩升序
     /*	if(this.score > other.score)
			return 1;
		else if(this.score < other.score)
			return -1;
		
		return 0;*/		
		return this.score - other.score;
	

package com.atguigu.test05;
import java.util.Arrays;
/*
 * Arrays的sort方法有两种:(1)void sort(Object[] arr):
 * 根据元素的 自然顺序 对指定对象数组按升序进行排序。数组中的所有元素都必须实现 Comparable 接口
 * (2)void sort(Object[] arr, Comparator c):
 * 根据“指定比较器”产生的顺序对指定对象数组进行排序。数组中的所有元素都必须是通过“指定比较器”可相互比较
 */
public class TestArrays 
	public static void main(String[] args) 
		Student[] all = new Student[5];
		all[0] = new Student("杨洪强", 24, 89);
		all[1] = new Student("苏海波", 23, 100);
		all[2] = new Student("张三",23,88);
		all[3] = new Student("李四",24,44);
		all[4] = new Student("王五",25,45);		
		//如果我们的学生类Student,实现了java.lang.Comparable接口,
		//能不能按照自然排序的规则进行排序呢?
		//Arrays中有这样的方法:public static void sort(Object[] a)		
		Arrays.sort(all);
		//这里面排序过程中,调用了元素本身的compareTo()方法
		for (int i = 0; i < all.length; i++) 
			System.out.println(all[i]);
		
	

如下按成绩升序,因为Student类本身实现了Comparable接口重写了compareTo方法。


如上结果为:[Alice,chai,hello,Hi,Java]

1.4 获取:.charAt,.indexOf

package com.itheima.demo01;
import java.lang.String;

public class HelloWorld 
    public static void main(String[] args) 
        // String concat (String str):将指定的字符串连接到该字符串的末尾.
        String s = "helloworld";
        String s2 = s.concat("**hello itheima");
        System.out.println(s2);// helloworld**hello itheima

        // char charAt(int index):获取指定索引处的字符
        System.out.println(s.charAt(0)); // h
        System.out.println(s.charAt(1)); // e

        // int indexOf(String str):获取str在字符串对象中第一次出现的索引,没有返回-1
        System.out.println(s.indexOf("l")); //2
        System.out.println(s.indexOf("owo")); //4
        System.out.println(s.indexOf("ak")); //-1

        // String substring(int start):从start开始截取字符串到字符串结尾
        System.out.println(s.substring(0)); // helloworld
        System.out.println(s.substring(5)); // world

        // String substring(int start,int end):从start到end截取字符串。含start,不含end。
        System.out.println(s.substring(0, s.length())); // helloworld
        System.out.println(s.substring(3,8)); // lowor,不含8即l
    

1.5 转换:.toCharArray,.getBytes,.replace

package com.itheima.demo01;
import java.lang.String;

class String_Demo03 
    public static void main(String[] args) 
        String s = "abcde";
        char[] chs = s.toCharArray(); // 把字符串转换为字符数组
        for(int x = 0; x < chs.length; x++) 
            System.out.println(chs[x]);  // a b c d e
        
        byte[] bytes = s.getBytes(); //把字符串转换为字节数组
        for(int x = 0; x < bytes.length; x++) 
            System.out.println(bytes[x]); // 97 98 99 100 101
        
        String str = "itcast itheima";
        String replace = str.replace("it", "IT");
        System.out.println(replace); // ITcast ITheima
    

1.6 分割:.split

public class String_Demo03 
    public static void main(String[] args) 
        String s = "aa,bb,cc";
        String[] strArray = s.split(","); // ["aa","bb","cc"],字符串对象拆为字符串数组
        for(int x = 0; x < strArray.length; x++) 
          	System.out.println(strArray[x]); // aa bb cc
        
    

1.7 模拟用户登录:.nextLine,.equals

package com.itheima.demo01;
import java.util.Scanner;
// 需求:已知用户名和密码,用程序实现模拟用户登录,一共给3次机会,登陆后给出相应提示。
class StringTest01 
    public static void main(String[] args) 
        //已知用户名和密码,定义两个字符串表示即可
        String username = "itheima";
        String password = "czbk";
        //用循环实现多次机会,这里的次数明确,采用for循环实现,并在登录成功的时候,使用break结束循环
        for(int i=0; i<3; i++) 
            //键盘录入要登录的用户名和密码,用 Scanner 实现
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String name = sc.nextLine();
            System.out.println("请输入密码:");
            String pwd = sc.nextLine();
            //拿键盘录入的用户名、密码和已知的用户名、密码进行比较,给出相应的提示。字符串的内容比较,用equals() 方法实现
            if (name.equals(username) && pwd.equals(password)) 
                System.out.println("登录成功");
                break;
             else 
                if(2-i == 0) 
                    System.out.println("你的账户被锁定,请与管理员联系");
                 else 
                    //2,1,0
                    //i为0,1,2
                    System.out.println("登录失败,你还有" + (2 - i) + "次机会");
                
            
        
    

class CodeDemo 
    public static void main(String[] args) throws IOException 
        String username = "ta";
        String password = "123";

        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String name = sc.nextLine();        
        if(name.length() == 0)
            System.out.println("登录失败");
            return;
        

        System.out.println("请输入密码:");
        String pwd = sc.nextLine();        
        if(pwd.length() 以上是关于Java2String/StringBuilder/ArrayList/Object/Date/Calendar/System/Math类/包装类,集合,泛型,内部类,练习题的主要内容,如果未能解决你的问题,请参考以下文章