1 Object类中toString方法: sout方法就是调用了toString方法,一般重写toString方法得到内容
2 Object类中equals方法 :
【Objects类方法】Objects.equals(a,b) 优化 判断是否相等空指针的问题【Object类方法】 a.equals(b)
3.public static <T> T requireNonNull(T obj):查看指定引用对象不是null。
等同于下面这代码,下次代码合法性判断就不用写下面这个方法,就直接用Objects.requireNonNull()非空判断
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
java.util.Date类 表示特定的瞬间,精确到毫秒。
public Date():分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。
public long getTime() 把日期对象转换成对应的时间毫秒值。
1.java.text.DateFormat 是日期/时间格式化子类的抽象类【不能直接使用,所以需要常用的子类java.text.SimpleDateFormat。】
完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。
2.java.text.SimpleDateFormat中的构造方法public SimpleDateFormat(String pattern)
参数pattern是一个字符串,代表日期时间的自定义格式。最常用: DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
3.DateFormat类的常用方法有:
public String format(Date date):将Date对象格式化为字符串。
public Date parse(String source):将字符串解析为Date对象。
代码参考day01【Object类、常用API】
1.Calendar为抽象类,而是通过静态方法创建,返回子类对象,如下:
Calendar静态方法
public static Calendar getInstance():使用默认时区和语言环境获得一个日历
常用方法
根据Calendar类的API文档,常用方法有:
public int get(int field):返回给定日历字段的值。
public void set(int field, int value):将给定的日历字段设置为给定值。
public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。
常用的方法有:
public static long currentTimeMillis():返回以毫秒为单位的当前时间。
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):
将数组中指定的数据拷贝到另一个数组中。
java.lang.StringBuilder
根据StringBuilder的API文档,
常用构造方法有2个:
public StringBuilder():构造一个空的StringBuilder容器。
public StringBuilder(String str):构造一个StringBuilder容器,并将字符串添加进去
StringBuilder常用的方法有2个:
public StringBuilder append(...):添加任意类型数据的字符串形式,并返回当前对象自身。
public String toString():将当前StringBuilder对象转换为String对象。
public StringBuilder reverse() 将内容进行反转
1.由来:基本数据类型使用起来很方便,但是没有对应的方法操作这些数据,
所以我们用这个类,把基本数据类型包装起来,这个类叫做包装类。
包装类中定义一些方法,用来操作基本数据类型的数据。
2. 装箱:把基本类型的数据,包装到包装类中(基本类型的数据->包装类)
构造方法:
Integer(int value) 构造一个新分配的 Integer 对象,它表示指定的 int 值。
Integer(String s) 构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。
传递的字符串,必须是基本类型的字符串,否则会抛出异常 "100" 正确 "a" 抛异常
静态方法:
static Integer valueOf(int i) 返回一个表示指定的 int 值的 Integer 实例。
static Integer valueOf(String s) 返回保存指定的 String 的值的 Integer 对象。
拆箱:在包装类中取出基本类型的数据(包装类->基本类型的数据)
成员方法:
int intValue() 以 int 类型返回该 Integer 的值。
3. 自动装箱与自动拆箱:基本类型的数据和包装类之间可以自动的相互转换
JDK1.5之后出现的新特性
4.1 基本类型与字符串类型之间的相互转换
基本类型->字符串(String)
1.基本类型的值+"" 最简单的方法(工作中常用)
2.包装类的静态方法toString(参数),不是Object类的toString() 重载
static String toString(int i) 返回一个表示指定整数的 String 对象。
3.String类的静态方法valueOf(参数)
static String valueOf(int i) 返回 int 参数的字符串表示形式。
4.2 字符串(String)->基本类型
使用包装类的静态方法parseXXX("字符串");
Integer类: static int parseInt(String s)
Double类: static double parseDouble(String s)
public Sring toString(int [] a) 将数组的内容已字符串的形式打印出来
public char[] toCharArray]() 将数组的内容已字符串的形式打印出来
public int length()获取长度
public char charAt(int index) 获取索引处的char值
1. 容器有集合和数组,集合存储不同类型的对象,数组存储同一类型的元素
2. 集合 :单列集合根接口Collection和双列集合根接口Map
3. 单列集合两个子接口:List(有序·可重复) (实现类:Arraylist和LinkedList,Vector集合继承List接口)
Set(无序·不重复)(实现类:HashSet和TreeSet,LinkedHashSet继承实现类HashSet)
4.双列集合根接口Map :


