Java基本类型


2019-11-03  19:03:48  by冲冲

1、两个float型相减丢失精度,如何解决?

使用BigDemical装饰器模式

public class Test {
public static void main(String[] args) {
float a = 2.030944f;
float b = 1.001085f;
System.out.println(a - b);// 1.0298591 BigDecimal c = new BigDecimal(Float.toString(a));
BigDecimal d = new BigDecimal(Float.toString(b)); BigDecimal resultSub = c.subtract(d); //减法
BigDecimal resultAdd = resultSub.add(d); //加法
BigDecimal resultMul = c.multiply(d); //乘法
BigDecimal resultDiv = c.divide(d); //除法 System.out.println(resultSub.floatValue());//1.029859
System.out.println(resultAdd.floatValue());//2.030944
}
}

2、方法的值传递和对象传递

public class Test {
public void change(String str, char ch[]) {
str = "test ok";
ch[0] = 'g';
} public static void main(String args[]) {
String str = new String("good");
char[] ch = {'a', 'b', 'c'};
Test ex = new Test();
ex.change(str, ch);
System.out.print(str + " and " + ch); //good and gbc
}
}

3、Integer类的==和equals()

public class Test {
public static void main(String[] args) {
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
Long h = 2L;
// 当Integer处于-128~127,使用内存栈创建值,并将对象指向该值;当不处于该区间,在堆重新new对象。
System.out.println(c == d); //true
System.out.println(e == f); //false
// 自动拆箱
System.out.println(c == (a + b)); //true
System.out.println(c.equals(a + b)); //true
// 包装类的equals()方法会使用instanceof判断类型
System.out.println(g == (a + b)); //true
System.out.println(g.equals(a + b)); //false
System.out.println(g.equals(a + h)); //true
}
}

4、==和equals()

public class Test {
public static void main(String[] args) {
Long u = 127L;
Long v = 127L;
System.out.println(u == v); //true
//[-128,127]在栈内存创建,并指向对象;其余的重新new对象
u = 128L;
v = 128L;
System.out.println(u == v); //false
String x = new String("hello");
String y = "hello";
System.out.println(x.equals(y)); //true
System.out.println(x == y); //false
x = x.intern();
System.out.println(x==y); //true
}

5、多线程的start()和run()

public class Test {
public static void main(String[] args) {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.run();
System.out.print("ping");
//线程要使用start()开启,仅仅调用run()依然在本线程运行,输出结果是pongping
} private static void pong() {
System.out.print("pong");
}
}

6、switch

public class Test {
public static void main(String[] args) {
System.out.println(getValue(2));
//输出结果10
//如果case没有break,则会继续往下执行
} public static int getValue(int i) {
int Test = 0;
switch (i) {
default:
System.out.println("default");
case 1:
Test = Test + i;
case 2:
Test = Test + i * 2;
case 3:
Test = Test + i * 3;
}
return Test;
}
}

7、变量作用域

public class MeaningOfThis {
public final int value = 4; public void doIt() {
int value = 6;
Runnable r = new Runnable() {
public final int value = 5; public void run() {
int value = 10;
System.out.println(this.value);
}
};
r.run();
} public static void main(String... args) {
MeaningOfThis m = new MeaningOfThis();
m.doIt();
//输出结果5,因为this指向对象r
}
}

8、父类和子类的构造方法关系

如果没有给类创建一个构造方法,java编译器会自动添加一个没有参数且方法体为空的构造方法。如果已经人为地添加一个构造方法,java编译器就不会添加构造方法,但是子类构造器就必须显式调用该父类的人为构造方法。

class Person {
String name = "No name"; public Person(String nm) {
name = nm;
}
} class Employee extends Person {
String empID = "0000"; public Employee(String id) {
empID = id;
}
} public class Test {
public static void main(String args[]) {
Employee e = new Employee("123");
System.out.println(e.empID);
//编译报错
}
}

修改方案1

class Employee extends Person {
String empID = "0000"; public Employee(String id) {
super("Railway Employee"); //父类没有默认的空参构造器,所以必须调用带参构造器
empID = id;
}
}

修改方案2

class Person {
String name = "No name"; public Person(String nm) {
name = nm;
} public Person() {} //给父类添加不带参数的构造器,子类就可以隐式调用
}

9、基本数据类型溢出

public class Test {
public static void main(String[] args) {
int a = Integer.MAX_VALUE;
long b = a + 1;
System.out.println(a);//2147483647
System.out.println(b);//-2147483648
}
}

10、finally是否执行?

public class Test {
public static void main(String[] args) {
System.out.println(findResult()); //3
} public static int findResult(){
try {
return 1;
} catch (Exception e) {
return 2;
} finally {
return 3;
}
}
}

11、溢出

public class Test {
public static void main(String[] args) {
byte b = 127;
b = (byte)(b+1);
System.out.println(b); //-128
}
}

12、+=

short s1 = 1;
s1 = s1+1; //s1+1得到int型的结果,同样是不能自动向下转换,编译报错
s1 += 1; //底层是 s1 = (short)s1 + 1;

【Java面试题】-- Java基本类型的更多相关文章

  1. [ Java面试题 ]Java 开发岗面试知识点解析

