程序员必看题(更新中)
- char类型是否能保存一个汉字
- float num = 3.14159是否正确
- 局部变量可以用什么修饰符修饰
- 3-2.6==0.4?
- 如何精确计算浮点数
- 最高效的方法算出2*16
- & 和 &&的区别
- short s=1;s=s+1;能正确通过编译码
- 表达式9/2和9/2.0结果形同吗
- 两个整数相加结果一定正确吗,两个整数相乘结果一定正确吗?
- 如何自定义类实现四舍五入
- 如何用控制台输出一个菱形
- 李白遇见花和店(遇到店壶里酒加一倍,遇见花喝一斗)李白5遇花和店,喝光壶中酒,问李白原来壶中多少酒?
- 打印7行的杨辉三角
- 数组的排序算法
- 面向对象有哪些特征
- 类和对象的区别
- 抽象类和抽象方法有什么作用
- 什么是方法重载
- 只能通过构造方法创建对象吗?
- 静态语句块的作用
- java是值传递还是引用传递
- 抽象类和接口的区别
- 什么是被隐藏的成员变量?如何操作它们
- 什么是方法重写
- final,finaly,finalize什么区别
- 内部类是否可以被继承
- 什么是匿名内部类
- 如何创建Class对象
- 如何用反射创建对象
- ==和equals有什么区别
- 什么是自动拆装包
- String str= null;和String str = "";一样吗?
char类型是否能保存一个汉字
答:可以保存一个汉字, —计算机数据存储以字节为单位的 ,通常一个字节=1kb=1024 byte 每个字节的取值范围是-128~127之间 可以保存一个字母/英文字符/数字/ 由于中文字符比较多 所以用两个字节来保存 同时char是 16位(梁字节)刚好可以保存一个 汉字
float num = 3.14159是否正确
答:不正确,因为Java默认的浮点数类型是double 比float进度高,需要进行强转,或者加’F‘或’f’ 进行定义。建议不要用 强转因为精度会损失。正确的做法是加F或f
局部变量可以用什么修饰符修饰
答:final 和默认
3-2.6==0.4?
不等因为浮点数类型不精确
如何精确计算浮点数
public class Demo2 {
public static void main(String[] args) {
BigDecimal x = new BigDecimal("3");
BigDecimal y = new BigDecimal("2.6");
BigDecimal z = x.subtract(y);//计算差值3-2.6
double val = z.doubleValue();//将结果转化为double类型
System.out.println(val);
System.out.println(val==0.4);
}
}
最高效的方法算出2*16
答:2<<4
Java中定义了左移右移运算符:<<,>>,>>>
& 和 &&的区别
答:&是位与运算符,&&是逻辑与运算符。后者效率更高。因为&&前的函数如果是false那么后边的不执行。
short s=1;s=s+1;能正确通过编译码
答:不可以,因为Java默认整数类型是int,所以1是int类型,与short相加值为int类型,不能赋值给short。
表达式9/2和9/2.0结果形同吗
答:结果不相同,后者结果为double类型
两个整数相加结果一定正确吗,两个整数相乘结果一定正确吗?
答:不一定,因为整数int类型有效值是-2147483648~~2147483647
超出范围的话结果就不再准确;
如何自定义类实现四舍五入
package test.du;
public class Demo01 {
//这个类用于自定义四舍五入,舍去小数位数
//256.99999
public static String round(double value,int dotNum) {//这个参数用来定义保留的位数
String strValue=String.valueOf(value);//转化为字符串
int pos = strValue.indexOf(".");//小数点位置
int len =strValue.length();//数字的总位数包括“.”
int dotLen = len-1-pos;//实际小数位数
double endValue = 0.0;//保存中间变量
String endNum="";//保存最终的结果
if(dotNum<dotLen) {//需要保留的小数位数小于实际位数
//获取需要进位的小数位
String cNum= strValue.substring(pos+dotNum+1,pos+dotNum+2);
int iNum = Integer.parseInt(cNum);//转化为整数
//获得需要保留但没进行舍入处理的数值
String sNum = strValue.substring(0, pos+dotNum+1);
//转化为double类型
endValue =Double.parseDouble(sNum);
if (iNum>=5) {//如果需要进行四舍五入的数大于5那么进1
String endPos = "";//存放需要进位小数的值
String dotValue = "";//连接小数点后面的多个0
for (int i = 1; i < dotNum; i++) {
dotValue+="0";
}
endPos = "0."+dotValue+"1";
endValue = endValue+Double.parseDouble(endPos);//四舍五入后的值
strValue = String.valueOf(endValue);//将处理后的值转化为字符串
pos = strValue.indexOf(".");//结果的小数点位置
len =strValue.length();//结果的数字的总位数包括“.”
dotLen = len-1-pos;//结果的小数位数
if (dotLen<dotNum) {//如果小数位数不足则补足位数
for (int i =pos+dotLen+1; i < pos+dotNum+1; i++) {
endNum = String.valueOf(endValue)+"0";//补足小数位数
}
}else {//如果小数位数正好或超出范围那份进行截取
endNum=String.valueOf(endValue).substring(0,pos+dotNum+1);
}
}else {//如果需要进位的数小于5
endNum = sNum;
}
}else if(dotNum==dotLen){//需要保留的小数位数等于实际位数
endNum= String.valueOf(value);
}else {//需要保留的小数位数大于实际位数
for (int i =1 ; i < dotNum-dotLen; i++) {
strValue+="0";
}
endNum = strValue;
}
return endNum;
}
public static void main(String[] args) {
String val = round(23.333365, 2);
}
}
如何用控制台输出一个菱形
package ch.tedu;
public class Demo02 {
public static void main(String[] args) {
int floor = 7;
//必须控制floor为基数否则不能成为菱形
floor = floor%2==0? floor+1:floor;
//先进行上半部分输出
for (int i = 1; i <= floor; i+=2) {
for (int kong1 = floor; kong1 > i-1; kong1--) {
System.out.print(" ");//输出空格
}
for (int xing1 = 1; xing1 <= i; xing1++) {
System.out.print("* ");
}
System.out.println();
}
//输出下半部分
for (int i = 1; i <= floor-2; i+=2) {
for (int kong1 = 1; kong1 <i+3; kong1++) {
System.out.print(" ");//输出空格
}
for (int xing2 = floor-2; xing2 >=i; xing2--) {
System.out.print("* ");
}
System.out.println();
}
}
}
李白遇见花和店(遇到店壶里酒加一倍,遇见花喝一斗)李白5遇花和店,喝光壶中酒,问李白原来壶中多少酒?
答:利用逆向思维,假如先遇到的店,那么第五次遇到店和花之前还有0.5斗酒,遇到第四次时为。(0.5+1)/2=0.75斗酒。以此类推,得到公式
double x=0.0;
for(int i=0;i<5;i++){
x=x+1;//遇到花喝一斗之前
x=x/2;//遇到店加一倍之前
}
System.out.println("李白壶中原来有"+x+"斗酒");
打印7行的杨辉三角
package ch.tedu;
public class Demo3 {
//打印7行杨辉三角
public static void main(String[] args) {
//创建一个二维数组
int arr[][]=new int [7][];
for (int i = 0; i < arr.length; i++) {
//创建第二层数组
arr[i]=new int[i+1];
//遍历第二层数组
for (int j = 0; j <=i; j++) {
if (j==0||i==0||j==i) {
arr[i][j]=1;
}else {
//通过共实计算
arr[i][j]=arr[i-1][j]+arr[i-1][j-1];
}
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
数组的排序算法
冒泡排序
package ch.tedu;
public class Order1 {
public static void main(String[] args) {
//冒泡排序
int [] arr= {2,6,8,45,12,1};
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < arr.length-i; j++) {
//比较两个相邻的元素大的数向后冒泡
if (arr[j]>arr[j+1]) {
int index = arr[j];
arr[j]=arr[j+1];
arr[j+1]=index;
}
}
}
for (int i : arr) {
System.out.println(i);
}
}
}
面向对象有哪些特征
答:封装,继承,多态
封装:可以隐藏实现细节,是代码模块化
继承:可以实现代码的复用,
多态:减少代码的耦合度,更加灵活。(一个类有不同的行为,有相同的方法名但实现不同的行为)
类和对象的区别
答:类:可视为对象的模板
对象:类的具体实现
(狗是类,那么泰迪,松狮,拉布拉多就是对象)
抽象类和抽象方法有什么作用
答:抽象类:只能作为其他类的基类
抽象类中可以包含抽象成员,但普通类不可以。
抽象方法:必须声明在抽象类里,
不能使用private和static修饰,
不提供方法的实现,只让其子类重写的方法
什么是方法重载
答:方法名相同,但参数,参数的个数,参数类型不同的方法
只能通过构造方法创建对象吗?
答:可以通过工厂方法,和反射方法创建对象。
静态语句块的作用
答:当使用语句块所对应的类时候,就会被分配内存空间,并执行语句块内代码
java是值传递还是引用传递
答:java用对象最为参数时,传递的是对象的地址值,也是值传递(java没有引用传递)
抽象类和接口的区别
1.前者只能单一继承,后者可以多继承
2.前者可以提供成员的实现细节
3.定义的关键字不同
什么是被隐藏的成员变量?如何操作它们
答:当子类定义了变量名和父类相同的时,此时子类并不会继承父类的变量。子类隐藏了父类的变量。用super. 调用父类的变量
什么是方法重写
答:如果子类定义的方法,名字,返回值,参数类型,个数与父类相同,那么我们成之类重写了父类的方法。目的是为了实现子类实现不同的行为,如果想调用父类的方法,可用super. 调用。
final,finaly,finalize什么区别
答:final是修饰符,finaly是try /cath块之后关闭资源的finalize是gc清除垃圾机制
内部类是否可以被继承
答:可以被继承。通过外部类打点继承如:***** extends ClassA.ClassB
当某个类继承内部类时这个类必须有一个有参构造方法 并且参数是外部类ClassA。构造器里面必须a.super();
什么是匿名内部类
答:这个类如果只是用一次,那么使用匿名内部类比较合适,
匿名内部类没有变量名,直接用new Class
所以会使用默认的构造方法创建类对象
如何创建Class对象
答:1.Class.forName(全类名)
2.类名.class 如:Student.class
3.对象J.getClass();如:student.getClass();
如何用反射创建对象
1.创建对象
2.构造器 创建对象
3.调用方法
==和equals有什么区别
答:== 比较的是地址,equals比较的是值
什么是自动拆装包
答:jdk5.0出现的新内容,自动装包指的是----把基本数据类型自动转化为包装类;自动拆包反之
String str= null;和String str = “”;一样吗?
答:不一样 ,前者没分配地址,后者分配了 地址。