增
public boolean add(E e)`: 把给定的对象添加到当前集合中 。
删
public boolean remove(E e)`: 把给定的对象在当前集合中删除。
public void clear()` :清空集合中所有的元素。
查
public boolean contains(E e)`: 判断当前集合中是否包含给定的对象。
public boolean retainAll(Collection<?> c)`: 仅保留此 collection 中那些也包含在指定 collection 的元素
【保留两个集合的交集】
空
public boolean isEmpty()`: 判断当前集合是否为空。
等
public boolean equals(E e):比较此 collection 与指定对象是否相等
数
public int size()`: 返回集合中元素的个数。
public Object[] toArray()`: 把集合中的元素,存储到数组中。
其他可选用
增
public boolean addAll(Collection<? extends E>) 指定 collection 中的所有元素都添加到此
删
public boolean removeAll(Collection<? extends E>)`: 把给定的对象在当前集合中删除。
查
public boolean containsAll(Collect<?> e)`:collection 包含指定 collection 中的所有元素,则返回 true
含有泛型的类:
修饰符 class 类名<代表泛型的变量> { }
class ArrayList<E>{
public boolean add(E e){ }
public E get(int index){ }
....
}
定义格式:
修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
例如,使用格式:调用方法时,确定泛型的类型
public class MyGenericMethod {
public <E> void show(E e) {
System.out.println(mvp.getClass());
}
public <E> E show2(E e) {
return e;
}
}
格式 :修饰符 interface接口名<代表泛型的变量> { }
public interface MyGenericInterface<E>{
public abstract void add(E e);
public abstract E getE();
}
1、定义类时确定泛型的类型
public class MyImp1 implements MyGenericInterface<String> {
@Override
public void add(String e) {
// 省略...
}
@Override
public String getE() {
return null;
}
}
2、始终不确定泛型的类型,直到创建对象时,确定泛型的类型
public class MyImp2<E> implements MyGenericInterface<E> {
@Override
public void add(E e) {
// 省略...
}
@Override
public E getE() {
return null;
}
}
/*
* 使用
*/
public class GenericInterface {
public static void main(String[] args) {
MyImp2<String> my = new MyImp2<String>();
my.add("aa");
}
}
1.泛型的通配符的基本使用:不知道使用什么类型来接收的时候,此时可以使用?,?表示未知通配符。
比如下面的test(ArrayList<?> list)方法 ,同时接受String 和Integer类型 就用通配符来解决接受类型的问题。
public class GenericMethod {
public static void main(String[] args) {
ArrayList<String> stringlist = new ArrayList<>();
stringlist.add("Hello");
stringlist.add("Java");
ArrayList<Integer> integerlist =new ArrayList<>();
integerlist.add(1);
integerlist.add(2);
test(stringlist);
test(integerlist);
}
public static void test(ArrayList<?> list){
for (Object o : list) {
System.out.println(o);
}
}
}
2.通配符高级使用----受限泛型 【能看懂即可】
泛型的上限:
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类
泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection<? super Number> coll){}
1.栈 :弹夹,先进后出
2.队列:排队,先进先出
3.数组:在内存中开辟一段连续的空间
查找元素快:通过索引,可以快速访问指定位置的元素
增删元素慢:需要创建新数组开辟新内存,把原数组元素根据索引复制到新数组索引对应的位置
4.链表:一个节点由数据域和指针域组成
查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
增删快:只需要修改元素的指针域即可。
5.二叉树:是每个结点不超过2的有序树(tree) 。左子树小,右子树大
:红黑树:趋近平衡树,查找速度特别快
特点:存取有序,可重复,有索引
常用方法(继承Collection接口所有的方法,还有一些根据索引操作集合特有方法):
【特有的方法:】
public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
public E get(int index) :返回集合中指定位置的元素。
public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
1.ArrayList集合:元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayList 是最常用的集合。
2.LinkedList集合:实际开发中对一个集合元素的添加与删除经常涉及到首尾操作LinkedList提供了大量首尾操作的方法。
【LinkedList 特有方法 了解即可】
public void addFirst(E e) :将指定元素插入此列表的开头。
public void addLast(E e) :将指定元素添加到此列表的结尾。
public void push(E e) :将元素推入此列表所表示的堆栈。等同于 addFirst();
public E getFirst() :返回此列表的第一个元素。
public E getLast() :返回此列表的最后一个元素。
public E removeFirst() :移除并返回此列表的第一个元素。
public E removeLast() :移除并返回此列表的最后一个元素。
public E pop() :从此列表所表示的堆栈处弹出一个元素。相当于removeFirst()
public boolean isEmpty() :如果列表不包含元素,则返回true。
Vector 与 List 不同
List和Vector(都是接口),因为使用是的功能或者调用的方法都是差不多的,那么大家就会去找它们的区别。
1、List是在jdk1.2以后推出的,而Vector是在jdk1.0推出的
2、List采用的是异步处理方式,性能高,而Vector采用的是同步处理方式,性能低
3、List属于非线程安全,Vector属于线程安全
简单点说就是:
如果你需要考虑到性能高一点,快速一点,又不需要考虑线程,那么就用List,反之用Vector
特点:无序(存取顺序可能不一致),不重复
原理:用add()方法会调用元素的hashhode方法和equals方法,判断元素是否重复,
如果自定义类,必须重写hashCode方法和equals方法
1.HashSet 底层是一个哈希表,查询特别快
2.哈希表:1.8之前 哈希表 = 数组+链表 1.8之后 哈希表 = 数组 + 链表 (长度大于8 自动转换成红黑树),
数组存储对象的哈希值,对象的内容通过链表/红黑树连接一起
哈希值:一个十进制的整数,系统随机给对象的地址值,是模拟出逻辑地址,不是数据存储的实际物理地址
Object类有一个int hashCode()返回对象的哈希码值 ,toString()返回的是十六进制的,将十六进制转十进展就是哈希值。
4.LinkedHashSet:有序的不可重复

