做移动网站优化排名网站建设需要编码不
news/
2025/10/7 8:05:53/
文章来源:
做移动网站优化排名,网站建设需要编码不,在微信上怎么做网站,dedecms的网站放在哪个文件夹里基本数据类型
Java 基础数据按类型可以分为四大类#xff1a;布尔型、整数型、浮点型、字符型#xff0c;这四大类包含 8 种基础数据类型。
布尔型#xff1a;boolean整数型#xff1a;byte、short、int、long浮点型#xff1a;float、double字符型#xff1a;char
八种…基本数据类型
Java 基础数据按类型可以分为四大类布尔型、整数型、浮点型、字符型这四大类包含 8 种基础数据类型。
布尔型boolean整数型byte、short、int、long浮点型float、double字符型char
八种基础类型取值如下
数据类型代表含义默认值取值包装类boolean布尔型false0(false) 到 1(true)Booleanbyte字节型(byte)0-128 到 127Bytechar字符型\u0000(空)\u0000 到 \uFFFFCharactershort短整数型(short)0-215 到 215-1Shortint整数型0-231 到 231-1Integerlong长整数型0L-263 到 263-1Longfloat单浮点型0.0f1.4e-45 到 3.4e38Floatdouble双浮点型0.0d4.9e-324 到 1.798e308Double
除 chat 的包装类 Character 和 int 的包装类 Integer 之外其他基础数据类型的包装类只需要首字母大写即可。包装类的作用和特点本文下半部分详细讲解。
我们可以在代码中查看某种类型的取值范围代码如下
public static void main(String[] args) {// Byte 取值-128 ~ 127System.out.println(String.format(Byte 取值%d ~ %d, Byte.MIN_VALUE, Byte.MAX_VALUE));// Int 取值-2147483648 ~ 2147483647System.out.println(String.format(Int 取值%d ~ %d, Integer.MIN_VALUE, Integer.MAX_VALUE));
}包装类型
我们知道 8 种基本数据类型都有其对应的包装类因为 Java 的设计思想是万物既对象有很多时候我们需要以对象的形式操作某项功能比如说获取哈希值hashCode或获取类getClass等。那包装类特性有哪些
1. 功能丰富
包装类本质上是一个对象对象就包含有属性和方法比如 hashCode、getClass 、max、min 等。
2. 可定义泛型类型参数
包装类可以定义泛型而基础类型不行。
比如使用 Integer 定义泛型代码
ListInteger list new ArrayList();如果使用 int 定义就会报错代码
List list new ArrayList(); // 编译器代码报错3. 序列化
因为包装类都实现了 Serializable 接口所以包装类天然支持序列化和反序列化。比如 Integer 的类图如下 4. 类型转换
包装类提供了类型转换的方法可以很方便的实现类型之间的转换比如 Integer 类型转换代码
String age 18;
int ageInt Integer.parseInt(age) 2;
// 输出结果20
System.out.println(ageInt);5. 高频区间的数据缓存
此特性为包装类很重要的用途之一用于高频区间的数据缓存以 Integer 为例来说在数值区间为 -128~127 时会直接复用已有对象在这区间之外的数字才会在堆上产生。
我们使用 对 Integer 进行验证代码如下
public static void main(String[] args) {// Integer 高频区缓存范围 -128~127Integer num1 127;Integer num2 127;// Integer 取值 127 结果为 true值127 num1num2 trueSystem.out.println(值127 num1num2 (num1 num2));Integer num3 128;Integer num4 128;// Integer 取值 128 结果为 false值128 num3num4 falseSystem.out.println(值128 num3num4 (num3 num4));}从上面的代码很明显可以看出Integer 为 127 时复用了已有对象当值为 128 时重新在堆上生成了新对象。
为什么会产生高频区域数据缓存我们查看源码就能发现“线索”源码版本 JDK 8源码如下
public static Integer valueOf(int i) {if (i IntegerCache.low i IntegerCache.high)return IntegerCache.cache[i (-IntegerCache.low)];return new Integer(i);
}由此可见高频区域的数值会直接使用已有对象非高频区域的数值会重新 new 一个新的对象。
各包装类高频区域的取值范围
Boolean使用静态 final 定义就会返回静态值Byte缓存区 -128~127全部缓存Short缓存区 -128~127部分缓存Character缓存区 0~127部分缓存Long缓存区 -128~127部分缓存Integer缓存区 -128~127部分缓存。
包装类的注意事项
int 的默认值是 0而 Integer 的默认值是 null。推荐所有包装类对象之间的值比较使用 equlas() 方法因为包装类的非高频区数据会在堆上产生而高频区又会复用已有对象这样会导致同样的代码因为取值的不同而产生两种截然不同的结果。代码示例
public static void main(String[] args) {// Integer 高频区缓存范围 -128~127Integer num1 127;Integer num2 127;// Integer 取值 127 结果为 true值127 num1num2 trueSystem.out.println(值127 num1num2 (num1 num2));Integer num3 128;Integer num4 128;// Integer 取值 128 结果为 false值128 num3num4 falseSystem.out.println(值128 num3num4 (num3 num4));// Integer 取值 128 equals 结果为 true值128 num3.equals(num4) trueSystem.out.println(值128 num3.equals(num4) num3.equals(num4));
}Float 和 Double 不会有缓存其他包装类都有缓存。Integer 是唯一一个可以修改缓存范围的包装类在 VM optons 加入参数-XX:AutoBoxCacheMax666 即修改缓存最大值为 666 。 示例代码如下
public static void main(String[] args) {Integer num1 -128;Integer num2 -128;System.out.println(值为-128 (num1 num2));Integer num3 666;Integer num4 666;System.out.println(值为666 (num3 num4));Integer num5 667;Integer num6 667;System.out.println(值为667 (num5 num6));
}执行结果如下
值为-128 true
值为666 true
值为667 false由此可见将 Integer 最大缓存修改为 666 之后667 不会被缓存而 -128~666 之间的数都被缓存了。
相关面试题
1. 以下 Integer 代码输出的结果是
Integer age 10;
Integer age2 10;
Integer age3 133;
Integer age4 133;
System.out.println((age age2) , (age3 age4));答true,false
2. 以下 Double 代码输出的结果是
Double num 10d;
Double num2 10d;
Double num3 133d;
Double num4 133d;
System.out.println((num num2) , (num3 num4));答false,false
3. 以下程序输出结果是
int i 100;
Integer j new Integer(100);
System.out.println(i j);
System.out.println(j.equals(i));Atrue,trueBtrue,falseCfalse,trueDfalse,false
答A
题目分析有人认为这和 Integer 高速缓存有关系但你发现把值改为 10000 结果也是 true,true这是因为 Integer 和 int 比较时会自动拆箱为 int 相当于两个 int 比较值一定是 true,true。
4. 以下程序执行的结果是
final int iMax Integer.MAX_VALUE;
System.out.println(iMax 1);A2147483648B-2147483648C程序报错D以上都不是答B题目解析这是因为整数在内存中使用的是补码的形式表示最高位是符号位 0 表示正数1 表示负数当执行 1 时最高位就变成了 1结果就成了 -2147483648。
5. 以下程序执行的结果是
SetShort set new HashSet();
for (short i 0; i 5; i) {set.add(i);set.remove(i - 1);
}
System.out.println(set.size());A1B0C5D以上都不是
答5
题目解析Short 类型 -1 之后转换成了 Int 类型remove() 的时候在集合中找不到 Int 类型的数据所以就没有删除任何元素执行的结果就是 5。
6. short s2;ss1; 会报错吗short s2;s1; 会报错吗
答ss1 会报错s1 不会报错因为 ss1 会导致 short 类型升级为 int 类型所以会报错而 s1 还是原来的 short 类型所以不会报错。
7. float f3.4; 会报错吗为什么
答会报错因为值 3.4 是 double 类型float 类型级别小于 double 类型所以会报错。如下图所示 8. 为什么需要包装类
答需要包装类的原因有两个。
① Java 的设计思想是万物既对象包装类体现了面向对象的设计理念② 包装类包含了很多属性和方法比基础数据类型功能多比如提供的获取哈希值hashCode或获取类getClass的方法等。
9. 基础类 int 和包装类 Integer在 -128~127 之间都会复用已有的缓存对象这种说法正确吗
答不正确只有包装类高频区域数据才有缓存。
10. 包装类 Double 和 Integer 一样都有高频区域数据缓存这种说法正确吗
答不正确基础数据类型的包装类只有 Double 和 Float 没有高频区域的缓存。
11. 包装类的值比较要使用什么方法
答包装类因为有高频区域数据缓存所以推荐使用 equals() 方法进行值比较。
12. 包装类有哪些功能
答包装类提供的功能有以下几个。
功能丰富包装类包含了有 hashCode、getClass 、max、min 等方法可定义泛型类型参数例如 ListInteger list new ArrayList(); ;序列化包装类实现了 Serializable 接口所以包装类天然支持序列化和反序列化类型转换包装类提供了方便的类型转换方法比如 Integer 的 parseInt() 方法高频区域数据缓存高频区域可使用已有的缓存对象。
详见正文“包装类型”部分内容。
13. 泛型可以为基础类型吗为什么
答泛型不能使用基础数据类型。泛型在 JVMJava虚拟机编译的时候会类型檫除比如代码 ListInteger list 在 JVM 编译的时候会转换为 List list 因为泛型是在 JDK 5 时提供的而 JVM 的类型檫除是为了兼容以前代码的一个折中方案类型檫除之后就变成了 Object而 Object 不能存储基础数据类型但可以使用基础数据类型对应的包装类所以像 Listint list 这样的代码是不被允许的编译器阶段会检查报错而 ListInteger list 是被允许的。
14. 选择包装类还是基础类的原则有哪些
答我们知道正确的使用包装类可以提供程序的执行效率可以使用已有的缓存一般情况下选择基本数据类型还是包装类原则有以下几个。
① 所有 POJO 类属性必须使用包装类② RPC 方法返回值和参数必须使用包装类③ 所有局部变量推荐使用基础数据类型。
15. 基础数据类型在 JVM 中一定存储在栈中吗为什么
答基础数据类型不一定存储在栈中因为基础类型的存储位置取决于声明的作用域来看具体的解释。
当基础数据类型为局部变量的时候比如在方法中声明的变量则存放在方法栈中的当方法结束系统会释放方法栈在该方法中的变量也会随着栈的销毁而结束这也是局部变量只能在方法中使用的原因当基础数据类型为全局变量的时候比如类中的声明的变量则存储在堆上因为全局变量不会随着某个方法的执行结束而销毁。
16. 以下程序执行的结果是
Integer i1 new Integer(10);
Integer i2 new Integer(10);
Integer i3 Integer.valueOf(10);
Integer i4 Integer.valueOf(10);
System.out.println(i1 i2);
System.out.println(i2 i3);
System.out.println(i3 i4);Afalse,false,falseBfalse,false,trueCfalse,true,trueDtrue,false,false
答B
题目解析new Integer(10) 每次都会创建一个新对象Integer.valueOf(10) 则会使用缓存池中的对象。
17. 3*0.10.3 返回值是多少
答返回值为false。
题目解析因为有些浮点数不能完全精确的表示出来如下代码 System.out.println(3 * 0.1); 返回的结果是0.30000000000000004。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930187.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!