Java2String/StringBuilder/ArrayList/Object/Date/Calendar/System/Math类/包装类,集合,泛型,内部类,练习题
Posted 码农编程录
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java2String/StringBuilder/ArrayList/Object/Date/Calendar/System/Math类/包装类,集合,泛型,内部类,练习题相关的知识,希望对你有一定的参考价值。
文章目录
- 1.String类:字符串常量在Java中不属于基本数据类型, 而是引用/类类型
- 2.StringBuilder类:线程不安全但速度快于stringbuffer(线程安全即每个方法上都加synchronized,效率低,抛弃)
- 3.ArrayList类:ArrayList<String> list = new ArrayList<String>()
- 4.Object类:对象都需重写
- 5.Date类:getTime(),SimpleDateFormat
- 6.Calendar类:只有子类对象才能向上转型
- 7.System类:System.exit(0)
- 8.Math类:ceil
- 9.基本类型包装类:基本类型字节数,缓存池,深浅拷贝
- 10.集合:单/双例,Arrays.toString(array)
- 11.泛型:泛型类/接口/方法,运行看右边
- 12.泛型通配符:Fu,Zi,Sun是类/数据类型,extends
- 13.练习:map.keySet(),map.values(),map.entrySet()
- 14.内部类:.class文件,局部内部类(定义在一个方法里的类,只能当前方法内使用,其他方法不能使用)
- 15.匿名内部类:=接口实现类,打印对象
- 16.练习:接口的匿名内部类,没有子类名
- 17.人工挑苹果:只一个接口CompareAble
- 18.员工类接口:implements Comparator
- 19.斗地主:双重for,Collections.shuffle,list.get(i)
- 20.开发团队调度系统:enum,给定数据就是Data.java需装成一个个对象为公司员工
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类/包装类,集合,泛型,内部类,练习题的主要内容,如果未能解决你的问题,请参考以下文章