Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.4基本类型与运算(4.4.5-4.4.10)_LiReader的博客-程序员宝宝

技术标签: 程序员  面试  语言  java  

4.4.5强制类型转换的注意事项有哪些

Java语言在涉及byte、short和char类型的运算时,首先会把这些类型的变量值强制转换为int类型,然后对int类型的值进行计算,最后得到的结果也是int类型。因此,如果把这两个short类型的值相加,最后得到的结果是int类型;如果把两个byte类型相加,最后得到的也是一个int类型的值。如果需要得到short类型的结果,就必须显示的把运算结果转换为short类型。
例如对于语句:short s1 = 1;s1 = s1 +1,由于在进行加法运算时,等号右边的s1会先被转换为int类型,因此s1+1的结果是int类型,可是等号左边的s1是short类型,编译器会报错,需要强制转换。所以正确的写法是:short s1=1;s1=(short)(s1+1)。
有一种例外情况,“+=”为Java语言规定的运算法,Java编译器会对其进行特殊处理,因此short s1=1;s1+=1能够编译通过。

4.4.6运算符的优先级是什么

Java语言中有许多运算符,由于运算符优先级的问题经常会导致程序出现意想不到的结果,运算符优先级如下图:
这里写图片描述
在实际使用过程中如果不确定优先级,最好使用括号运算符来控制运算顺序。
例如在: 5 >>2+10>>2式子中,由于“+”的优先级高于“>>”,所以等价于:5>>(2+10)>>2即5>>12>>2,所以结果为0.

4.4.7Math类中的round、ceil和floor方法的功能各是什么

round、ceil和floor方法位于Math类中,Math是一个包含了许多数学常量与计算方法的类,位于java.lang包下,能自动导入,而且Math类里边的方法全是静态方法。下面重点介绍这三个方法代表的含义。
1>round方法表示四舍五入。round,意为“环绕”,实现原理是在原来的数字基础上先增加0.5然后再向下取整,等同于(int)Math.floor(x+0.5f)。它的返回值类型为int类型,例如,Math.round(1.4)=1,Math.round(-1.4)=-1。
2>ceil方法的功能是向上取整。ceil,意为“天花板”,顾名思义是对操作数取顶,Math.ceil(a),就是取大于a的最小的整数值。需要注意的是,它的返回值类型并不是int型,而是double型。若a是正数,则把小数“入”,若a是负数,则把小数“舍”。例如,Math.ceil(1.4)=2.0,Math.ceil(-1.4)=-1.0
3>floor方法的功能是向下取整。floor,以为“地板”,顾名思义是对操作数取底。Math.floor(a),就是取小于a的最大的整数值,它的返回值类型与ceil方法一样,也是double型。若a是正数,则把小数“舍”;若a是负数,则把小数“入”。例如,Math.floor(1.4)=1.0,Math.floor(-1.4)=-2.0。

4.4.8++i与i++有什么区别

在编程时,经常会遇到变量的自增、自减操作,尤其在循环中用的最多。以自增为例,有两种自增方式:前置和后置,即++i和i++,他们的不同点在于i++是在程序执行完毕后进行自增,而++i是在程序开始执行前进行自增。
示例如下:

public class Test {

    public static void main(String[] args){
        int i=1;
        System.out.println(i+++i++);
        System.out.println("i="+i);
        System.out.println(i++ + ++i);
        System.out.println("i="+i);
        System.out.println(i+++i+++i++);
        System.out.println("i="+i);
    }


}

运行结果:
3
i=3
8
i=5
18
i=8

这里只要注意到如果有int a=i++;那么a是i原先的值,而在这句代码执行完毕之后,i就增加了1;如果有int b=++i;那么b就是对i加1之后的值,而在这句代码执行完毕之后,i也增加了1。

看一道面试题:假设x=1,y=2,z=3,则表达式y+=z–/++x的值是多少?
分析:在表达式中z– = 3,++x=2,那么就是3/2=1.5,但是这里是int类型的操作,那么就会对结果只取整数部分所以表达式为y+=1,也就是3。

4.4.9 如何实现无符号数的右移操作

Java提供了两种右移运算符:“>>”和“>>>”。其中,“>>”被称为有符号右移运算,“>>>”被称为无符号右移运算符,他们的功能是将参与运算的对象对应的二进制数右移指定的位数。二者的不同点在于“>>”在执行右移操作时,若参与运算的数字为正数,则在高位补0;若为负数,则在高位补1。而“>>>”则不同,无论参与运算的数字为正数或为负数,在执行运算时,都会在高位补0。
此外,需要特别注意的是。在对char、byte、short类型的数进行位移操作前,和其他的运算操作一样,编译器都会自动的将数值转化为Int类型,然后进行操作。由于int型变量只占4Byte,因此当右移的位数超过32bit时,位移运算没有任何意义。所以,在Java中,为了保证位移位数的有效性,以使右移的位数不超过32bit,采用了取余的操作,即,使a>>n等价于a>>(n%32)
示例如下:

