java基础篇02-java基础

一、基本数据类型

1、 8中基本数据类型分三大类

    字符型

        char

    布尔型

        boolean

    数值型

        1、整型:byte、short、int、long

        2、浮点型:float、double

2、取值范围

1字节=8位(bit)范围是 -128(-2^7)到 127(2^7-1)

基本类型大小(字节)取值范围
byte1
-128(-2^7)到 127(2^7-1)
short2
-32,768 (-2^15)到 32,767 (2^15-1)
int4
-2,147,483,648 (-2^31)到 2,147,483,647 (2 ^31-1)
long8
-9,223,372,036,854,775,808 (-2^63) 到 9,223,372,036, 854,775,807 (2^63-1)
float4 
double
8 
boolean没有具体定义 
char2 

 

 

 

 

 

 

 

 

 

 

浮点数不能表示金额

在计算机中保存的小数其实是十进制的小数的近似值,并不是准确值。所以,一定不能再代码中使用浮点数来表示金额等重要的指标。

建议使用BigDecimal或者Long(单位为分)来表示金额

二、Java中的关键字

transient

      变量修饰符,在声明一个实例变量当对象存储时,它的值不需要维护。

      即:被transient修饰的成员变量,在序列化的时候其值会被忽略,在被反序列化后,transient变量的值被设为初始值,如int型的是0,对象型的是null.

volatile

    是一个变量修饰符,只能修饰变量,无法修饰方法和代码块等。被比喻成"轻量级的synchronized".

    用时只需要在声明一个可能被多线程同时访问的变量时,使用volatile修饰就可以了。如下:

a.缓存一致性协议:每个处理器都有自己的维护的缓存,当处理器要对这个数据进行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。

b.可见性:volatile提供了一个功能,被其修饰的变量在被修改后可以立即同步到主内存,被其修饰的变量在每次使用之前都从主内存刷新。因此,可以使用vloatile来保证线程操作时变量的可见性。

c.有序性:volatile可以禁止指令重排优化等,来保证代码执行的有序性。

d.原子性:指一个操作是不可中断的,要全部执行完成,要不就都不执行。但volatile不保证原子性.

有两种场景可以使用volatile代替 synchroniezd:(不需要保证原子性)

      a.运算结果并不依赖变量的当前值,或者能够确保只有单一的线程会修改变量的值。

      b.变量不需要与其他状态变量共同参与不变约束。

synchronized

       当我们想要保证一个共享资源在同一时间只被一个线程访问到时,我们可以在代码中使用synchronized关键字对类或对象加锁。

       对于同步方法,JVM采用 ACC_SYNCHRONIZED标记符来实现同步。对于同步代码块,JVM采用monitorenter、monitorexit两个指令来实现同步。

方法级同步:方法级同步是隐式的,同步方法的常量池中会有一个ACC_SYNCHRONIZED标志。当某个线程要访问某个方法的时候,会检查是否有 ACC_SYNCHRONIZED如果有设置,则需要先获得监视器锁,然后开始执行方法,方法执行之后再释

放监视器锁。这时如果其他线程来请求执行方法,会因为无法获得监视器锁而被阻断住。值得注意的是,如果在方法执行过程中,发生了异常,并且方法内部并没有处理该异常,那么在异常被抛到方法外面之前监视器锁会被自动释放。

代码块同步:同步代码块使用 monitorenter monitorexit 两个指令实现。可以把执行monitorenter 指令理解为加锁,执行 monitorexit 理解为释放锁。每个对象维护着一个记录着被锁次数的计数器。未被锁定的对象的该计数器为 0,当一个线程获得锁(执行

monitorenter)后,该计数器自增变为 1 ,当同一个线程再次获得该对象的锁的时候,计数器再次自增。当同一个线程释放锁(执行 monitorexit 指令)的时候,计数器再自减。当计数器为 0 的时候。锁将被释放,其他线程便可以获得锁。

原子性问题:线程是CPU调度的基本单位。CPU有时间片的概念,会根据不同的调度算法进行线程调度。当一个线程获得时间片之后开始执行,在时间片耗尽之后,就会失去CPU使用权。所以在多线程场景,由于时间片在线程间轮换,就会发生原子性问题。

a.原子性:通过monitorenter monitorexit ,可以保证synchronized修饰的代码在同一时间只能被一个线程访问,在锁未释放之前,无法被其他线程访问到。以此来保证方法和代码内的操作时原子性的。

b.可见性:对一个变量解锁之前,必须先把次变量同步回主存中,这样解锁后,后续线程就可以访问到被修改后的值。

c.有序性:synchronized并不能保证CPU的加载顺序,但是它能够保证单线程执行。在单线程中,排序如何对结果没有影响,因此说synchronized保证了线程的有序性。

final

修饰变量:一旦final变量被定义后,是无法进行修改的,它将是常量。

修饰方法:被final定义的方法,不能被覆盖。

修饰类:被final修饰的类,不能被继承。

static

   “静态”的意思,用来修饰成员变量和成员方法,也可以形成静态代码块。

静态变量:静态变量属于类变量,存在于内存中的方法区,可以通过“类名.变量名”的方式来调用。因为静态变量与所有的对象实例共享,因此他们不具线程安全性。

静态方法:同样属于类不属于实例。只能使用静态变量和调用静态方法。

静态代码块:只在类装载入内存时执行一次。常用于初始化类的静态变量,大多时候用于在类装载时候创建静态资源。

静态类:

const

   预留关键字,用法和final类似,不常。

三、String

一旦一个string对象在内存中被创建出来,就无法修改。如果需要修改,应使用StringBuffer或StringBuilder,否则会有大量时间浪费在垃圾回收上。

JDK 6 和 JDK 7 中 substring 的原理及区别

       JDK6中的substring中String类的三个成员变量:char value[]int offsetint count。他们分别用来存储真正的字符数组,数组的第一个位置索引以及字符串中包含的字符个数。这样存储导致的问题:如果有一个跟长很长的字符串,需要切割一小段。此时这个很长的字符串会一直被引用无法进行垃圾回收,从而导致内存泄漏。

       JDK7中的substring方法使用new String创建一个新字符串,避免老字符串的引用,从而解决内存泄漏问题。

字符串拼接的几种方式和区别

1、 “+” 拼接

     String使用 “+” 拼接,实际上是重新创建String对象的引用,如图所示:

   

    其内部实现原理是new StringBuilder之后通过append方法进行拼接

2、Concat拼接

      String wechat = "Hollis";
      String introduce = " 每日更新 Java 相关技术文章 ";
      String hollis = wechat.concat(",").concat(introduce);
      
     但是这种方式效率太慢,不建议使用

 

3、StringBuilder

      使用.append()拼接, 线程不安全

4、StringBuffer

     使用.append()拼接,线程安全

5、StringUtils.join

      主要是将数组和集合以某拼接符拼接到一起形成新的字符串,如:

      List<String>list=new LinkedList;

      list.add("Hello");

      list.ass("每日更新Java相关技术文章");

      String result=StringUtils.join(list);//类似 String.join(",",list)

      System.out.println(result);

     //结果:Hollis,每日更新 Java 相关技术文章

推荐:

      循环体内,字符串的连接方式,使用StringBuider的append方法进行扩展;

      如果不是循环体内,使用“+”拼接即可;

      并发场景中使用StringBuffer;

      数组拼接使用StringUtils.join。

 

 

 

 

   
 
 
     
 
 
 
 
 
 
   
 
 
 
 
 
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值