1.为什么需要包装类?包装类的作用是?
因为Java是面向对象的,但Java中的基本数据类型不是面向对象的,在实际的使用过程中经常需要将基本数据转换成对象,便于操作。比如在集合中存储数据时,只能存储对象。
作用:①作为和基本数据对应的类类型,方便涉及到对象的操作;
②包含每种基本数据类型相关的属性以及相关的操作方法。
2.将字符串“123”转换成基本类型数字的方式有哪些?
通过Integer类的静态方法来转换:Integer.parseInt("123");
3.自动装箱和自动拆箱指的是?
自动装箱和自动拆箱指的是将基本数据类型和包装类进行自动的互相转换。
4.为什么String类被称为不可变字符序列?从String类的源代码分析,给出解释。
字符串是常量,他们的值在创建后不能更改,String对象是不可变的,所以可以共享;String类的底层结构是char类型的数组value,而这个数组使用final修饰。
5.String类的equals方法跟Object的equals方法什么关系?根据String类的equals方法的源码,分析它的内部流程。
String类的equals方法重写了Object类的equals方法,用于比较两个String对象的内容是否相同。
如果两个String对象的内存地址(引用)相同,那么return true
如果两个String对象的内存地址(引用)不相同,那么进行类型判断,如果不是String类型,那么直接return false;如果是String类型则向下类型转换,转换成String类型,然后变改char类型数组,比较两个数组对应位置上的内容是否相同,如果相同return true,如果不同return false。
6.String类的trim()方法是什么作用?"number".substring(1,3)返回结果是什么?
返回字符串的副本,去掉字符串前后的空格。
"number".substring(1,3)表示从“number”第2个字符(数组中下标为1)开始截取,到第4个字符(数组中下标为3)之前,即“um”两个字符。
7.分析代码,画出内存结构图,针对每个打印结果给出文字解释。
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
System.out.println(s3 == s4); //true
System.out.println(s4 == s5); //false
System.out.println(s4.equals(s5)); //true
8.StringBuffer与StringBuilder的联系与区别?
联系:
StringBuilder和StringBuffer都是可变字符序列,底层数据结构都是char类型的数组。
区别:
StringBuffer:jdk1.0版,线程安全,但是效率低;
StringBuilder:jdk1.5版,线程不安全,但是效率高。
9.如下代码会造成什么后果?运行期间会产生多少个对象?使用StringBuffer修改这段代码。
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);
}
10.计算机中的时间是如何表示的?System.currentTimeMillis()表示什么?Date d = new Date();表示当前时间吗?
获取从1970-1-1 0:0:0到当前时间所经历的毫秒数,然后转换成日期或者时间。
System.currentTimeMillis()返回以毫秒为单位的当前时间。
Date d = new Date();表示当前时间,精确到毫秒。
11.使用SimpleDateFormat类来实现时间跟字符串的转化,常用哪个方法?并写出代码,举例说明。
//字符串转日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
sdf.parse("1996-10-06");
//日期转字符串
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
sdf2.format(new Date());
12.将1996年10月6日通过Calendar来表示,并得出这天是该年的第几天?将该日期增加35天,是哪一天?代码说明。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Test {
public static void main(String[] args) throws ParseException {
Calendar c = new GregorianCalendar();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
c.setTime(sdf.parse("1996-10-06"));
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)+"日");
}
}
13.写代码比较Date/SimpleDateFormat/Calendar的用法。
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class Test {
public static void main(String[] args) {
//Date的用法
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());//格式化现在的时间
System.out.println(daytime);
//Calendar的用法
GregorianCalendar calendar = new GregorianCalendar();
calendar.set(Calendar.YEAR, 1996);//设置年份
}
}
14.代码实现一个简单的可视化日历
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("请输入日期(用-隔开):");
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);
int dow = c.get(Calendar.DAY_OF_WEEK);
System.out.println("日\t一\t二\t三\t四\t五\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)+"*");
}else {
sBuilder.append(c.get(Calendar.DATE));
}
System.out.print(sBuilder+"\t");
if(c.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
System.out.println("\n");
}
c.add(Calendar.DATE, 1);
}
}
}
15.File类能代表一个目录吗?File类的方法mkdir和mkdirs有什么区别?
File类可以代表目录,
mkdir:只能在已经存在的目录中创建文件夹;
mkdirs:在不存在的补录中也可以创建文件夹。
16.使用递归算法,完整展示一个目录树。
import java.io.File;
public class FileTree {
public static void main(String[] args) {
File f = new File("d:/img");
printFile(f,0);
}
static void printFile(File file, int level) {
for(int i=0; i<level; i++) {
System.out.print(" - ");
}
System.out.println(file.getName());
if(file.isDirectory()) {
File[] files = file.listFiles();
for(File temp : files) {
printFile(temp,level+1);
}
}
}
}
17.什么时候使用枚举?枚举的定义是什么?手写定义一个表示英文星期的枚举。
但需要一组常量时,使用枚举类型;
枚举的定义:
只能够取一个特定值,使用enum关键字,所有枚举类型隐性的继承自java.lang.Enum
public enum Week {
Sunday,Monday,Tuesday,Wenseday,Thursday,Saturday
}