类型已知,传入参数个数不确定用可变参数定义,可变参数底层原理是数组
注意事项:1.只能有一个可变参数 举例1,
2.如果方法参数有多个,那么可变参数必须写在参数列表的末尾见 举例2
3.可变参数的终极写法 举例3
举例1.
public static void demo01 (int...arr){}
举例2.
public static void demo02 (String a,double c,int...arr){ }
举例3.
public static void demo03 (Object...objs){}
1.java.utils.Collections是集合工具类
用来对集合进行操作。部分方法如下:
public static <T> boolean addAll(Collection<T> c, T... elements):往集合中添加一些元素。
public static void shuffle(List<?> list) 打乱顺序:打乱集合顺序。
public static <T> void sort(List<T> list):将集合中元素按照默认规则排序。
public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
1.sort方法实现Comparable接口中的compareTo的方法,
如果要自定义类实现集合的排序,需要继承Comparable接口,重写compareTo方法。
2.
- java.utils.Collections是集合工具类,用来对集合进行操作。部分方法如下:
public static <T> void sort(List<T> list,Comparator<? super T> ):将集合中元素按照指定规则排序。
Comparator和Comparable的区别
Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
Comparator:相当于找一个第三方的裁判,比较两个,重写compareTo()方法
Comparator的排序规则:
o1-o2:升序
1.HashMap集合底层是哈希表:查询的速度特别的快
JDK1.8之前:数组+单向链表
JDK1.8之后:数组+单向链表|红黑树(链表的长度超过8):提高查询的速度
2.hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合
LinkedHashMap的特点:
1.LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的
public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
boolean containsKey(Object key) 判断集合中是否包含指定的键。
public Set<K> keySet(): 获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。
java.util.Hashtable<K,V>集合 implements Map<K,V>接口
Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快
HashMap集合(之前学的所有的集合):可以存储null值,null键
Hashtable集合,不能存储null值,null键
Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了
Hashtable的子类Properties依然活跃在历史舞台
Properties集合是一个唯一和IO流相结合的集合
Debug调试程序:
可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug
使用方式:
在行号的右边,鼠标左键单击,添加断点(每个方法的第一行,哪里有bug添加到哪里)
右键,选择Debug执行程序
程序就会停留在添加的第一个断点处
执行程序:
f8:逐行执行程序
f7:进入到方法中
shift+f8:跳出方法
f9:跳到下一个断点,如果没有下一个断点,那么就结束程序
ctrl+f2:退出debug模式,停止程序
Console:切换到控制台
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.
Java的Collections.unmodifiableList和Collections.unmodifiableMap在Ruby标准API中是否有等价物? 最佳答案 使用freeze应用程序接口(interface):Preventsfurthermodificationstoobj.ARuntimeErrorwillberaisedifmodificationisattempted.Thereisnowaytounfreezeafrozenobject.SeealsoObject#frozen?.Thismethodretur