public class TestBitMove {

    public static void main(String[] args)
    {
        int i=-4;
        System.out.println("--------int>>:"+i);
        System.out.println("位移前二进制:"+Integer.toBinaryString(i));
        i >>= 1;
        System.out.println("位移后二进制:"+Integer.toBinaryString(i));
        System.out.println("--------int>>:"+i);
        System.out.println("");

        i=-4;
        System.out.println("--------int>>>:"+i);
        System.out.println("位移前二进制:"+Integer.toBinaryString(i));
        i >>>= 1;
        System.out.println("位移后二进制:"+Integer.toBinaryString(i));
        System.out.println("--------int>>>:"+i);
        System.out.println("");

        short j=-4;
        System.out.println("--------short>>:"+j);
        System.out.println("位移前二进制:"+Integer.toBinaryString(j));
        j >>= 1;
        System.out.println("位移后二进制:"+Integer.toBinaryString(j));
        System.out.println("--------short>>:"+j);
        System.out.println("");

        i=5;
        System.out.println("--------int>>>:"+i);
        System.out.println("位移前二进制:"+Integer.toBinaryString(i));
        i >>>= 32;
        System.out.println("位移后二进制:"+Integer.toBinaryString(i));
        System.out.println("--------int>>>:"+i);
        System.out.println("");
    }
}

--------int>>:-4
位移前二进制:11111111111111111111111111111100
位移后二进制:11111111111111111111111111111110
--------int>>:-2

--------int>>>:-4
位移前二进制:11111111111111111111111111111100
位移后二进制:1111111111111111111111111111110
--------int>>>:2147483646

--------short>>:-4
位移前二进制:11111111111111111111111111111100
位移后二进制:11111111111111111111111111111110
--------short>>:-2

--------int>>>:5
位移前二进制:101
位移后二进制:101
--------int>>>:5

引申:“<<”运算符与“>>”运算符有什么异同?
“<<”运算符表示左移,左移n位表示原来的值乘2的n次方,经常用来代替乘法操作,例如,一个数m乘以16表示将这个数左移4位(m << 4),由于CPU直接支持位运算,所以位运算比乘法效率高。
与右移不同,左移运算没有有符号和无符号之分,左移时,移出高位的同时在低位补0。
与右移运算符相同的是,当进行左移运算时,如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模,例如左移33位,其实只移动了33 % 32=1位。

4.4.10char型变量中是否可以存储一个中文汉字

在Java语言中,默认使用Unicode编码,即每个字符占用两个字节,因此可以用来存储中文。虽然String是由char所组成的,但是它采用了一种更加灵活的方式来存储,即英文占用一个字符,中文占用两个字符,采用这种存储方式的一个重要作用就是可以减少品所需的存储空间,提高效率。

public class TestChar {

    public static void getLen(String str)
    {
        System.out.println(str+"的长度:"+str.length()+"所占字节数"+str.getBytes().length);
    }

    public static void main(String[] args)
    {
        String s1="Hello";
        String s2="你好";
        getLen(s1);
        getLen(s2);

    }
}

运行结果:
Hello的长度:5所占字节数5
你好的长度:2所占字节数6

在上例中:“Hello”是英文字符,因此所占字节数和字符串长度相同。“你好”字符串长度为2,由于每个字符都占用两个字节,因此总的字节数为4.此方法可用来判断是否包含中文字符。
示例如下:

/**
 * java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher 
 * Pattern :
 * 一个Pattern是一个正则表达式经编译后的表现模式。
 * Matcher :
 * 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 
 * 
 */
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestChar {
    

    public static void judgeChineseCharactor(String str){

        /**
         * \u4e00-\u9fa5 代表Unicode编码表中的所有汉字的范围
         * [] 代表里面的值出现一个就可以
         * 
         * 所以表达式的意思就是匹配一个或以上的汉字
         */
        String regEx = "[\u4e00-\u9fa5]";

        //判断是否存在中文字符
        if(str.getBytes().length == str.length()){
            System.out.println("无汉字");
        }else{
   //如果有汉字,找出中文字符

             //首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,
            Pattern p = Pattern.compile(regEx);
            //然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
            Matcher m = p.matcher(str);
            while(m.find()){
                System.out.print(m.group(0)+"");
            }
        }

    }

    public static void main(String[] args){
        judgeChineseCharactor("Hello World");
        judgeChineseCharactor("Hello 你好");
    }
}

运行结果:
无汉字
你好
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28814687/article/details/73477889

智能推荐

Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 - JavaWeb_ClearlightY的博客-程序员宝宝

JavaWeb项目, 打开主页的时候, 突然出现这个问题!!!出现原因index.jsp引入了不存在的页面.&lt;jsp:include page="components/foot.jsp"&gt;&lt;/jsp:include&gt;我在移动js文件的时候, 手残竟然把foot.jsp也移走了…解决方法你在把foot.jsp移回到原来的位置就好了.当然,如果你本身就不存在...

