1、为什么需要包装类?包装类的作用是?
我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。
另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了。
Java中基本数据类型与包装类型有:
基本类型 | 包装类型 |
boolean | Boolean |
char | Character |
int | Integer |
byte | Byte |
short | Short |
long | Long |
float | Float |
double | Double |
2、将字符串“123”转化成基本类型数字的方式有哪些?
Integer.parseInt("123");
3、自动装箱和自动拆箱指的是?举例说明。
装箱就是自动将基本数据类型转换为包装器类型;
拆箱就是自动将包装器类型转换为基本数据类型。
//自动装箱
Integer total = 99;
//自定拆箱
int totalprim = total;
4、【上机】完成老师课堂上Integer的测试,并自己写Double类的测试代码
5、为什么String类被称为不可变字符序列?从String类的源代码分析,给出解释。
字符串是常量,它们的值在创建之后不能更改,String对象是不可变的,所以可以共享
String类的底层结构是char类型的数组value,而这个数组使用final进行修饰
6、【上机】String类的equals方法跟Object的equals方法什么关系? 并详细阅读
String类的equals方法源代码,分析它的内部流程。
String类的equals方法重写了Object类的equals方法,用于比较两个String对象的内容是否相同
String类的equals方法的源码分析:
如果两个String对象的内存地址(引用)相同,那么return true
如果两个String对象的内存地址(引用)不相同,那么进行类型判断,如果不是String类型,那么直接返回false,如果是String类型则进行向下类型转换,转换成String类型,然后变改char类型数组,比较两个数组对应位置上的内容是否相同,如果相同返回true,如果不同返回false
7、String类的trim()方法是什么作用?
返回字符串的副本,去掉字符串前后的空格
8、"hamburger".substring(4, 8) 返回的结果是?
urge
9、【上机】分析下面代码的结果,并画出内存结构图,针对每个打印的结果给出文字解释。
String s = "abc";
String ss = "abc";
String s3 = "abc"+"def"; //此处编译器做了优化!
String s4 = "abcdef";
String s5 = ss+"def";
String s2 = new String("abc");
System.out.println(s==ss);
System.out.println(s3==s4);
System.out.println(s4==s5);
System.out.println(s4.equals(s5));
System.out.println(s==ss);结果为true //在运行时常量池中创建新的对象"abc",如果常量池中不存在,在去栈中创建该对象的引用s; 地址值,和值都相等 所以为true
System.out.println(s3==s4);结果为true //过程同上
System.out.println(s4==s5);结果为false // == 比较地址值 ss部分指向的地址值不同
System.out.println(s4.equals(s5));结果为true // equals只比较内容
10、【上机】练习String类的常用方法
字符串的长度:
System.out.println(“hello”.length());
去掉字符串前后的空格:
System.out.println(“ hello world ”.trim());
截取子字符串:
System.out.println(“helloworld”.substring(0,4));
11、StringBuffer和StringBuilder的联系是?区别是?
联系:
StringBuffer和StringBuilder都是可变字符序列,底层数组结构都是char类型的数组
区别:
StringBuffer:jdk1.0版,线程安全,但是效率低
StringBuilder:jdk1.5版,线程不安全,但是效率高
12、如下的代码会造成什么后果?运行期间会产生多少个对象? 使用StringBuilder修改这段代码。
String s = "";
for(int i=0;i<10000;i++){
s +=i;
}
会导致大量副本字符串对象存留在内存中,降低效率
运行期间会产生10001个对象
StringBuffer sb=new StringBuffer();
for(int i=0;i<10000;i++){
sb.append(i);
}
13、计算机中的时间是如何表示的?
获取从1970-1-1 0:0:0到当前时间所经历的毫秒数,然后转换为日期或者时间
14、System.currentTimeMillis()表示什么意思?
返回以毫秒为单位的当前时间
15、Date d = new Date()表示的是当前时间吗?
是,精确到毫秒
16、【上机】我们使用SimpleDateFormat类来实现时间跟字符串的转化。常用那两个方法?并写出代码,举例说明
//字符串转日期
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
sdf.parse("1990-3-3");
//日期转字符串
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
sdf.format(new Date());
17、将1990年3月3日通过Calendar来表示,并得出这天是该年的第几天?将该日期增加35天,是哪一天?使用代码来说明。
public static void main(String[] args) throws ParseException {
Calendar c=new GregorianCalendar();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
c.setTime(sdf.parse("1990-3-3"));
System.out.println(c.get(Calendar.DAY_OF_YEAR));
c.add(Calendar.DATE, 35);
System.out.println(c.get(Calendar.YEAR)+"年"
+(c.get(Calendar.MONTH)+1)+"月"+c.get(Calendar.DATE));
}
18、【上机】写代码测试Date/SimpleDateFormat/Calendar的用法。
//Date的用法
public static void main(String[] args) {
Date date1 = new Date();
System.out.println(date1.toString());
}
//SimpleDateFormat的用法
SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String daytime = s1.format(new Date());
//Calendar的用法
GregorianCalendar calendar2 = new GregorianCalendar();
calendar2.set(Calendar.YEAR, 2009);
19、【上机】模仿老师的写法,完成可视化日历程序的开发。
public class AppMain {
public static void main(String[] args) throws ParseException {
System.out.println("请输入日期(格式为:2010-3-3):");
Scanner scanner = new Scanner(System.in);
String dateString =scanner.nextLine();
System.out.println("您刚刚输入的日期是:"+dateString);
String[] str = dateString.split("-");
int year = Integer.parseInt(str[0]);
int month = new Integer(str[1]);
int day = new Integer(str[2]);
Calendar c = new GregorianCalendar(year,month-1, day);
c.set(Calendar.DATE, 1);
//week:1-7 日一二三四五六
int dow = c.get(Calendar.DAY_OF_WEEK);
System.out.println("日\t一\t二\t三\t四\t五\t六");
for(int i=0;i<dow-1;i++){
System.out.print("\t");
}
int maxDate = c.getActualMaximum(Calendar.DATE);
for(int i=1;i<=maxDate;i++){
StringBuilder sBuilder = new StringBuilder();
if(c.get(Calendar.DATE)==day){
sBuilder.append(c.get(Calendar.DATE)+"*\t");
}else{
sBuilder.append(c.get(Calendar.DATE)+"\t");
}
System.out.print(sBuilder);
if(c.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY){
System.out.print("\n");
}
c.add(Calendar.DATE, 1);
}
}
20、File类能代表一个目录吗?
能
21、File类的方法mkdir跟mkdirs,有什么区别?
mkdir:只能在已经存的目录中创建文件夹
mkdirs:可以在不存的目录中创建文件夹
22、使用File类模拟实现DOS的dir和dir/s命令
public static void main(String[] args) {
File file = new File("e:/测试1");
showTree(file, 1);
}
public static void showTree(File file, int level){
File[] files = file.listFiles();
for (File f : files) {
for(int i = 0; i < level; i++){
System.out.print("-");
}
if (f.isDirectory()) {
System.out.println(f.getName());
showTree(f, level+1);
}else{
System.out.println(f.getName());
}
}
}
23、【上机】使用递归算法,根据老师的树状结构代码,完整展示一个目录树
class demoFile{
public void show(){
File f = new File("d:/demo");
printFile(f,0);
}
public static void printFile(File file,int level){
for (int i = 0; i < level; i++) {
System.out.println("-");
}
System.out.println(file.getName());
if(file.isDirectory()){
File[] files = file.listFiles();
for(File temp:files){
printFile(temp,level+1);
}
}
}
}
24、【上机】手动定义一个枚举,表示十二个月的英文月份。
25、【上机】什么时候使用枚举?枚举的定义是什么?
订单的状态场景。
枚举是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁,安全性以及便捷性
26、【上机】switch语句中的表达式结果可以是枚举吗? 模仿课堂代码,写一个例子
说明。
可以