大数据面试之java关键字(持续更新...)

一、native

一个方法被native修饰,那么说明该方法就不属于java体系,是由c/c++编写的,在java中被调用而已。java中专门一个规范来处理和底层操作系统的交互–JNI(java native interface)。

二、transient

英文单词意思是瞬时的、短暂的。一旦某个变量被transient所修饰,就意味着该变量不会被序列化。那么有什么用呢,实现了有选择的序列化!比如在客户端和服务端进行交互,支付过程需要将用户的敏感信息不序列化,以确保用户数据之安全,所以此时敏感信息就应该要使用transient修饰。

/**
 * java的持久化操作
 * 循环读取多个对象的时候报错:java.io.EOFException
 * End-Of-File,真实已经读取完毕了这个文件中的所有的内容,但是读取的程序没有停止,
 * 写对象到文件中的这种方式,默认没有结束的标志符,不想字节流的标识符-1.
 *
 * 解决方案如下:
 *  1、自定义文件结束标识符
 *  2、存储一个对象不就不会出现循环读取了吗
 *  spark rdd持久化策略MEMORY_ONLY_SER,理不理解序列化之后一个partition最后变成了一个字节数组。
 */
public class transientOps {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        writeFile();
        readFile();
    }

    public static void readFile() throws IOException, ClassNotFoundException {
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("data/transient.txt"));
        Object obj = ois.readObject();
        if(obj instanceof Person[]){
            Person[] ps = (Person[])obj;
            for (Person p:ps) {
                System.out.println(p);
            }
        }
        ois.close();
    }

    public static void writeFile() throws IOException {
        Person p1 = new Person("张三",22);
        Person p2 = new Person("李四",28);
        Person p3 = new Person("王五",23);
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("data/transient.txt")));
        Person[] ps = {p1,p2,p3};
        oos.writeObject(ps);

        oos.close();
    }
}

class Person implements Serializable{
    private String name;
    private transient Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

运行结果:
在这里插入图片描述

三、volatile

解决的问题,就是共享数据可见的问题,作用相当于一把轻量级的锁。
注意: volatile关键字只适用于原子性操作

?:
public class VolatileOps {
    public static void main(String[] args) throws InterruptedException {
        VolatileThread vt = new VolatileThread();

        Thread t = new Thread(vt);
        t.start();
        Thread.sleep(2000);
        vt.flag = true;//VolatileThread
    }
}

class VolatileThread implements Runnable {

    volatile boolean flag = false;
    @Override
    public void run() {
        while (!flag) ;
    }
}

四、Atomic

原子性操作,AtomicInteger、AtomicLong、AtomicBoolean等,底层没有使用锁,但是基于一个CAS算法实现了原子性操作。
常用方法:

getAndIncrement()      b++
getAndDecrement()      b--
incrementAndGet()      ++b
decrementAndGet()      --b
getAndAdd(int delta)    b+=delta
?:
import java.util.concurrent.atomic.AtomicInteger;

/**
 直接使用synchronized加锁会使效率变的很低
 */
public class AtomicOps {
    public static void main(String[] args) {
        AtomicThread at = new AtomicThread();
        for (int i=0;i<10;i++) {
            new Thread(at).start();
        }
    }
}

class AtomicThread implements Runnable{
    private AtomicInteger number = new AtomicInteger();
    @Override
    public void run() {
        try {
            Thread.sleep(200);
            System.out.println(number.getAndIncrement()); //number++
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值