vue+nuxtjs中使用swiper( vue-awesome-swiper)缩略图(双向控制)_nuxt thumbs:{}_前端-勋染的博客-程序员宝宝

效果npm安装 npm install [email protected] [email protected] --savemain.js全局安装import Vue from 'vue'import VueAwesomeSwiper from 'vue-awesome-swiper'import 'swiper/dist/css/swiper.css'Vue.use(VueAwesomeSwiper)组件里调用import { Swiper, SwiperSlide } fro

(精) 计算机网络笔记:第三章——数据链路层_Masics丶的博客-程序员宝宝

参考:https://blog.csdn.net/smart_ferry/article/details/84952341?depth_1-utm_source=distribute.pc_relevant.none-task&amp;utm_source=distribute.pc_relevant.none-task《王道计算机网络考研复习指导 2021年》由NEU 2018级...

Element-UI table的高度动态自适应 !_element table 动态高度_Masics丶的博客-程序员宝宝

从官方文档,我们可以知道 table 想要设置高度,就必须在 table里面设置高度但是,如果你只输入一个固定的值,那么table的高度就会固定死,达不到我们想要的动态的效果因此,我们可以这样做在height中 使用 window.innerHeight,返回窗口的文档显示区的高度(这是一个动态值,随着我们浏览器大小会变化)。好了,到这里,小伙伴们是不是以为就结束了………才怪 !...

luogu 1471 方差 (线段树区间更新)__TCgogogo_的博客-程序员宝宝

题目背景滚粗了的HansBug在收拾旧数学书,然而他发现了什么奇妙的东西。 题目描述蒟蒻HansBug在一本数学书里面发现了一个神奇的数列,包含N个实数。他想算算这个数列的平均数和方差。 输入输出格式输入格式:第一行包含两个正整数N、M,分别表示数列中实数的个数和操作的个数。第二行包含N个实数,其中第i个实数表示数列的第i项。接下来M行,每行为一条操作,格式...

Angular CLI的那些“坑”_Ian-sheng的博客-程序员宝宝

在进行angular-cli项目迁移的时候,特别是项目比较复杂的时候,很容易掉坑。下面我就自己的实践经验总结一下自己在进行CLI迁移的时候掉过的一些坑1.Module build failed: Error: Angular Compiler was detected but it was an instance of the wrong class. This likely means yo...

随便推点

sap知识-MPS和MRP的区别_cml36113的博客-程序员宝宝

所谓MPS,就是指主生产计划,主要是对成品一级的需求安排计划。而MRP是指物料需求计划,针对主生产计划,根据BOM,展开所有材料的需求。MRP一般是由于MPS引起的,比如你有一个部件A MRP type=M0(MPS部件),它下...

python实战,中文自然语言处理,应用jieba库来统计文本词频_Python玩家的博客-程序员宝宝

模块介绍安装:pip install jieba 即可jieba库,主要用于中文文本内容的分词,它有3种分词方法:1. 精确模式, 试图将句子最精确地切开,适合文本分析:2. 全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;3. 搜索引擎模式,在精确模式的基础上,对长词再词切分,提高召回率,适合用于搜索引擎分词。我们用个小例子演示下...

try捕获SQL异常_weixin_30606669的博客-程序员宝宝

转载于:https://www.cnblogs.com/dianzan/p/10986687.html

css3 模糊渐变,css3实现背景色渐变linear-gradient()_牛岱的博客-程序员宝宝

示例代码:linear-gradient()_CSS参考手册_web前端开发参考手册系列div {width: 600px;height: 100px;margin-top: 10px;border: 1px solid #ddd;}.test {background: linear-gradient(#fff, #333);}.test2 {background: linear-gradient...

sa-token 路由拦截式鉴权_inferno.的博客-程序员宝宝

前言假设我们有如下需求:我们怎么实现呢?给每个接口加上鉴权注解?手写全局拦截器?似乎都不是非常方便。在这个需求中我们真正需要的是一种基于路由拦截的鉴权模式, 那么在sa-token怎么实现路由拦截鉴权呢?使用方式1、注册路由拦截器以 springboot2.0 为例, 新建配置类[email protected] class MySaTokenConfig implements WebMvcConfigurer { // 注册sa-to

考题篇(6.4) 10 ❀ 企业防火墙 ❀ Fortinet 网络安全架构师 NSE7_飞塔老梅子的博客-程序员宝宝

In which two states is a given session categorized as ephemeral? (Choose two.) 〖在哪个状态下,一个给定的会话被归类为短暂的?(选择两个)〗  A. A TCP session waiting to complete the three-way handshake.〖等待完成三次握手的TCP会话。〗  B. A TCP session waiting for FIN ACK.〖等待FIN ACK的TCP会话。〗 ...

推荐文章

热门文章

相关标签