持续创作,加速成长!这是我参与「掘金日新计划 · 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);
结果如图:
编辑
volatile与synchronized对数值进行操作时,可以保证数据的正确性,但后者速度更快
代码如下:
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);
\