    如背景中介绍,作者在一年之内参加过多场面试,应聘岗位均为 Java 开发方向. 在不断的面试中,分类总结了 Java 开发岗位面试中的一些知识点. 主要包括以下几个部分: Java 基础知识点 Jav ...

  2. Java面试题2--数据类型

    1. Java的数据类型? 2. Java的封装类型? 3. 基本类型和封装类型的区别? 基本类型只能按值传递,而对应的封装类是按引用传递的. 基本类型是在堆栈上创建的,而所有的对象类型都是在堆上创建 ...

  3. JAVA面试题——JAVA编程题1(2015.07.22——湛耀)

    实现代码很简单:   package com.xiaozan.shopping;   import java.util.Arrays;   public class ShoppingCart {    ...

  4. JAVA面试题——JAVA编程题1(2015.07.22)

    实现代码很简单:   package com.xiaozan.shopping;   import java.util.Arrays;   public class ShoppingCart {    ...

  5. Java面试题-Java中的锁

    1. 如何实现乐观锁(CAS)?如何避免ABA问题? 答:1)读取内存值的方式实现了乐观锁(比如:SVN系统),方法:第一,比较内存值和期望值:第二,替换内存值为要替换值.        2)带参数版 ...

  6. JAVA面试题——JAVA基础篇

    1.JAVA多态的实现方式:继承.重载.覆盖 2.JAVA有8种基本数据类型:byte.short.int.long.float.double.boolean.char 3.final.finally ...

  7. Java 面试题 —— java 源码

    1. 静态工厂方法 静态工厂方法不必在每次调用它们的时候都创建一个新的对象: Boolean.valueOf(boolean): public final class Boolean { public ...

  8. Java面试题-Java容器

    一.Java容器分类 Java容器划分为两个概念Collection.Map Collection: 一个独立元素的序列,这些元素都服从一条或多条规则.List必须按照插入的顺序保存元素,不关心是否重 ...

  9. java面试题-Java集合相关

    1. ArrayList 和 Vector 的区别 ArrayList和Vector底层实现原理都是一样得,都是使用数组方式存储数据 Vector是线程安全的,但是性能比ArrayList要低. Ar ...

  10. 2016最新Java笔试题集锦

    更新时间:2015-08-13         来源:网络         投诉删除 [看准网(Kanzhun.com)]笔试题目频道小编搜集的范文“2016最新Java笔试题集锦”,供大家阅读参考, ...

随机推荐

  1. 看动画学算法之:平衡二叉搜索树AVL Tree

    目录 简介 AVL的特性 AVL的构建 AVL的搜索 AVL的插入 AVL的删除 简介 平衡二叉搜索树是一种特殊的二叉搜索树.为什么会有平衡二叉搜索树呢? 考虑一下二叉搜索树的特殊情况,如果一个二叉搜 ...

  2. Java多线程编程实战指南 设计模式 读书笔记

    线程设计模式在按其有助于解决的多线程编程相关的问题可粗略分类如下. 不使用锁的情况下保证线程安全: Immutable Object(不可变对象)模式.Thread Specific Storage( ...

  3. shopping cart

    #Author:Kevin_hou #定义产品列表 product_list =[ ('HUAWEI',5999), ('Watch',500), ('Nike',800), ('Toyota',20 ...

  4. python收集参数与解包

    收集任意数量的实参 def make_pizza(*toppings): """打印顾客点的所有配料""" print(toppings) ...

  5. 混合开发框架Flutter

    Flutter开发简介与其他的混合开发的对比 为什么要使用Flutter? 跨平台技术简介 Hybrid技术简介 QT简介 Flutter简介 为什么要使用Flutter? Flutter有什么优势? ...

  6. spring cache整合redis

    在项目中,我们经常需要将一些常用的数据使用缓存起来,避免频繁的查询数据库造成效率低下.spring 为我们提供了一套基于注解的缓存实现,方便我们实际的开发.我们可以扩展spring的cache接口以达 ...

  7. Java并发:重入锁 ReentrantLock(一)

    ReentrantLock 是一种可重入的互斥锁,它不像 synchronized关键字一样支持隐式的重进入,但能够使一个线程(不同的方法)重复对资源的重复加锁而不受阻塞. ReentrantLock ...

  8. Windows内核基础知识-5-调用门(32-Bit Call Gate)

    Windows内核基础知识-5-调用门(32-Bit Call Gate) 调用门有一个关键的作用,就是用来提权.调用门其实就是一个段. 调用门: 这是段描述符的结构体,里面的s字段用来标记是代码段还 ...

  9. (二)FastDFS 高可用集群架构学习---搭建

    一.单group 单磁盘 的 FastDFS 集群 a.前期准备 1.系统软件说明: 名称 说明 CentOS 7.x(安装系统) libfastcommon FastDFS分离出的一些公用函数包 F ...

  10. HDC2021:HMS Core分析服务,数智化营销闭环方案帮助开发者实现精益增长

    10.22-10.24华为开发者大会2021(Together)在东莞如期举行.本次大会上,HMS Core华为分析服务作为多平台.跨设备的一站式数据分析平台以数据驱动业务智能决策为理念,带来了数智化 ...