当前位置: 首页 > news >正文

做网站可以不写代码外贸用什么网站好

做网站可以不写代码,外贸用什么网站好,一套会员管理系统多少钱,国外扁平化风格网站文章目录 String 和 StringBuilder3.1 String基本用法3.2 String底层3.3 不可变性3.4 编码转换3.5 StringBuilder基本用法3.6 StringBuilder基本实现原理3.7 String的和运算符 String 和 StringBuilder 本文为书籍《Java编程的逻辑》1和《剑指Java#xff1a;核心原理与应用实… 文章目录 String 和 StringBuilder3.1 String基本用法3.2 String底层3.3 不可变性3.4 编码转换3.5 StringBuilder基本用法3.6 StringBuilder基本实现原理3.7 String的和运算符 String 和 StringBuilder 本文为书籍《Java编程的逻辑》1和《剑指Java核心原理与应用实践》2阅读笔记 3.1 String基本用法 可以通过常量定义String变量也可以通过new创建String变量还可以直接使用 和 ​运算符如 Testpublic void testNewString() {String newConstant constant string;String newConstructor new String(constructor new string);String addString newConstant newConstructor;assertTrue(constant string constructor new string.equals(addString));}String类包括很多方法以方便操作字符串比如 public boolean isEmpty() // 判断字符串是否为空 public int length() // 获取字符串长度 public String substring(int beginIndex) // 取子字符串 public String substring(int beginIndex, int endIndex) // 取子字符串 public int indexOf(int ch) // 查找字符返回第一个找到的索引位置没找到返回 -1 public int indexOf(String str) // 查找子串返回第一个找到的索引位置没找到返回 -1 public int lastIndexOf(int ch) // 从后面查找字符 public int lastIndexOf(String str) // 从后面查找子字符串 public boolean contains(CharSequence s) // 判断字符串中是否包含指定的字符序列 public boolean startsWith(String prefix) // 判断字符串是否以给定子字符串开头 public boolean endsWith(String suffix) // 判断字符串是否以给定子字符串结尾 public boolean equals(Object anObject) // 与其他字符串比较看内容是否相同 public boolean equalsIgnoreCase(String anotherString) // 忽略大小写比较是否相同 public int compareTo(String anotherString) // 比较字符串大小 public int compareToIgnoreCase(String str) // 忽略大小写比较 public String toUpperCase() // 所有字符转换为大写字符返回新字符串原字符串不变 public String toLowerCase() // 所有字符转换为小写字符返回新字符串原字符串不变 public String concat(String str) // 字符串连接返回当前字符串和参数字符串合并结果 public String replace(char oldChar, char newChar) // 字符串替换替换单个字符 public String replace(CharSequence target, CharSequence replacement) // 字符串替换替换字符序列返回新字符串原字符串不变 public String trim() // 删掉开头和结尾的空格返回新字符串原字符串不变 public String[] split(String regex) // 分隔字符串返回分隔后的子字符串数组3.2 String底层 String类内部用一个字符数组表示字符串实例变量定义为 private final char value[];String中的大部分方法内部也都是操作的这个字符数组。比如 length()方法返回的是这个数组的长度。substring()方法是根据参数调用构造方法String(char value[], int offset, int count)新建了一个字符串。indexOf()方法查找字符或子字符串时是在这个数组中进行查找。 String中还有一些方法与这个char数组有关 public char charAt(int index) // 返回指定索引位置的 char public char[] toCharArray() // 返回字符串对应的 char 数组 注意返回的是一个复制后的数组而不是原数组 public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) // 将 char 数组中指定范围的字符复制入目标数组指定位置与Character类似String也提供了一些方法按代码点对字符串进行处理 public int codePointAt(int index) public int codePointBefore(int index) public int codePointCount(int beginIndex, int endIndex) public int offsetByCodePoints(int index, int codePointOffset)3.3 不可变性 与包装类类似String类也是不可变类即对象一旦创建就没有办法修改了。String类也声明为了final不能被继承内部char数组value也是final的初始化后就不能再变了。String类中提供了很多看似修改的方法其实是通过创建新的String对象来实现的原来的String对象不会被修改。比如concat()方法的代码 public String concat(String str) {int otherLen str.length();if(otherLen 0) {return this;}int len value.length;char buf[] Arrays.copyOf(value, len otherLen);str.getChars(buf, len);return new String(buf, true);}通过Arrays.copyOf方法创建了一块新的字符数组复制原内容然后通过new创建了一个新的String最后一行调用的是String的另一个构造方法。 因为字符串的不可变性JVM专门为字符串提供了一个常量池凡是放在常量池中的字符串对象都可以共享查看下面的代码 Testpublic void testConstantPool() {String name1 测试字符串常量池;String name2 测试字符串常量池;assertTrue(name1 name2);}Testpublic void testNotConstantPool() {String name1 new String(测试字符串常量池);String name2 new String(测试字符串常量池);assertFalse(name1 name2);}看上面代码通过常量定义name1 name2得到的是true但是通过new得到的字符串得到的结果是false。那么现在有一个问题哪些方式是使用常量池中的数据呢哪些是新建放在堆中的呢 直接使用...得到的字符串对象放在常量池。直接......拼接的字符串对象放在常量池。两个指向...的final常量拼接结果放在常量池。所有字符串对象.intern()方法得到的结果放在常量池。除以上四种方式其他方式得到的字符串结果都在堆中。 Testpublic void testCreateConstantPool() {String s1 helloworld; // 1、常量池中String s2 hello world; // 2、常量池中final String s3 hello;final String s4 world;String s5 s3 s4; // 3、指向...的 final 常量 指向...的 final 常量在常量池String s6 new String(hello);String s7 new String(world);String s8 s6 s7;String s9 s8.intern();// 4、字符串对象.intern() 的结果都在常量池assertTrue(s1 s2 s1 s5 s1 s9);String s10 hello;String s11 world;String s12 s10 s11;assertFalse(s1 s12);String s13 s10 world;assertFalse(s1 s13);String s14 s6 world;assertFalse(s1 s14);String s15 String.valueOf(new char[] { h, e, l, l, o, w, o, r, l, d });assertFalse(s1 s15);String s16 hello.concat(world);assertFalse(s1 s16);}3.4 编码转换 String内部是按UTF-16BE处理字符的对BMP字符使用一个char两个字节对于增补字符使用两个char四个字节。我们知道有各种编码不同编码可能用于不同的字符集使用不同的字节数目以及不同的二进制表示。如何处理这些不同的编码呢这些编码与Java内部表示之间如何相互转换呢Java使用Charset类表示各种编码它有两个常用静态方法 public static Charset defaultCharset() public static Charset forName(String charsetName)第一个方法返回系统的默认编码第二个方法返回给定编码名称的Charset对象其charset名称可以是US-ASCII、ISO-8859-1、windows-1252、GB2312、GBK、GB18030、Big5、UTF-8等比如 Charset charset Charset.forName(GB18030);String类提供了如下方法返回字符串按给定编码的字节表示 public byte[] getBytes() public byte[] getBytes(String charsetName) public byte[] getBytes(Charset charset)第一个方法没有编码参数使用系统默认编码第二个方法参数为编码名称第三个方法参数为Charset。 String类有如下构造方法可以根据字节和编码创建字符串也就是说根据给定编码的字节表示创建Java的内部表示。 public String(byte bytes[], int offset, int length, String charsetName) public String(byte bytes[], Charset charset)3.5 StringBuilder基本用法 如果字符串修改操作比较频繁应该采用StringBuilder和StringBuffer类这两个类的方法基本是完全一样的它们的实现代码也几乎一样唯一的不同就在于StringBuffer类是线程安全的而StringBuilder类不是。 StringBuilder的基本用法很简单。使用new创建StringBuilder对象通过append方法添加字符串然后通过toString方法获取构建后的字符串 Testpublic void testStringBuilder() {StringBuilder stringBuilder new StringBuilder();stringBuilder.append(hello);stringBuilder.append(world);assertFalse(helloworld stringBuilder.toString());assertTrue(helloworld.equals(stringBuilder.toString()));}3.6 StringBuilder基本实现原理 StringBuilder类是怎么实现的呢我们来看下它的内部组成以及一些主要方法的实现代码基于Java 7。与String类似StringBuilder类也封装了一个字符数组定义如下 char[] value;与String不同它不是final的可以修改。另外与String不同字符数组中不一定所有位置都已经被使用它有一个实例变量表示数组中已经使用的字符个数定义如下 /*** The count is the number of characters used.*/ int count;StringBuilder继承自AbstractStringBuilder它的默认构造方法是 public StringBuilder() {super(16);}调用父类的构造方法父类对应的构造方法是 AbstractStringBuilder(int capacity) {value new char[capacity]; }也就是说new StringBuilder()代码内部会创建一个长度为 16 16 16的字符数组count的默认值为 0 0 0。来看append方法的代码 public AbstractStringBuilder append(String str) {if(str null) str null;int len str.length();ensureCapacityInternal(count len);str.getChars(0, len, value, count);count len;return this; }append会直接复制字符到内部的字符数组中如果字符数组长度不够会进行扩展实际使用的长度用count体现。具体来说ensureCapacityInternal(countlen)会确保数组的长度足以容纳新添加的字符str.getChars会复制新添加的字符到字符数组中countlen会增加实际使用的长度。 ensureCapacityInternal的代码如下 private void ensureCapacityInternal(int minimumCapacity) {//overflow-conscious codeif(minimumCapacity - value.length 0)expandCapacity(minimumCapacity); }如果字符数组的长度小于需要的长度则调用expandCapacity进行扩展其代码为 void expandCapacity(int minimumCapacity) {int newCapacity value.length * 2 2;if(newCapacity - minimumCapacity 0)newCapacity minimumCapacity;if(newCapacity 0) {if (minimumCapacity 0) //overflowthrow new OutOfMemoryError();newCapacity Integer.MAX_VALUE;}value Arrays.copyOf(value, newCapacity); }扩展的逻辑是分配一个足够长度的新数组然后将原内容复制到这个新数组中最后让内部的字符数组指向这个新数组。这里主要看下newCapacity是怎么算出来的。参数minimumCapacity表示需要的最小长度需要多少分配多少不就行了吗不行因为那就跟String一样了每append一次都会进行一次内存分配效率低下。这里的扩展策略是跟当前长度相关的当前长度乘以 2 2 2再加上 2 2 2如果这个长度不够最小需要的长度才用minimumCapacity。比如默认长度为 16 16 16长度不够时会先扩展到 16 ∗ 2 2 16*22 16∗22即 34 34 34然后扩展到 34 ∗ 2 2 34*22 34∗22即 70 70 70然后是 70 ∗ 2 2 70*22 70∗22即 142 142 142这是一种指数扩展策略。为什么要加 2 2 2这样在原长度为 0 0 0​时也可以一样工作。 除了append和toString方法 StringBuilder还有很多其他方法包括更多构造方法、更多append方法、插入、删除、替换、翻转、长度有关的方法。 3.7 String的和运算符 Java中String可以直接使用 和 运算符这是Java编译器提供的支持背后Java编译器一般会生成StringBuilder和操作会转换为append。比如如下代码 String hello hello; for(int i0; i3; i){hello, world; } System.out.println(hello);背后Java编译器一般会转换为 String hello hello; for(int i0; i3; i){StringBuilder sb new StringBuilder(hello);sb.append(, world);hello sb.toString(); } System.out.println(hello);既然直接使用 和 就相当于使用StringBuilder和append那还有什么必要直接使用StringBuilder呢在简单的情况下确实没必要。不过在稍微复杂的情况下Java编译器可能没有那么智能它可能会生成过多的StringBuilder尤其是在有循环的情况下在循环内部每一次 操作都会生成一个StringBuilder。所以对于简单的情况可以直接使用String的 和 ​对于复杂的情况尤其是有循环的时候应该直接使用StringBuilder。 马俊昌.Java编程的逻辑[M].北京:机械工业出版社,2018. ↩︎ 尚硅谷教育.剑指Java核心原理与应用实践[M].北京:电子工业出版社,2023. ↩︎
http://www.zqtcl.cn/news/126466/

