java使用反射机制实例化对象类、volatile和synchronized的区别、JAVA-String字符串的简单处理

104 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

 我们正常初始化如User user=new User(),这样的方式为正射,那么有时候无法使用正常的方式进行初始化,就可以用反射的方式。

反射由于对系统的资源占用较大,所以在能不使用就不使用。

例子:

首先创建一个对象类User

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {

    private int id;
    private int age;
    private String name;


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

然后创建一个类用反射的方式进行

var user = Class.forName("cn.chenxiejia.User");
            //user.setName("张三");
            var setage = user.getMethod("setAge", int.class);
            var setid = user.getMethod("setId", int.class);
            var setname = user.getMethod("setName", String.class);//获取setName方法
            //new User();实例化一个对象
            var co = user.getConstructor();
            var o = co.newInstance();
            //传入参数
            setage.invoke(o, 18);
            setname.invoke(o, "张三");
            setid.invoke(o, 1);
            System.out.println(o);

结果如图:

​编辑

 
volatilesynchronized对数值进行操作时,可以保证数据的正确性,但后者速度更快

代码如下:

public class T7 {
    volatile static int num = 0;
    static CountDownLatch latch = new CountDownLatch(100);
    //volatile线程可见
    static volatile AtomicInteger a = new AtomicInteger();

    public static void main(String[] args) {
        var s = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            T7 tt = new T7();
            new Thread(T7::ss, "T" + i).start();
        }
        //new Thread(T7::s1).start();
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(System.currentTimeMillis() - s);
    }

    static void s1() {
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(a);
    }

    synchronized static void ss1() {
        for (int i = 0; i < 1000; i++) {
            num++;
        }
        latch.countDown();
    }

    static void ss() {
        for (int i = 0; i < 1000; i++) {
            a.incrementAndGet();
        }
        latch.countDown();
    }


}

\

 在java学习过程中经常要在一堆字符串中查找一些指定的字符串,这时候就要用到indexof方法了

以下是一些常用的用法。

1、indexof(String s)

s为要搜索的字符串,如果查找到了就返回第一个匹配到的索引位置,如果没有匹配到就返回-1

String str = "ljavadfjsdfhgjjfsjavajfdsj";
        System.out.println(str.indexOf("java"));

2、indexof(String s,int n)

s为要搜索的字符串,n为开始索引的位置,如果没有匹配到就返回-1

3、lastIndexof(String s)

返回最后一个指定字符串匹配到的位置,没有就返回-1

4、startWith(String s)

判断字符串是否以指定的字符串开头,返回类型为boolean类型

5、endsWith(String s)

判断字符串是否以指定的字符串结尾,返回类型为boolean类型

6、trim()

用于删除字符串首尾的空格

7、split(String s)

根据指定字符串分割原字符串,结果返回一个数组

8、subString(int n)

用于分割字符串,结果返回一个新的字符串,此字符串可与indexof配合分割字符串

9、contains(String s)

查找字符串中是否包含s,结果返回boolean类型

String str = "ljavadfjsdfhgjjfsjavajfdsj";
        System.out.println(str.indexOf("java"));//1
        System.out.println(str.indexOf("java", 10));//17
        System.out.println(str.lastIndexOf("java"));
        System.out.println(str.startsWith("java"));//false
        System.out.println(str.endsWith("java"));//false

        System.out.println("  Hello world   ".trim());
        String ss = "java,php,c,pyhon,html";
        String[] s1 = ss.split(",");
        for (String s : s1) {
            System.out.println(s);
        }
        //截取第一个java开始到最后一个java之前的字符串
        String s2 = str.substring(str.indexOf("java"), str.lastIndexOf("java"));
        System.out.println(s2);

\

​ ​