Java &、&&、|、||、^、<<、>>、~、>>>等运算符

📅 2020-11-04 20:26 👁️ 1688 💬 0

&(按位与)

运算规则:两个为真才为真 (1&1=1 , 1&0=0 , 0&1=0 , 0&0=0)
例:3&5=1
3的二进制位是0000 0011,5的二进制位是0000 0101 ,那么就是011 & 101,由按位与运算规则得知,001 & 101等于0000 0001,最终值为1

&&(逻辑与)

运算规则:&&逻辑与也称为短路逻辑与,先运算&&左边的表达式,一旦为假,后续不管多少表达式,均不再计算,一个为真,再计算右边的表达式,两个为真才为真。

|(按位或)

运算规则:一个为真即为真(1|0 = 1 , 1|1 = 1 , 0|0 = 0 , 0|1 = 1)
例:6|2=6
6的二进制位0000 0110 , 2的二进制位0000 0010 , 110|010为110,最终值0000 0110,故6|2等于6

||(逻辑或)

运算规则:一个为真即为真,后续不再计算,一个为假再计算右边的表达式。

^(异或运算符)

运算规则:相同为0,不同为1 (1^0 = 1 , 1^1 = 0 , 0^1 = 1 , 0^0 = 0)
例 5^9=12
5的二进制位是0000 0101 , 9的二进制位是0000 1001,也就是0101 ^ 1001,结果为1100 , 00001100的十进制位是12

<<(左移运算符)

5<<2的意思为5的二进制位往左挪两位,右边补0,5的二进制位是0000 0101 , 就是把有效值101往左挪两位就是0001 0100 ,正数左边第一位补0,负数补1,等价于:result=num×2的n次方十进制位是20

>>(右移运算符)

5的二进制位是0000 0101,右移两位就是把101左移后为0000 0001,正数左边第一位补0,负数补1,等价于:result=num÷2的n次方,结果为1

~(取反运算符)

运算规则:将0变为1,1变为0
例:5的二进制位是0000 0101,取反后为1111 1010,值为-6

>>>(无符号右移运算符)

运算规则:
对于正数:无符号右移是高位补0,移多少位补多少个0
对于负数:正数的二进制,取反,再加1

阅读更多

Java中Vector、ArrayList、LinkedList的区别

📅 2020-11-04 16:36 👁️ 80 💬 0

首先VectorArrayListLinkedList都实现了List接口,List用于存放多个元素,能够维护元素的次序,并且允许元素重复,三个具体实现类的区别如下:

  1. ArrayList底层是通过数组实现的,能够对元素进行快速随机访问,当数组大小不满足存储能力时,需要将存在的数据复制到新的存储空间,默认的扩展是(oldCapacity * 3)/2 + 1即扩展50%+1,当从ArrayList中间插入或删除元素时,需要对数组进行复制和移动,导致插入删除速度慢,因此,它适合随机查找和遍历,不适合插入和删除。

  2. Vector底层也是数组实现的,但支持线程同步,访问速度比ArrayList慢,需要扩容时默认为扩展一倍

  3. LinkedList底层是链表结构存储数据的,插入删除速度快,但访问遍历速度较慢,占用空间大

阅读更多

Java Object 类常用方法总结

📅 2020-10-29 19:50 👁️ 141 💬 0

总结

public final native Class<?> getClass()    //返回此 Object 运行时的类
 
public native int hashCode()    //返回对象的哈希码
 
public boolean equals(Object obj)    //判断其他对象与此对象是否“相等”
 
protected native Object clone() throws CloneNotSupportedException    //创建并返回此对象的一个副本
 
public String toString()    //返回对象的字符串表示
 
public final native void notify()    //唤醒在此对象监视器上等待的单个线程
 
public final native void notifyAll()    //唤醒在此对象监视器上等待的所有线程
 
public final native void wait(long timeout) throws InterruptedException    //使当前对象的线程等待 timeout 时长
 
public final void wait(long timeout, int nanos) throws InterruptedException    //使当前对象的线程等待 timeout 时长,或其他线程中断当前线程
 
public final void wait() throws InterruptedException    //使当前对象的线程等待 
 
protected void finalize() throws Throwable {}    //垃圾回收时调用该方法
阅读更多

线程的sleep()方法和yield()方法有什么区别?

📅 2020-10-24 17:30 👁️ 355 💬 0

sleep()方法和yield()方法的区别:

  • sleep()方法给其他线程运行机会时,不考虑线程的优先级,因此会给低优先级的线程运行机会;yield()方法只会给相同优先级或更高优先级的线程运行机会

  • 线程执行sleep()方法后转入阻塞(blocked)状态;执行yield()方法后装入就绪(ready)状态

  • sleep()方法声明抛出InterruptedException;而yield()方法没有声明任何异常

  • sleep()比yield()(跟操作系统CPU调度相关)具有更好的可移植性

阅读更多

解释一下什么是线程池(thread pool)?

📅 2020-10-23 11:55 👁️ 260 💬 0

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这就是”池化资源”技术产生的原因。线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。

  • newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
  • newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
  • newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
  • newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。
阅读更多

Java基本数据类型

📅 2020-10-23 11:30 👁️ 75 💬 0

java 八种基本数据类型

基本数据类型 大小(字节) 默认值 封装类
byte 1 0 Byte
boolean 1 false Boolean
short 2 0 Short
char 2 \u0000(null) Char
int 4 0 Integer
float 4 0.0f Float
double 8 0.0d Double
long 8 0L Long

注:没有后缀的浮点数值(如3.14)默认为double类型

阅读更多

Java实例变量、局部变量、静态变量

📅 2020-10-22 22:48 👁️ 138 💬 0

实例变量(成员变量)

  • 成员变量定义在类中,在整个类中都可以被访问,但在方法、构造方法和语句块之外
  • 当一个对象被实例化之后,每个实例变量的值就跟着确定
  • 实例变量在对象创建的时候创建,在对象被销毁时销毁
  • 访问修饰符可以修饰实例变量

局部变量

  • 局部变量声明在方法、构造方法或者语句块中间
  • 局部变量在方法、构造方法、语句块执行时创建,当执行完成后,变量将被销毁
  • 访问修饰符不能用于局部变量
  • 局部变量只在声明它的方法、构造方法或语句块可见
  • 局部变量在栈上分配
  • 局部变量没有默认值,所以局部变量被声明后,必须经过初始化才可以使用

静态变量又称类变量:用static修饰

  • 静态成员变量在类装载的时候就进行了创建,在整个程序结束时按序销毁。
  • 存储在方法区中
  • 可以由类名或对象调用
阅读更多

Java子类继承父类的执行顺序

📅 2020-10-22 22:28 👁️ 96 💬 0
  1. 父类的静态代码块(static)
  2. 子类的静态代码块(static)
  3. 父类的非静态代码块(父类成员初始化)
  4. 父类的构造方法
  5. 子类的非静态代码块(子类成员初始化)
  6. 子类的构造方法
阅读更多
点击右上角即可分享
微信分享提示