相关文章:

  • 做网站需要用什么技术制作静态网站制作
  • drupal网站开发盐城网站建设费用
  • 采票网站刷流水做任务网站建设方案及预算
  • 传奇网站模块下载天蝎做网站建网站
  • 收录网站的二级域名wordpress虚拟币接口
  • 论坛建站烟台工程建设信息网站
  • 南京有哪些做网站的公司网站开发兼职团队
  • 网站建设优化外包免费客户管理软件哪个好用
  • 网上购物最便宜的网站微信官方网站服务中心
  • 充电网站建设方案个体工商户查询
  • 所有网站302跳转百度wordpress最大上传2g
  • 南京网站制作网页seo推广百度百科
  • 陵水网站建设哪家好建设培训考试服务网站
  • h5视频网站模板中国十大企业培训机构排名
  • 强的网站建设明细报价表网站建设推广新业务
  • 哪里有免费做网站wordpress 在文章前面加序号
  • 263企业邮箱登录入口首页seo公司哪家
  • 哈尔滨建设银行网站岳阳建设网站
  • 中山网页网站设计模板自己做的网站怎么让别人看见
  • 建设装饰网站出口跨境电商平台
  • 陕西网站建设公司排名WordPress图片生成文章
  • t恤定制网站wordpress 分类 seo
  • 万网网站空间多少钱一年做哪些网站流量最大
  • seo网站优化服务网站开发电脑
  • 宿迁怎样建设网站wordpress 分类目录 标签
  • 惠州双语网站建设费用seo搜索工具栏
  • 做ppt会去什么网站找图网页制作与网站建设试题
  • 如何用ai给网站做logo宝安网站制作公司
  • sem是什么职业岗位单页式网站 seo
  • 做网站用什么版本系统国外有哪些设计网站推荐